On Sun, 13 Mar 2005 02:31:42 +0100, David ZÃlke <[EMAIL PROTECTED]> wrote:
> No... that won't make it possible to jump directly to line numbers. It has
> to be <a id="...">
I don't think that's true. I may be wrong, as I didn't consult any
standards or recommendations, but I did create a test that worked
successfully in Mozilla using <li id="test">.


> Bear in mind that ids mustn't start with a number:
> http://www.w3.org/TR/html4/types.html#type-name
> 
> David
> 
> > -----Original Message-----
> > From: Gordon P. Hemsley [mailto:[EMAIL PROTECTED]
> > Sent: Sunday, March 13, 2005 1:23 AM
> > To: Jeffery Fernandez; Johannes Schlueter; internals@lists.php.net;
> > [EMAIL PROTECTED]
> > Subject: Re: [PHP-DEV] [patch] highlight_[file|string] and line numbers
> >
> > Instead of using <a id="[line]" /> (which I'm not sure is even valid),
> > you can simply just embed the id into the <li> tag: <li id="[line]">.
> >
> > And that's just _my_ 2 cents.
> >
> >
> > On Sun, 13 Mar 2005 10:47:19 +1100, Jeffery Fernandez
> > <[EMAIL PROTECTED]> wrote:
> > > Johannes Schlueter wrote:
> > >
> > > >Hi,
> > > >
> > > >some days (or even weeks?) ago Lukas asked on IRC wether there is a way
> > to get
> > > >PHP code highlighted with linenumbers. The first reaction of most
> > people
> > > >(including me) was "no" since you can't copy&paste the code but after
> > > >thinking I found out that <ol> works really fine. So I've implemented
> > it that
> > > >way and added an optional bool parameter to the highlight functions.
> > > >Additionally I've added two other parameters to these functions: The
> > first
> > > >one is a bool that adds jump targets (<a id="[line]"/>), second one is
> > a
> > > >prefix to this number (<a id="[prefix][line]"/>) which is needed to
> > make sure
> > > >the jump target is unique even if more than one snippet is added to the
> > > >output.
> > > >
> > > >This doesn't work with .phps yet since we would a new php.ini setting
> > which I
> > > >didn't want to add or numbered output would need to become default.
> > > >
> > > >My patch is attached and, if it doesn't come through, available on
> > > >http://www.schlueters.de/zend_highlight_20050312_1.diff a sample output
> > is at
> > > >http://www.schlueters.de/highlight_pma.html
> > > >
> > > >johannes
> > > >
> > > >
> > > >
> > > >
> > > That looks very good but there seems to be serious html issues when I
> > > validated that page... Total 1789 erros when I validated that page at
> > > w3c. If you can fix that it would be awesome.
> > >
> > > my 2c
> > >
> > > >-----------------------------------------------------------------------
> > -
> > > >
> > > >Index: Zend/zend_highlight.h
> > > >===================================================================
> > > >RCS file: /repository/ZendEngine2/zend_highlight.h,v
> > > >retrieving revision 1.24
> > > >diff -u -r1.24 zend_highlight.h
> > > >--- Zend/zend_highlight.h      8 Jan 2004 17:31:47 -0000       1.24
> > > >+++ Zend/zend_highlight.h      12 Mar 2005 14:40:12 -0000
> > > >@@ -41,11 +41,16 @@
> > > >
> > > > BEGIN_EXTERN_C()
> > > > ZEND_API void zend_highlight(zend_syntax_highlighter_ini
> > *syntax_highlighter_ini TSRMLS_DC);
> > > >+ZEND_API void zend_highlight_numbered(zend_syntax_highlighter_ini
> > *syntax_highlighter_ini, zend_bool mark_lines, char *line_prefix
> > TSRMLS_DC);
> > > > ZEND_API void zend_strip(TSRMLS_D);
> > > > ZEND_API int highlight_file(char *filename,
> > zend_syntax_highlighter_ini *syntax_highlighter_ini TSRMLS_DC);
> > > >+ZEND_API int highlight_file_ex(char *filename,
> > zend_syntax_highlighter_ini *syntax_highlighter_ini, zend_bool numbered,
> > zend_bool mark_lines, char *line_prefix TSRMLS_DC);
> > > > ZEND_API int highlight_string(zval *str, zend_syntax_highlighter_ini
> > *syntax_highlighter_ini, char *str_name TSRMLS_DC);
> > > >+ZEND_API int highlight_string_ex(zval *str,
> > zend_syntax_highlighter_ini *syntax_highlighter_ini, char *str_name,
> > zend_bool numbered, zend_bool mark_lines, char *line_prefix TSRMLS_DC);
> > > > ZEND_API void zend_html_putc(char c);
> > > >+ZEND_API void zend_html_putc_ex(char c, char *last_color, int *line,
> > char *line_prefix);
> > > > ZEND_API void zend_html_puts(const char *s, uint len TSRMLS_DC);
> > > >+ZEND_API void zend_html_puts_ex(const char *s, uint len, char
> > *last_color, int *line, char *line_prefix TSRMLS_DC);
> > > > END_EXTERN_C()
> > > >
> > > > extern zend_syntax_highlighter_ini syntax_highlighter_ini;
> > > >Index: Zend/zend_highlight.c
> > > >===================================================================
> > > >RCS file: /repository/ZendEngine2/zend_highlight.c,v
> > > >retrieving revision 1.47
> > > >diff -u -r1.47 zend_highlight.c
> > > >--- Zend/zend_highlight.c      2 Jan 2005 23:53:43 -0000       1.47
> > > >+++ Zend/zend_highlight.c      12 Mar 2005 14:40:12 -0000
> > > >@@ -53,9 +53,35 @@
> > > >       }
> > > > }
> > > >
> > > >+ZEND_API void zend_html_putc_ex(char c, char *last_color, int *line,
> > char *line_prefix)
> > > >+{
> > > >+      if (c == '\n') {
> > > >+              /* the &nbsp; is needed to work around
> > https://bugzilla.mozilla.org/show_bug.cgi?id=194831 */
> > > >+              zend_printf("&nbsp;</span></code></li>\n<li>");
> > > >+              if (last_color != NULL) {
> > > >+                      if (line && *line) {
> > > >+                              if (line_prefix) {
> > > >+                                      zend_printf("<a id=\"%s%d\"/>",
> > line_prefix, ++*line);
> > > >+                              } else {
> > > >+                                      zend_printf("<a id=\"%d\"/>",
> > ++*line);
> > > >+                              }
> > > >+                      }
> > > >+                      zend_printf("<code><span style=\"color: %s\">",
> > last_color);
> > > >+              } else {
> > > >+                      zend_printf("<code><span>");
> > > >+              }
> > > >+      } else {
> > > >+              zend_html_putc(c);
> > > >+      }
> > > >+}
> > > >
> > > > ZEND_API void zend_html_puts(const char *s, uint len TSRMLS_DC)
> > > > {
> > > >+      zend_html_puts_ex(s, len, NULL, NULL, NULL TSRMLS_CC);
> > > >+}
> > > >+
> > > >+ZEND_API void zend_html_puts_ex(const char *s, uint len, char
> > *last_color, int *line, char *line_prefix TSRMLS_DC)
> > > >+{
> > > >       const char *ptr=s, *end=s+len;
> > > >
> > > > #ifdef ZEND_MULTIBYTE
> > > >@@ -83,7 +109,11 @@
> > > >                               ptr++;
> > > >                       }
> > > >               } else {
> > > >-                      zend_html_putc(*ptr++);
> > > >+                      if (last_color == NULL) {
> > > >+                              zend_html_putc(*ptr++);
> > > >+                      } else {
> > > >+                              zend_html_putc_ex(*ptr++, last_color,
> > line, line_prefix);
> > > >+                      }
> > > >               }
> > > >       }
> > > >
> > > >@@ -196,6 +226,108 @@
> > > > }
> > > >
> > > >
> > > >+ZEND_API void zend_highlight_numbered(zend_syntax_highlighter_ini
> > *syntax_highlighter_ini, zend_bool mark_lines, char *line_prefix
> > TSRMLS_DC)
> > > >+{
> > > >+      zval token;
> > > >+      int token_type;
> > > >+      char *last_color = syntax_highlighter_ini->highlight_html;
> > > >+      char *next_color;
> > > >+      int in_string=0, post_heredoc = 0;
> > > >+      int line = 0;
> > > >+
> > > >+      if (mark_lines) {
> > > >+              line = 1;
> > > >+              if (line_prefix) {
> > > >+                      zend_printf("<ol><li><a id=\"%s%d\"/><code><span
> > style=\"color: %s\">", line_prefix, line, last_color);
> > > >+              } else {
> > > >+                      zend_printf("<ol><li><a id=\"%d\"/><code><span
> > style=\"color: %s\">", line, last_color);
> > > >+              }
> > > >+      } else {
> > > >+              zend_printf("<ol><li><code><span style=\"color: %s\">",
> > last_color);
> > > >+      }
> > > >+      /* highlight stuff coming back from zendlex() */
> > > >+      token.type = 0;
> > > >+      while ((token_type=lex_scan(&token TSRMLS_CC))) {
> > > >+              switch (token_type) {
> > > >+                      case T_INLINE_HTML:
> > > >+                              next_color = syntax_highlighter_ini-
> > >highlight_html;
> > > >+                              break;
> > > >+                      case T_COMMENT:
> > > >+                      case T_DOC_COMMENT:
> > > >+                              next_color = syntax_highlighter_ini-
> > >highlight_comment;
> > > >+                              break;
> > > >+                      case T_OPEN_TAG:
> > > >+                      case T_OPEN_TAG_WITH_ECHO:
> > > >+                              next_color = syntax_highlighter_ini-
> > >highlight_default;
> > > >+                              break;
> > > >+                      case T_CLOSE_TAG:
> > > >+                              next_color = syntax_highlighter_ini-
> > >highlight_default;
> > > >+                              break;
> > > >+                      case T_CONSTANT_ENCAPSED_STRING:
> > > >+                              next_color = syntax_highlighter_ini-
> > >highlight_string;
> > > >+                              break;
> > > >+                      case '"':
> > > >+                              next_color = syntax_highlighter_ini-
> > >highlight_string;
> > > >+                              in_string = !in_string;
> > > >+                              break;
> > > >+                      case T_WHITESPACE:
> > > >+                              zend_html_puts_ex(LANG_SCNG(yy_text),
> > LANG_SCNG(yy_leng), last_color, &line, line_prefix TSRMLS_CC);  /* no
> > color needed */
> > > >+                              token.type = 0;
> > > >+                              continue;
> > > >+                              break;
> > > >+                      default:
> > > >+                              if (in_string) {
> > > >+                                      next_color =
> > syntax_highlighter_ini->highlight_string;
> > > >+                              } else if (token.type == 0) {
> > > >+                                      next_color =
> > syntax_highlighter_ini->highlight_keyword;
> > > >+                              } else {
> > > >+                                      next_color =
> > syntax_highlighter_ini->highlight_default;
> > > >+                              }
> > > >+                              break;
> > > >+              }
> > > >+
> > > >+              if (last_color != next_color) {
> > > >+                      last_color = next_color;
> > > >+                      zend_printf("</span><span style=\"color: %s\">",
> > last_color);
> > > >+
> > > >+              }
> > > >+              switch (token_type) {
> > > >+                      case T_END_HEREDOC:
> > > >+                              zend_html_puts_ex(token.value.str.val,
> > token.value.str.len, last_color, &line, line_prefix TSRMLS_CC);
> > > >+                              post_heredoc = 1;
> > > >+                              break;
> > > >+                      default:
> > > >+                              zend_html_puts_ex(LANG_SCNG(yy_text),
> > LANG_SCNG(yy_leng), last_color, &line, line_prefix TSRMLS_CC);
> > > >+                              if (post_heredoc) {
> > > >+                                       zend_html_putc_ex('\n',
> > last_color, &line, line_prefix);
> > > >+                                       post_heredoc = 0;
> > > >+                              }
> > > >+                              break;
> > > >+              }
> > > >+
> > > >+              if (token.type == IS_STRING) {
> > > >+                      switch (token_type) {
> > > >+                              case T_OPEN_TAG:
> > > >+                              case T_OPEN_TAG_WITH_ECHO:
> > > >+                              case T_CLOSE_TAG:
> > > >+                              case T_WHITESPACE:
> > > >+                              case T_COMMENT:
> > > >+                              case T_DOC_COMMENT:
> > > >+                                      break;
> > > >+                              default:
> > > >+                                      efree(token.value.str.val);
> > > >+                                      break;
> > > >+                      }
> > > >+              } else if (token_type == T_END_HEREDOC) {
> > > >+                      efree(token.value.str.val);
> > > >+              }
> > > >+              token.type = 0;
> > > >+      }
> > > >+      zend_printf("</span>");
> > > >+      zend_printf("</code></li></ol>");
> > > >+}
> > > >+
> > > >+
> > > >
> > > > ZEND_API void zend_strip(TSRMLS_D)
> > > > {
> > > >Index: Zend/zend_language_scanner.l
> > > >===================================================================
> > > >RCS file: /repository/ZendEngine2/zend_language_scanner.l,v
> > > >retrieving revision 1.124
> > > >diff -u -r1.124 zend_language_scanner.l
> > > >--- Zend/zend_language_scanner.l       7 Mar 2005 16:48:49 -0000
> > 1.124
> > > >+++ Zend/zend_language_scanner.l       12 Mar 2005 14:40:13 -0000
> > > >@@ -557,11 +557,11 @@
> > > >
> > > >
> > > > BEGIN_EXTERN_C()
> > > >-int highlight_file(char *filename, zend_syntax_highlighter_ini
> > *syntax_highlighter_ini TSRMLS_DC)
> > > >+int highlight_file_ex(char *filename, zend_syntax_highlighter_ini
> > *syntax_highlighter_ini, zend_bool numbered, zend_bool mark_lines, char
> > *line_prefix TSRMLS_DC)
> > > > {
> > > >       zend_lex_state original_lex_state;
> > > >       zend_file_handle file_handle;
> > > >-
> > > >+
> > > >       file_handle.type = ZEND_HANDLE_FILENAME;
> > > >       file_handle.filename = filename;
> > > >       file_handle.free_filename = 0;
> > > >@@ -571,7 +571,11 @@
> > > >               zend_message_dispatcher(ZMSG_FAILED_HIGHLIGHT_FOPEN,
> > filename);
> > > >               return FAILURE;
> > > >       }
> > > >-      zend_highlight(syntax_highlighter_ini TSRMLS_CC);
> > > >+      if (numbered) {
> > > >+          zend_highlight_numbered(syntax_highlighter_ini, mark_lines,
> > line_prefix TSRMLS_CC);
> > > >+      } else {
> > > >+          zend_highlight(syntax_highlighter_ini TSRMLS_CC);
> > > >+      }
> > > > #ifdef ZEND_MULTIBYTE
> > > >       if (SCNG(script_org)) {
> > > >               efree(SCNG(script_org));
> > > >@@ -587,7 +591,12 @@
> > > >       return SUCCESS;
> > > > }
> > > >
> > > >-int highlight_string(zval *str, zend_syntax_highlighter_ini
> > *syntax_highlighter_ini, char *str_name TSRMLS_DC)
> > > >+int highlight_file(char *filename, zend_syntax_highlighter_ini
> > *syntax_highlighter_ini TSRMLS_DC)
> > > >+{
> > > >+    return highlight_file_ex(filename, syntax_highlighter_ini, 0, 0,
> > NULL TSRMLS_CC);
> > > >+}
> > > >+
> > > >+int highlight_string_ex(zval *str, zend_syntax_highlighter_ini
> > *syntax_highlighter_ini, char *str_name, zend_bool numbered, zend_bool
> > mark_lines, char *line_prefix TSRMLS_DC)
> > > > {
> > > >       zend_lex_state original_lex_state;
> > > >       zval tmp = *str;
> > > >@@ -598,7 +607,11 @@
> > > >       if (zend_prepare_string_for_scanning(str, str_name
> > TSRMLS_CC)==FAILURE) {
> > > >               return FAILURE;
> > > >       }
> > > >-      zend_highlight(syntax_highlighter_ini TSRMLS_CC);
> > > >+      if (numbered) {
> > > >+          zend_highlight_numbered(syntax_highlighter_ini, mark_lines,
> > line_prefix TSRMLS_CC);
> > > >+      } else {
> > > >+          zend_highlight(syntax_highlighter_ini TSRMLS_CC);
> > > >+      }
> > > > #ifdef ZEND_MULTIBYTE
> > > >       if (SCNG(script_org)) {
> > > >               efree(SCNG(script_org));
> > > >@@ -613,6 +626,11 @@
> > > >       zval_dtor(str);
> > > >       return SUCCESS;
> > > > }
> > > >+
> > > >+int highlight_string(zval *str, zend_syntax_highlighter_ini
> > *syntax_highlighter_ini, char *str_name TSRMLS_DC)
> > > >+{
> > > >+    return highlight_string_ex(str, syntax_highlighter_ini, str_name,
> > 0, 0, NULL TSRMLS_CC);
> > > >+}
> > > > END_EXTERN_C()
> > > >
> > > > #ifdef ZEND_MULTIBYTE
> > > >Index: ext/standard/basic_functions.c
> > > >===================================================================
> > > >RCS file: /repository/php-src/ext/standard/basic_functions.c,v
> > > >retrieving revision 1.705
> > > >diff -u -r1.705 basic_functions.c
> > > >--- ext/standard/basic_functions.c     7 Mar 2005 19:37:26 -0000
> > 1.705
> > > >+++ ext/standard/basic_functions.c     12 Mar 2005 14:40:14 -0000
> > > >@@ -2353,15 +2353,19 @@
> > > >       syntax_highlighter_ini->highlight_string  =
> > INI_STR("highlight.string");
> > > > }
> > > >
> > > >-/* {{{ proto bool highlight_file(string file_name [, bool return] )
> > > >+/* {{{ proto bool highlight_file(string file_name [, bool return [,
> > bool numbered [, bool mark_lines [, string mark_prefix]]]] )
> > > >    Syntax highlight a source file */
> > > > PHP_FUNCTION(highlight_file)
> > > > {
> > > >       zval *filename;
> > > >       zend_syntax_highlighter_ini syntax_highlighter_ini;
> > > >       zend_bool i = 0;
> > > >+      zend_bool numbered = 0;
> > > >+      zend_bool mark_lines = 0;
> > > >+      char *line_prefix = NULL;
> > > >+      int line_prefix_len = 0;
> > > >
> > > >-      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|b",
> > &filename, &i) == FAILURE) {
> > > >+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|bbbs",
> > &filename, &i, &numbered, &mark_lines, &line_prefix, &line_prefix_len) ==
> > FAILURE) {
> > > >               RETURN_FALSE;
> > > >       }
> > > >       convert_to_string(filename);
> > > >@@ -2380,7 +2384,7 @@
> > > >
> > > >       php_get_highlight_struct(&syntax_highlighter_ini);
> > > >
> > > >-      if (highlight_file(Z_STRVAL_P(filename), &syntax_highlighter_ini
> > TSRMLS_CC) == FAILURE) {
> > > >+      if (highlight_file_ex(Z_STRVAL_P(filename),
> > &syntax_highlighter_ini, numbered, mark_lines, line_prefix TSRMLS_CC) ==
> > FAILURE) {
> > > >               RETURN_FALSE;
> > > >       }
> > > >
> > > >@@ -2472,7 +2476,7 @@
> > > > }
> > > > /* }}} */
> > > >
> > > >-/* {{{ proto bool highlight_string(string string [, bool return] )
> > > >+/* {{{ proto bool highlight_string(string string [, bool return [,
> > bool mark_lines [, string mark_prefix]]] )
> > > >    Syntax highlight a string or optionally return it */
> > > > PHP_FUNCTION(highlight_string)
> > > > {
> > > >@@ -2480,9 +2484,13 @@
> > > >       zend_syntax_highlighter_ini syntax_highlighter_ini;
> > > >       char *hicompiled_string_description;
> > > >       zend_bool  i = 0;
> > > >+      zend_bool numbered = 0;
> > > >+      zend_bool mark_lines = 0;
> > > >+      char *line_prefix = NULL;
> > > >+      int line_prefix_len = 0;
> > > >       int old_error_reporting = EG(error_reporting);
> > > >
> > > >-      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|b",
> > &expr, &i) == FAILURE) {
> > > >+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|bbbs",
> > &expr, &i, &numbered, &mark_lines, &line_prefix, &line_prefix_len) ==
> > FAILURE) {
> > > >               RETURN_FALSE;
> > > >       }
> > > >       convert_to_string(expr);
> > > >@@ -2497,7 +2505,7 @@
> > > >
> > > >       hicompiled_string_description =
> > zend_make_compiled_string_description("highlighted code" TSRMLS_CC);
> > > >
> > > >-      if (highlight_string(expr, &syntax_highlighter_ini,
> > hicompiled_string_description TSRMLS_CC) == FAILURE) {
> > > >+      if (highlight_string_ex(expr, &syntax_highlighter_ini,
> > hicompiled_string_description, numbered, mark_lines, line_prefix
> > TSRMLS_CC) == FAILURE) {
> > > >               efree(hicompiled_string_description);
> > > >               RETURN_FALSE;
> > > >       }
> > > >
> > > >
> > > >
> > >
> > > --
> > > PHP Internals - PHP Runtime Development Mailing List
> > > To unsubscribe, visit: http://www.php.net/unsub.php
> > >
> > >
> >
> >
> > --
> > Gordon P. Hemsley
> > [EMAIL PROTECTED]
> > http://www.lttp.net/ â http://cmsforme.sourceforge.net/
> >
> > --
> > PHP Internals - PHP Runtime Development Mailing List
> > To unsubscribe, visit: http://www.php.net/unsub.php
> >
> 
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
> 
> 


-- 
Gordon P. Hemsley
[EMAIL PROTECTED]
http://www.lttp.net/ â http://cmsforme.sourceforge.net/

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to