I'm using prettify on my blog to be able to paste code.
In functions.php I have the following code to make the code clean (the < code> tags without spaces off course):
function bbcode( $attr, $content = null ) {
$content = clean_pre($content); // Clean pre-tags
return '<pre class="prettyprint">< code>' . str_replace('<', '<', $content) . '< /code></pre>';
}
add_shortcode('kod', 'bbcode');
So when I'm pasting code in my posts, I'm doing inside a shortcode, like this:
[kod]Some code[/kod]
So far, so good, and prettify works pretty well, accept that sometimes I'm getting weird line-breaks.
When pasting this code:
<?php if ($col == 1) echo '<div class="rad">'; ?>
This is what I'm getting:
<?php if ($col == 1) echo '
<div class="rad">'; ?>
Can someone point me in the right direction to why this is happening? You can see an example post here:
[[LINK href="http://webbhjalp.se/wordpress-inlagg-kolumner/"]]http://webbhjalp.se/wordpress-inlagg-kolumner/[[/LINK]]
Notice that on all code examples where I'm trying to echo a <div> I'm getting line breaks.
If I'm manually changing <em><div</em> to <em><div</em> it works as it should, but the function I'm using is also doing this, so I can't understand what's happening!
Thanks!
// Jens.
She Codes answers:
<span class="str">' <div class="rad">'</span>
This is the source code from your site.
There is no break, there is a space there - between the ' and <
Are you sure this space character does not come from your function or from the text in the post?
Jens Filipsson comments:
Yes, I saw that as well! It's weird, but it still shouldn't force a line break I reckon?
She Codes comments:
This is by no means the best way to do this, but it is the quickest way I could think of to check if clean_pre is adding the break. Please try this instead of your function (the < code> tags without spaces off course):
function bbcode( $attr, $content = null ) {
$content = str_replace('<', '<', $content);
$content = str_replace('>', '>', $content);
$content = str_replace('<p>', '<p>', $content);
$content = str_replace('</p>', '</p>', $content);
$content = str_replace('<br />', '<br />', $content);
$content = clean_pre($content); // Clean pre-tags
return '<pre class="prettyprint">< code>' . $content . '< /code></pre>';
}
add_shortcode('kod', 'bbcode');
Jens Filipsson comments:
No difference I'm afraid :(
She Codes comments:
One last idea from me:
function bbcode( $attr, $content = null ) {
$content = clean_pre($content); // Clean pre-tags
return '<pre class="prettyprint"><code>' . $content . '< /code></pre>';
}
add_shortcode('kod', 'bbcode');
She Codes comments:
Sorry:
function bbcode( $attr, $content = null ) {
$content = clean_pre($content); // Clean pre-tags
return '<pre class="prettyprint">< code>' . $content . '< /code></pre>';
}
add_shortcode('kod', 'bbcode');
Jens Filipsson comments:
Thing is, my function replaces < with <
but without it, nothing at all displays...
She Codes comments:
Can you lose the <pre>
tag and style the <code class="prettyprint">
the same way?
She Codes comments:
No, you cannot... Forget the last one.
I think I found where the problem comes from.
1. Open brand new post, paste this
'<div></div>
in Visual editor, then change to HTML.
2. Delete everything and now paste it in HTML, change to Visual and then change back to HTML.
I think the HTML editor does this, because it forces DIV (block-level) tags on a new line. I suppose the same would happen if the tag was H2, but not if it was SPAN.
She Codes comments:
Therefore, if you don't switch between both editors, the problem should not occur.
Or, if you go to HTML, delete the space and then re-save the post whilst still in HTML view.
No other ideas...
Jens Filipsson comments:
That's totally the problem. I'm usually just using the html editor though. I never change to visual. So I really shouldn't have the problem in the first place, right?
Even if I save it the way it looks right in HTML, it still comes out wrong as it seems. Is it possible to override this somehow?
She Codes comments:
If you go to Visual editor and re-paste your shortcode there:
[kod]<?php if ($col == 1) echo '<div class="rad">'; ?>[/kod]
in html this should be converted to
[kod]<?php if ($col == 1) echo '<div class="rad">'; ?>[/kod]
and maybe the div tag would not be recognized as such, therefore would not break on a new line.
This is not a real solution though, as you would have to perform it on a case per case basis.
Jens Filipsson comments:
Yes, this is probably the solution I have to go with. Very annoying though, I hate not finding the answers to things! :)
Francisco Javier Carazo Gil answers:
Hi Jens,
Maybe some filter is doing it. Try to unable all them:
add_action( 'all', create_function( '', 'var_dump( current_filter() );' ) );
Francisco Javier Carazo Gil comments:
If there's no problem with other tags, something has to be in the middle.
Jens Filipsson comments:
Your function broke everything....
Francisco Javier Carazo Gil comments:
Jens,
From: [[LINK href="http://nacin.com/2010/04/23/5-ways-to-debug-wordpress/"]]5 ways to debug WordPress[[/LINK]]
<em>There’s an ‘all’ hook that fires for all actions and filters. Example usage:
add_action( 'all', create_function( '', 'var_dump( current_filter() );' ) );
You’ll be surprised how many hooks get executed on every page load. Good for troubleshooting and identifying the right hook.
There’s also a ‘shutdown’ hook you can use in combination with, say, SAVEQUERIES, and write the query information to the database. It’s the last hook to run.
</em>
I have to go out, later I continue.
Francisco Javier Carazo Gil comments:
Look at it: [[LINK href="http://emrahgunduz.com/categories/development/wordpress/wordpress-disable-auto-paragraphing/"]]WordPress: Disable Auto Paragraphing, wpautop() and clean_pre() Functions[[/LINK]]
It seems that clean_pre() is introduce autoparagraph. With this code you can solve it.
Jens Filipsson comments:
Unfortunately that didn't work. And looking at the generated source, there are no p or br tags either... Only weird thing is a single space (sp ace), which I can't find where it's coming from!
Julius J. answers:
Ummm, yesterday in shortcodes I solved similar problem with
$content = str_replace('<br />', '', $content);
Jens Filipsson comments:
How do I add that to my function then?
Julius J. comments:
function bbcode( $attr, $content = null ) {
$content = str_replace('<br />', '', $content);
$content = clean_pre($content); // Clean pre-tags
return '<pre class="prettyprint">< code>' . str_replace('<', '<', $content) . '< /code></pre>';
}
add_shortcode('kod', 'bbcode');
Simple as that.
Jens Filipsson comments:
Didn't work unfortunately, no and no br tags there what I can see...
Julio Potier answers:
Hello try this :
function bbcode( $attr, $content = null ) {
return '<pre class="prettyprint">< code>' . str_replace('<', '<', $content) . '< /code></pre>';
}
add_shortcode('kod', 'bbcode');
I deleted the clean_pre()
Paste me the result please thank you.
Jens Filipsson comments:
The result:
<?php if ($col == 1) echo "
<div class="rad">"; ?><br />
<!-- Om vi är på kolumn 1, lägg till en ny rad-container -->
Julio Potier comments:
Can you paste on pastebin.com and email me the original code you paste in the shortcode ? Thank you
mail : [email protected]
And pastebin.com
See you soon