* Explode some of the more insane regexps.
authorjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Fri, 1 Jun 2007 23:40:43 +0000 (23:40 +0000)
committerjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Fri, 1 Jun 2007 23:40:43 +0000 (23:40 +0000)
IkiWiki.pm
IkiWiki/Plugin/camelcase.pm
debian/changelog
po/ikiwiki.pot

index 8143f5256d8618b9d5da77ff51e27780a845b6f5..015df1f74a644c49374279c9a22f701f3ba30d63 100644 (file)
@@ -33,7 +33,21 @@ sub defaultconfig () { #{{{
                qr/\.x?html?$/, qr/\.ikiwiki-new$/,
                qr/(^|\/).svn\//, qr/.arch-ids\//, qr/{arch}\//,
                qr/\.dpkg-tmp$/],
-       wiki_link_regexp => qr/\[\[(?:([^\]\|]+)\|)?([^\s\]#]+)(?:#([^\s\]]+))?\]\]/,
+       wiki_link_regexp => qr{
+               \[\[                    # beginning of link
+               (?:
+                       ([^\]\|]+)      # 1: link text
+                       \|              # followed by '|'
+               )?                      # optional
+
+               ([^\s\]#]+)             # 2: page to link to
+               (?:
+                       \#              # '#', beginning of anchor
+                       ([^\s\]]+)      # 3: anchor text
+               )?                      # optional
+
+               \]\]                    # end of link
+       }x,
        wiki_file_regexp => qr/(^[-[:alnum:]_.:\/+]+$)/,
        web_commit_regexp => qr/^web commit (by (.*?(?=: |$))|from (\d+\.\d+\.\d+\.\d+)):?(.*)/,
        verbose => 0,
@@ -599,7 +613,17 @@ sub preprocess ($$$;$$) { #{{{
                        # Note: preserve order of params, some plugins may
                        # consider it significant.
                        my @params;
-                       while ($params =~ /(?:(\w+)=)?(?:"""(.*?)"""|"([^"]+)"|(\S+))(?:\s+|$)/sg) {
+                       while ($params =~ m{
+                               (?:(\w+)=)?             # 1: named parameter key?
+                               (?:
+                                       """(.*?)"""     # 2: triple-quoted value
+                               |
+                                       "([^"]+)"       # 3: single-quoted value
+                               |
+                                       (\S+)           # 4: unquoted value
+                               )
+                               (?:\s+|$)               # delimiter to next param
+                       }sgx) {
                                my $key=$1;
                                my $val;
                                if (defined $2) {
@@ -647,7 +671,27 @@ sub preprocess ($$$;$$) { #{{{
                }
        };
        
-       $content =~ s{(\\?)\[\[(\w+)\s+((?:(?:\w+=)?(?:""".*?"""|"[^"]+"|[^\s\]]+)\s*)*)\]\]}{$handle->($1, $2, $3)}seg;
+       $content =~ s{
+               (\\?)           # 1: escape?
+               \[\[            # directive open
+               (\w+)           # 2: command
+               \s+
+               (               # 3: the parameters..
+                       (?:
+                               (?:\w+=)?               # named parameter key?
+                               (?:
+                                       """.*?"""       # triple-quoted value
+                                       |
+                                       "[^"]+"         # single-quoted value
+                                       |
+                                       [^\s\]]+        # unquoted value
+                               )
+                               \s*                     # whitespace or end
+                                                       # of directive
+                       )
+               *)              # 0 or more parameters
+               \]\]            # directive closed
+       }{$handle->($1, $2, $3)}sexg;
        return $content;
 } #}}}
 
@@ -977,7 +1021,21 @@ sub pagespec_translate ($) { #{{{
 
        # Convert spec to perl code.
        my $code="";
-       while ($spec=~m/\s*(\!|\(|\)|\w+\([^\)]+\)|[^\s()]+)\s*/ig) {
+       while ($spec=~m{
+               \s*             # ignore whitespace
+               (               # 1: match a single word
+                       \!              # !
+               |
+                       \(              # (
+               |
+                       \)              # )
+               |
+                       \w+\([^\)]+\)   # command(params)
+               |
+                       [^\s()]+        # any other text
+               )
+               \s*             # ignore whitespace
+       }igx) {
                my $word=$1;
                if (lc $word eq "and") {
                        $code.=" &&";
index 29d22b0dd3826ee1c4651af6447fa39970097648..dc89f1b90ec8c039a6ce3adbe8ee03cb60ae30df 100644 (file)
@@ -15,7 +15,20 @@ sub filter (@) { #{{{
 
        # Make CamelCase links work by promoting them to fullfledged
        # WikiLinks. This regexp is based on the one in Text::WikiFormat.
-       $params{content}=~s#(?<![[|"/>=])\b((?:[A-Z][a-z0-9]\w*){2,})#[[$1]]#g;
+       $params{content}=~s{
+               (?<![[|"/>=])   # try to avoid expanding non-links
+                               # with a zero width negative lookbehind for
+                               # characters that suggest it's not a link
+               \b              # word boundry
+               (
+                       (?:
+                               [A-Z]           # Uppercase start
+                               [a-z0-9]        # followed by lowercase
+                               \w*             # and rest of word
+                       )
+                       {2,}                    # repeated twice
+               )
+       }{[[$1]]}gx;
 
        return $params{content};
 } #}}}
index 0589f56878e7ce276dc6bcfd3fb3a39cc9690afd..e0d5ee2bf6bf2a6bd288ad589428049b841f69ec 100644 (file)
@@ -30,8 +30,9 @@ ikiwiki (2.2) UNRELEASED; urgency=low
   * Correct some issues with display of unhandled preprocessor directives.
   * Apply a patch from Carl Worth adding support for using globs in link()
     in a PageSpec.
+  * Explode some of the more insane regexps.
 
- -- Joey Hess <joeyh@debian.org>  Mon, 28 May 2007 21:56:11 -0400
+ -- Joey Hess <joeyh@debian.org>  Fri, 01 Jun 2007 19:39:38 -0400
 
 ikiwiki (2.1) unstable; urgency=low
 
index e63ead2fba21b1153a29cd1674c0d55bf24eca10..67c5356cf62248defd0d8cb4cd62f1935d6bfd9b 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-05-30 15:53-0400\n"
+"POT-Creation-Date: 2007-06-01 19:35-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -563,11 +563,11 @@ msgstr ""
 msgid "usage: ikiwiki [options] source dest"
 msgstr ""
 
-#: ../IkiWiki.pm:108
+#: ../IkiWiki.pm:122
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr ""
 
-#: ../IkiWiki.pm:155 ../IkiWiki.pm:156
+#: ../IkiWiki.pm:169 ../IkiWiki.pm:170
 msgid "Error"
 msgstr ""
 
@@ -575,7 +575,7 @@ msgstr ""
 #. translators: preprocessor directive name,
 #. translators: the second a page name, the
 #. translators: third a number.
-#: ../IkiWiki.pm:632
+#: ../IkiWiki.pm:656
 #, perl-format
 msgid "%s preprocessing loop detected on %s at depth %i"
 msgstr ""