I've been looking around for some way to either code up links using bbcode or manually convert a url in a specified message to a link. BBCodes to me are just getting a little old. Although, are still massively heavily used for such things as smileys etc.
I'd be looking to probably do a mixture of the two functionalities.
Can anyone advise on something they use or have used recently for prettifying a messaging system, so to speak.
As far as converting links, Codeigniter's got you covered with the url helper:
auto_link()
Automatically turns URLs and email addresses contained in a string
into links. Example: $string = auto_link($string);
The second parameter determines whether URLs and emails are converted
or just one or the other. Default behavior is both if the parameter is
not specified. Email links are encoded as safe_mailto() as shown
above.
As for smilies, that's covered as well. There is actually a smiley helper:
If you give up and want to parse bbcode, here's a helper written by Phil Sturgeon (a lead Codeigniter developer): https://github.com/bcit-ci/CodeIgniter/wiki/BBCode-Helper
If you wanted to go with something client side for BBCode interpritation, I've written an extendible BBCode parser in JavaScript.
It has all of the standard BBCode tags, but if your messaging system needed some new tags for certain kinds of URL manipulation they could be easily added. As an example, for a smilies tag you could extend it like this:
"smiley": {
openTag: function(params,content) {
if (content === ":)") {
return "<img src='smiley.png'/>";
} else if (content === ":(") {
return "<img src='frown.png'/>";
} else {
return "";
}
},
closeTag: function(params,content) {
return "";
}
}
And then the BBCode would look something like:
[smiley]:)[/smiley]
And the HTML code it would generate from that would look like this:
<img src='smiley.png'/>
This might be more work than what you want and you may not want your own custom tags for your messaging system, but I figured I'd mention it just in case.
Related
in my forum, I'm trying to stop links from converting into clickbale links and place a custom text language instead that says Links Not Allowed.
This seems to be the code that creates the clickable links. My question, is it possible to convert the urls to non-clickable text that says "Spam - Links Not Allowed"
public function parseUrl($params) {
$url = $params['url'];
$text = $params['text'];
If I remove this last line, it seems to make the links disappear, however I would like to display a custom message instead. Sorry if this is a basic question, my code knowledge is at a beginner level.
It's not just server side action, for this reason you should call JS function, so, at first change your php code to this :
$url = $params['javascript:myfunction();'];
and then in client side for javascript write this :
function myfunction(){
alert('not allowed!');
}
$text = $params['text'];
replace "text" with "spam - links not allowed."
In terms of how to make it not clickable, I need to see where the link is actually used.
Im currently working on a system that has a comment system integrated, the system is running on Codeigniter so im looking to create a markdown library but with really minimal features.
The features im looking to have is
Autolinking
Bold *bold*
Italic _italic_
And that's practically it, The post data will be run through Codeigniter's XSS Class before it goes to the mark down class
So my question is what's the best way to do this, should i be using a library out there and disabling certain features, should I build this from scratch, if so, how should i build the class and what things should I take into account.
I was in a similar situation recently, where I wanted to support some kind of markup (BB, Markdown, etc). It turns out nothing has been done with BBCode for about 100 years, and it's dead easy to write a regex parser for it (for well-formed markup at least) so i wrote a really bare bones function to do just that.
My version also includes images, codes, and color support as well as nested tags ([b][i]bold and italic[/i][/b]).
function parseBBCode($string){
$search = array(
'/\[b\](.*?)\[\/b\]/',
'/\[i\](.*?)\[\/i\]/',
'/\[u\](.*?)\[\/u\]/',
'/\[img\](.*?)\[\/img\]/',
'/\[url\=(.*?)\](.*?)\[\/url\]/',
'/\[code\](.*?)\[\/code\]/',
'/\[color\=(.*?)\](.*?)\[\/color\]/'
);
$replace = array(
'<strong>\\1</strong>',
'<em>\\1</em>',
'<u>\\1</u>',
'<img src="\\1">',
'\\2',
'<code>\\1</code>',
'<span style="color:\\1;">\\2</span>'
);
$new = preg_replace($search, $replace, $string);
return nl2br($new);
}
You can begin with PHP Markdown class ?
or the one for CI.
And If I may suggest, you can also try MarkItUp as front end..
For me the easiest way to integrate Markdown is by simply
putting markdown.php from Michel Fortrin into my Application/helpers/ folder,
rename it to markdown_helper.php
load it with $this->load->helper('markdown');
...just in case someone - like me - stumbles upon this old thread again :)
what is the l.php
im guessing l.php is link.php on
facebook. its a pre-redirecting
script. every link on facebook is
filtered to link.php?to=link
i have some things in mind. like
make a render class or filter the input with regex, finds an www.link.com then change it to something like link , the problem is when we have some changes, if we change something then all our archives links isn't going to work ( assume that we put the input to the database. ).
use a JavaScript to do this, i mean yes, but im not familiar with js, but i know we can search and change the links live like above. but the problem is when the user doesn't have a js on, ( mobile, or no JavaScript plugin, etc )
or maybe you have a better answer what is the best way we implant l.php ?
This would be one of the pros of using a function to generate links in your views:
link text
Your build_link() would be like so:
function build_link($path)
{
$prefix = '';
if (preg_match('|^(https?://|www\.)', $path))
{
$prefix = 'http://www.oursite.php?to=';
}
return $prefix . $path;
}
This means you could even use a CDN easily amongst your links.
The easiest option is to use Javascript, but like you say is reliant on the user to have Javascript enabled browser, which is highly likey due to the advance in browser technology, even in the mobile platform. The jQuery would look like so:
$(document).ready(function() {
$('a').live('click', function() {
var href = $(this).attr('href');
if (href.match(/^(https?:\/\/|www\\.)/i))
{
this.href = 'http://www.oursite.php?to=' + href;
}
return this.href;
});
});
If changing your links is not viable, i.e. you need to rewrite links that is inside a database or similar, I would look into using DOMDocument -- it's generally good practice to avoid messy regexes when dealing with complex structures such as HTML
$doc = new DOMDocument('1.0', 'UTF-8');
$doc->loadHTML($text);
$anchors = $doc->getElementsByTagName('a');
foreach($anchors as $a) {
$href = $a->getAttribute('href');
if (preg_match('|^(https?://|www\.)', $href))
{
$a->setAttribute('href', 'http://www.oursite.php?to=' . $href);
}
}
$newHTML = $doc->saveHTML();
So there are three options here:
Go through every part on your site that outputs links to external sites, and re-write them through a build_link function
Rewrite using the help of DOMDocument
Use Javascript
I would have gone with using PHP to let the content of the page run through a filter that uses regex to replace the links.
Using javascript would mean that paople can turn it off. PHP ensures that all links get replaced correctly.
Just remember to make sure that any internal links (like navigation) is left untouched.
There are many types of regex that finds urls and you have to choose one that suits your needs
Edit: I would use this regex (https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)
So I have a site with a dozen pages on it using Drupal as a CMS. Wanted to know how to set/append all href links on any page with a dynamic attribute?
so here is an example URL:
http://www.site.com/?q=node/4
and I wanted to append to the URL like so:
http://www.site.com/?q=node/4&attr=1234
Now I have a nav bar on the site and when I hover over the link I see the url but I need to append the &attr=1234 string to the end of it. The string is dynamic so it might change from time to time.
I was thinking jQuery would be a good choice to do this but does Drupal have any functionality as well?
Now I've seen a couple of posts on Stack:
Post 1
Post 2
Problem is I'm learning my way around Drupal and have minimal experience with jQuery but getting better with both. I see the jQuery can replace a HREF but looks like they hard coded the HREF, could jQuery find all HREF's on a page and append the string to it? Also does Drupal have this functionality and what would be the best approach?
Also need this to work for clean or standard URL format, so I think Apache would handle this I just wanted to make sure.
Thanks for any help
EDIT:
Looks like the general consensus is the Drupal should handle this type of request. Just looking for the best implementation. Simple function call would be best but I would like it to dynamically add it to all existing href's as I want this to be dynamic instead of hard coding any url/href calls. So I could add/remove pages on the fly without the need to reconfigure/recode anything.
Thanks for the great tips though
EDIT #2:
Okay maybe I'm asking the wring question. Here is what I need and why it's not working for me yet.
I need to pass a value in the url that changes some of the look and feel of the site. I need it to be passed on just about every href tag on the page but not on User logout or Admin pages.
I see in my template code where the nav links get generated, so I though I could pass my code in the attributes array as the second parm to the function, but that is setting the tag attributes and not the URL attributes.
Now I see the bottom nav links use this Drupal function: menu_navigation_links() in menu.inc but the top nav uses a custom function.
This function in the template.php script looks to be the one creating the links
function lplus($text, $path, $options = array()) {
global $language;
// Merge in defaults.
$options += array(
'attributes' => array(),
'html' => FALSE,
);
// Append active class.
if (($path == $_GET['q'] || ($path == '<front>' && drupal_is_front_page())) &&
(empty($options['language']) || $options['language']->language == $language->language)) {
if (isset($options['attributes']['class'])) {
$options['attributes']['class'] .= ' active';
}
else {
$options['attributes']['class'] = 'active';
}
}
// Remove all HTML and PHP tags from a tooltip. For best performance, we act only
// if a quick strpos() pre-check gave a suspicion (because strip_tags() is expensive).
if (isset($options['attributes']['title']) && strpos($options['attributes']['title'], '<') !== FALSE) {
$options['attributes']['title'] = strip_tags($options['attributes']['title']);
}
return '<a href="'. check_url(url($path, $options)) .'"'. drupal_attributes($options['attributes']) .'><b>'. ($options['html'] ? $text : check_plain($text)) .'</b></a>';
}
not sure how to incorporate what I need into this function.
So on the home page the ?q=node/ is missing and if I append the ampersand it throws an error.
http://www.site.com/&attr=1234 // throws error
But if I mod it to the correct format it works fine
http://www.site.com/?attr=1234
Assuming that when you mean pages, you mean the content type of pages (will work for any other content type as long as it's really content and not something in a block or view).
You can easily replace the contents of any node that is about to be viewed by running a str_replace or with a regular expression. For instance, using str_replace:
function module_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
switch($op) {
case "view":
$node->body = str_replace($expected_link, $desired_link);
break;
}
}
where you define desired link somewhere else. Not an optimal solution, but non-Javascript browsers (yes, they still exist!) can't get around the forced, desired URLs if you try to change it with Javascript.
I think doing it in Drupal/PHP would be cleaner. Check out Pathauto module: http://drupal.org/node/17345
There is a good discussion on a related topic here:
http://drupal.org/node/249864
This wouldn't use jquery (instead you would overwrite a function using PHP) but you could get the same result. This assumes, however, that you are working with menu links.
I think you should consider exploring PURL ( http://drupal.org/project/purl ) and some of the modules it works with e.g. spaces and context.
I don't suggest you use jQuery to do this. It's a better practice to do this server side in PHP (Drupal).
You can overwrite the links dynamically into your preprocess page function.
On your template.php file:
function *yourtheme*_preprocess_page(&$vars, $hook){
//You can do it for the region that you need
$vars['content'] = preg_replace('/<a href="(.*?)"/i', '<a href="$1&attr=1234"', $vars['content']);
}
Note:
I did not try it, its only a hint.
It will add your parameters to the outside links too.
I have a specific kind of node in which the user must paste FULL html into the body field. E.g. html including the html, head and body tags. Apparently, Drupal's version of "full html" is infact not "full html" as it strips out these tags.
How can I circumvent Drupal?
I solved this by using the nodeapi hook in a module in a fairly brutal way:
function your_module_name_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
if($node->type == "the_relevant_type" && $op == "view") {
echo $node->body;
exit(); // stick that in your pipe and smoke it, Drupal
}
}
Can't you make use of normal nodes and static page specific blocks?
You're not really circumventing Drupal; you're getting all of the overhead of Drupal with almost none of the benefit. To really circumvent Drupal, you should not put these static documents in Drupal at all. Drupal's .htaccess is set to only load Drupal when a URL does not match an actual file, so putting your actual files where they are now and adding Drupal where Drupal goes (which shouldn't overlap with .html files at all) will both work better and be easier to implement.
If you really want to dump the HTML in CCK and run a bunch of database queries before outputting static HTML, you could just change the field to plain text.