From: <mi...@us...> - 2008-07-22 20:37:36
|
Revision: 1532 http://geshi.svn.sourceforge.net/geshi/?rev=1532&view=rev Author: milianw Date: 2008-07-22 20:37:42 +0000 (Tue, 22 Jul 2008) Log Message: ----------- add: GESHI_HEADER_PRE_TABLE added, works pretty good so far Modified Paths: -------------- trunk/geshi-1.0.X/src/docs/CHANGES trunk/geshi-1.0.X/src/geshi.php Modified: trunk/geshi-1.0.X/src/docs/CHANGES =================================================================== --- trunk/geshi-1.0.X/src/docs/CHANGES 2008-07-22 19:27:27 UTC (rev 1531) +++ trunk/geshi-1.0.X/src/docs/CHANGES 2008-07-22 20:37:42 UTC (rev 1532) @@ -66,10 +66,12 @@ - Fixed economy mode for GeSHi::get_stylesheet() - now it just makes so much more sense! (milian) - Fixed Economy Mode when COMMENT_REGEXP are used (BenBE) - Some typos and mistakes in the documentation (BenBE) - - Added new GESHI_HEADER_PRE_VALID type which uses the following markup: + - Added new GESHI_HEADER_PRE_VALID type which uses the following markup: (milian) * With line numbers: <div>header<ol><li><pre>...</pre></li>...</ol></div> * Without line numbers: <pre>header...CODE...</pre> => valid HTML and no need for indentation + - Added new GESHI_HEADER_PRE_TABLE type which can be used to prevent linenumber-selection in Firefox + on copy'n'paste. (milian) - Extended support for number formats now covering the most common formats (SF#1923058, BenBE) - Updated Objective-C language file (SF#2013961, Quinn Taylor, BenBE) - Added some keywords for VHDL (beshig, BenBE) Modified: trunk/geshi-1.0.X/src/geshi.php =================================================================== --- trunk/geshi-1.0.X/src/geshi.php 2008-07-22 19:27:27 UTC (rev 1531) +++ trunk/geshi-1.0.X/src/geshi.php 2008-07-22 20:37:42 UTC (rev 1532) @@ -70,6 +70,20 @@ define('GESHI_HEADER_PRE', 2); /** Use a pre to wrap lines when line numbers are enabled or to wrap the whole code. */ define('GESHI_HEADER_PRE_VALID', 3); +/** + * Use a "table" to surround the source: + * + * <table> + * <thead><tr><td colspan="2">$header</td></tr></thead> + * <tbody><tr><td><pre>$linenumbers</pre></td><td><pre>$code></pre></td></tr></tbody> + * <tfooter><tr><td colspan="2">$footer</td></tr></tfoot> + * </table> + * + * this is essentially only a workaround for Firefox, see sf#1651996 or take a look at + * https://bugzilla.mozilla.org/show_bug.cgi?id=365805 + * @note when linenumbers are disabled this is essentially the same as GESHI_HEADER_PRE + */ +define('GESHI_HEADER_PRE_TABLE', 4); // Capatalisation constants /** Lowercase keywords found */ @@ -448,6 +462,12 @@ var $line_style2 = 'font-weight: bold;'; /** + * Style for line numbers when GESHI_HEADER_PRE_TABLE is chosen + * @var string + */ + var $table_linenumber_style = 'font-weight: normal;text-align:right;margin:0;padding:0 5px;'; + + /** * Flag for how line numbers are displayed * @var boolean */ @@ -678,7 +698,7 @@ function set_header_type($type) { //Check if we got a valid header type if (!in_array($type, array(GESHI_HEADER_NONE, GESHI_HEADER_DIV, - GESHI_HEADER_PRE, GESHI_HEADER_PRE_VALID))) { + GESHI_HEADER_PRE, GESHI_HEADER_PRE_VALID, GESHI_HEADER_PRE_TABLE))) { $this->error = GESHI_ERROR_INVALID_HEADER_TYPE; return; } @@ -3364,7 +3384,7 @@ // If we're using line numbers, we insert <li>s and appropriate // markup to style them (otherwise we don't need to do anything) - if ($this->line_numbers != GESHI_NO_LINE_NUMBERS) { + if ($this->line_numbers != GESHI_NO_LINE_NUMBERS && $this->header_type != GESHI_HEADER_PRE_TABLE) { // If we're using the <pre> header, we shouldn't add newlines because // the <pre> will line-break them (and the <li>s already do this for us) $ls = ($this->header_type != GESHI_HEADER_PRE && $this->header_type != GESHI_HEADER_PRE_VALID) ? "\n" : ''; @@ -3451,17 +3471,59 @@ unset($code[$i - 1]); } } else { + $n = count($code); + if ($this->use_classes) { + $attributes = ' class="de1"'; + } else { + $attributes = ' style="'. $this->code_style .'"'; + } if ($this->header_type == GESHI_HEADER_PRE_VALID) { - $parsed_code .= '<pre>'; + $parsed_code .= '<pre'. $attributes .'>'; + } elseif ($this->header_type == GESHI_HEADER_PRE_TABLE) { + if ($this->line_numbers != GESHI_NO_LINE_NUMBERS) { + if ($this->use_classes) { + $attrs = ' class="ln"'; + } else { + $attrs = ' style="'. $this->table_linenumber_style .'"'; + } + $parsed_code .= '<td><pre'. $attrs .'>'; + // get linenumbers + // we don't merge it with the for below, since it should be better for + // memory consumption this way + for ($i = 1; $i <= $n; ++$i) { + $parsed_code .= $i; + if ($i != $n) { + $parsed_code .= "\n"; + } + } + $parsed_code .= '</pre></td><td>'; + } + $parsed_code .= '<pre'. $attributes .'>'; } // No line numbers, but still need to handle highlighting lines extra. // Have to use divs so the full width of the code is highlighted - for ($i = 0, $n = count($code); $i < $n; ++$i) { + $close = 0; + for ($i = 0; $i < $n; ++$i) { // Make lines have at least one space in them if they're empty // BenBE: Checking emptiness using trim instead of relying on blanks if ('' == trim($code[$i])) { $code[$i] = ' '; } + // fancy lines + if ($this->line_numbers == GESHI_FANCY_LINE_NUMBERS && + $i % $this->line_nth_row == ($this->line_nth_row - 1)) { + // Set the attributes to style the line + if ($this->use_classes) { + $parsed_code .= '<span class="xtra li2"><span class="de2">'; + } else { + // This style "covers up" the special styles set for special lines + // so that styles applied to special lines don't apply to the actual + // code on that line + $parsed_code .= '<span style="display:block;' . $this->line_style2 . '">' + .'<span style="' . $this->code_style .'">'; + } + $close += 2; + } //Is this some line with extra styles??? if (in_array($i + 1, $this->highlight_extra_lines)) { if ($this->use_classes) { @@ -3473,20 +3535,27 @@ } else { $parsed_code .= "<span style=\"display:block;" . $this->get_line_style($i) . "\">"; } - // Remove \n because it stuffs up <pre> header - $parsed_code .= $code[$i] . '</span>'; - } else { - $parsed_code .= $code[$i]; - if ($i + 1 < $n) { - $parsed_code .= "\n"; - } + ++$close; } + + $parsed_code .= $code[$i]; + + if ($close) { + $parsed_code .= str_repeat('</span>', $close); + $close = 0; + } + elseif ($i + 1 < $n) { + $parsed_code .= "\n"; + } unset($code[$i]); } - if ($this->header_type == GESHI_HEADER_PRE_VALID) { + if ($this->header_type == GESHI_HEADER_PRE_VALID || $this->header_type == GESHI_HEADER_PRE_TABLE) { $parsed_code .= '</pre>'; } + if ($this->header_type == GESHI_HEADER_PRE_TABLE && $this->line_numbers != GESHI_NO_LINE_NUMBERS) { + $parsed_code .= '</td>'; + } } $parsed_code .= $this->footer(); @@ -3536,7 +3605,11 @@ } else { $attr = " style=\"{$this->header_content_style}\""; } - $header = "<div$attr>$header</div>"; + if ($this->header_type == GESHI_HEADER_PRE_TABLE && $this->line_numbers != GESHI_NO_LINE_NUMBERS) { + $header = "<thead><tr><td colspan=\"2\" $attr>$header</td></tr></thead>"; + } else { + $header = "<div$attr>$header</div>"; + } } if (GESHI_HEADER_NONE == $this->header_type) { @@ -3553,6 +3626,8 @@ } else if ($this->header_type == GESHI_HEADER_DIV || $this->header_type == GESHI_HEADER_PRE_VALID) { return "<div$attributes>$header<ol$ol_attributes>"; + } else if ($this->header_type == GESHI_HEADER_PRE_TABLE) { + return "<table$attributes>$header<tbody><tr class=\"li1\">"; } } else { if ($this->header_type == GESHI_HEADER_PRE) { @@ -3585,7 +3660,11 @@ } else { $attr = " style=\"{$this->footer_content_style}\""; } - $footer = "<div$attr>$footer</div>"; + if ($this->header_type == GESHI_HEADER_PRE_TABLE && $this->linenumbers != GESHI_NO_LINE_NUMBERS) { + $footer = "<tfoot><tr><td colspan=\"2\">$footer</td></tr></tfoot>"; + } else { + $footer = "<div$attr>$footer</div>"; + } } if (GESHI_HEADER_NONE == $this->header_type) { @@ -3599,6 +3678,13 @@ return ($this->force_code_block ? '</div>' : '') . "$footer</div>"; } + elseif ($this->header_type == GESHI_HEADER_PRE_TABLE) { + if ($this->line_numbers != GESHI_NO_LINE_NUMBERS) { + return "</tr></tbody>$footer</table>"; + } + return ($this->force_code_block ? '</div>' : '') . + "$footer</div>"; + } else { if ($this->line_numbers != GESHI_NO_LINE_NUMBERS) { return "</ol>$footer</pre>"; @@ -3828,11 +3914,14 @@ // Simple line number styles if ((!$economy_mode || $this->line_numbers != GESHI_NO_LINE_NUMBERS) && $this->line_style1 != '') { - $stylesheet .= "{$selector}li, {$selector}li.li1 {{$this->line_style1}}\n"; + $stylesheet .= "{$selector}li, {$selector}.li1 {{$this->line_style1}}\n"; } + if ((!$economy_mode || $this->line_numbers != GESHI_NO_LINE_NUMBERS) && $this->table_linenumber_style != '') { + $stylesheet .= "{$selector}.ln {{$this->table_linenumber_style}}\n"; + } // If there is a style set for fancy line numbers, echo it out if ((!$economy_mode || $this->line_numbers == GESHI_FANCY_LINE_NUMBERS) && $this->line_style2 != '') { - $stylesheet .= "{$selector}li.li2 {{$this->line_style2}}\n"; + $stylesheet .= "{$selector}.li2 {{$this->line_style2}}\n"; } // note: empty styles are meaningless @@ -3905,8 +3994,8 @@ // Styles for lines being highlighted extra if (!$economy_mode || (count($this->highlight_extra_lines)!=count($this->highlight_extra_lines_styles))) { $stylesheet .= "{$selector}.ln-xtra, {$selector}li.ln-xtra, {$selector}div.ln-xtra {{$this->highlight_extra_lines_style}}\n"; - $stylesheet .= "{$selector}span.xtra { display:block; }\n"; } + $stylesheet .= "{$selector}span.xtra { display:block; }\n"; foreach ($this->highlight_extra_lines_styles as $lineid => $linestyle) { $stylesheet .= "{$selector}.lx$lineid, {$selector}li.lx$lineid, {$selector}div.lx$lineid {{$linestyle}}\n"; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |