Wiki2Go 1.17.5 → 1.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/Wiki2Go_firewall_blacklist.rb +8 -0
- data/bin/Wiki2Go_make_cvs_repository.rb +1 -0
- data/bin/Wiki2Go_make_site.rb +1 -2
- data/bin/Wiki2Go_update_site.rb +1 -2
- data/lib/Web2Go/CGIRequest.rb +8 -2
- data/lib/Web2Go/CGIResponse.rb +17 -14
- data/lib/Web2Go/MockRequest.rb +12 -2
- data/lib/Web2Go/MockResponse.rb +10 -7
- data/lib/Web2Go/WebrickRequest.rb +106 -101
- data/lib/Web2Go/WebrickResponse.rb +4 -8
- data/lib/Wiki2Go/BlackList.rb +48 -25
- data/lib/Wiki2Go/DotGraphics.rb +1 -1
- data/lib/Wiki2Go/FileStorage.rb +266 -266
- data/lib/Wiki2Go/HTMLFormatter.rb +28 -0
- data/lib/Wiki2Go/Install/config/chonqed_blacklist.txt +418 -0
- data/lib/Wiki2Go/Install/config/passwords +1 -1
- data/lib/Wiki2Go/Install/config/url_blacklist.txt +3855 -0
- data/lib/Wiki2Go/Install/make_repository.rb +32 -26
- data/lib/Wiki2Go/Install/make_site.rb +197 -111
- data/lib/Wiki2Go/Install/site/error.html +1 -1
- data/lib/Wiki2Go/Install/site/robots.txt +10 -1
- data/lib/Wiki2Go/Install/site/style.css +129 -64
- data/lib/Wiki2Go/Install/templates/admin.htm +1 -1
- data/lib/Wiki2Go/Install/templates/admin_pages/edit.txt +2 -1
- data/lib/Wiki2Go/Install/templates/admin_pages/format_for_fck.txt +31 -0
- data/lib/Wiki2Go/Install/templates/admin_pages/passwords.txt +1 -1
- data/lib/Wiki2Go/Install/templates/edit.htm +62 -46
- data/lib/Wiki2Go/Install/templates/full_footer.htm +31 -33
- data/lib/Wiki2Go/Install/templates/header.htm +0 -1
- data/lib/Wiki2Go/Install/templates/menu.htm +29 -0
- data/lib/Wiki2Go/Install/templates/pagelist.htm +46 -43
- data/lib/Wiki2Go/Install/templates/simple_footer.htm +20 -16
- data/lib/Wiki2Go/Install/templates/versionlist.htm +52 -40
- data/lib/Wiki2Go/Install/templates/view.htm +46 -29
- data/lib/Wiki2Go/Install/templates/wikiedit.htm +63 -0
- data/lib/Wiki2Go/Install/wiki/delete.png +0 -0
- data/lib/Wiki2Go/Install/wiki/style.css +133 -63
- data/lib/Wiki2Go/LineFormatter.rb +345 -197
- data/lib/Wiki2Go/Page.rb +16 -3
- data/lib/Wiki2Go/PrivateWikiConfig.rb +5 -5
- data/lib/Wiki2Go/PublicWikiConfig.rb +83 -37
- data/lib/Wiki2Go/ReadWriteWikiConfig.rb +8 -8
- data/lib/Wiki2Go/Server.rb +6 -1
- data/lib/Wiki2Go/SpamFilter.rb +32 -41
- data/lib/Wiki2Go/Web.rb +10 -3
- data/lib/Wiki2Go/Wiki2Go.rb +301 -94
- data/lib/Wiki2Go/Wiki2GoConfig.rb +87 -6
- data/lib/Wiki2Go/Wiki2GoServlet.rb +66 -12
- data/lib/Wiki2Go/WikiFormatter.rb +60 -30
- data/lib/Wiki2Go/cgi/diff.rb +20 -0
- data/lib/Wiki2Go/cgi/secure/log_rss.rb +21 -0
- data/lib/Wiki2Go/cgi/sidebyside.rb +20 -0
- data/lib/Wiki2Go/cgi/wikiedit.rb +20 -0
- data/lib/Wiki2Go/firewall_blacklist.rb +88 -0
- data/test/All.rb +5 -2
- data/test/TestBlackList.rb +70 -14
- data/test/TestConfig.rb +5 -5
- data/test/TestDiff.rb +95 -0
- data/test/TestFormatter.rb +14 -16
- data/test/TestHTMLFormatter.rb +37 -0
- data/test/TestInstall.rb +70 -27
- data/test/TestLineFormatter.rb +71 -15
- data/test/TestRSS.rb +8 -7
- data/test/TestRepository.rb +50 -0
- data/test/TestServer.rb +3 -8
- data/test/TestSpamFilter.rb +33 -1
- data/test/TestStorage.rb +11 -0
- data/test/TestWeb.rb +2 -2
- data/test/TestWiki2Go.rb +766 -166
- data/test/TestWiki2GoServlet.rb +1122 -524
- data/test/UnitTestFiles.rb +7 -3
- data/test/Wiki2GoConfigForTest.rb +40 -6
- data/test/checksite.rb +17 -50
- data/test/test_firewall_blacklist.rb +131 -0
- data/test/test_page.rb +45 -0
- data/test/testdata/Registration.rbl.txt +7 -0
- data/test/testdata/config/url_blacklist.txt +38822 -0
- data/test/testdata/expected_changes.html +1 -2
- data/test/testdata/expected_edit.html +108 -59
- data/test/testdata/expected_full_rss.xml +2 -2
- data/test/testdata/expected_out.html +97 -61
- data/test/testdata/expected_put.html +88 -53
- data/test/testdata/expected_save.html +88 -52
- data/test/testdata/expected_savehtml.html +88 -52
- data/test/testdata/expected_search.html +68 -53
- data/test/testdata/expected_upload.html +88 -53
- data/test/testdata/expected_versions.html +97 -82
- data/test/testdata/expected_view.html +97 -61
- data/test/testdata/firewall/iptables.config +37 -0
- data/test/testdata/firewall/user_blacklist.txt +162 -0
- data/test/testdata/logs/wiki.log +652 -0
- data/test/testdata/logs/wiki.log.0 +113 -0
- data/test/testdata/logs/wiki.log.1 +113 -0
- data/test/testdata/logs/wiki.log.2 +113 -0
- data/test/testdata/logs/wiki.log.3 +115 -0
- data/test/testdata/logs/wiki.log.4 +5 -0
- data/test/testdata/logs/wiki.log.5 +7 -0
- data/test/testdata/logs/wiki.log.6 +5 -0
- data/test/testdata/logs/wiki.log.7 +118 -0
- data/test/testdata/logs/wiki.log.8 +12 -0
- data/test/testdata/site/html/Xpday/rss.xml +53 -103
- data/test/testdata/texts/Bugs/FrontPage.txt +6 -0
- data/test/testdata/texts/Bugs/NoHidden.spam +17850 -0
- data/test/testdata/texts/Bugs/PairProgrammingParties.spam +102 -0
- data/test/testdata/texts/Bugs/PairProgrammingParties.txt +99 -0
- metadata +53 -7
- data/test/TestMail.rb +0 -29
- data/test/gc.log +0 -2
| Binary file | 
| @@ -10,76 +10,77 @@ body | |
| 10 10 | 
             
                text-align: justify;
         | 
| 11 11 | 
             
            }
         | 
| 12 12 |  | 
| 13 | 
            -
             | 
| 14 | 
            -
            {
         | 
| 15 | 
            -
                margin | 
| 16 | 
            -
                 | 
| 17 | 
            -
                 | 
| 18 | 
            -
                 | 
| 19 | 
            -
                 | 
| 20 | 
            -
                 | 
| 13 | 
            +
            /* Main structure */
         | 
| 14 | 
            +
            #container {
         | 
| 15 | 
            +
                margin: 0;
         | 
| 16 | 
            +
                margin-left: 2em;
         | 
| 17 | 
            +
                margin-right: 2em;
         | 
| 18 | 
            +
                background: #fff;
         | 
| 19 | 
            +
                border-left: 1px solid #ccc;
         | 
| 20 | 
            +
                border-right: 1px solid #ccc; 
         | 
| 21 | 
            +
                border-top: 1px solid #ccc;
         | 
| 22 | 
            +
                border-bottom: 1px solid #ccc; 
         | 
| 21 23 | 
             
            }
         | 
| 22 24 |  | 
| 23 | 
            -
             | 
| 25 | 
            +
            #menu
         | 
| 24 26 | 
             
            {
         | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 27 | 
            +
            	border-right: black thin solid;
         | 
| 28 | 
            +
            	background-color: #F8F7F0;
         | 
| 29 | 
            +
            	padding-right : 0.5em ;
         | 
| 30 | 
            +
             | 
| 28 31 | 
             
            }
         | 
| 29 32 |  | 
| 30 | 
            -
             | 
| 33 | 
            +
            #body
         | 
| 31 34 | 
             
            {
         | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 35 | 
            +
            	padding-left : 0.5em ;
         | 
| 36 | 
            +
            	padding-right : 0.5em ;
         | 
| 37 | 
            +
            	width: 100%;
         | 
| 38 | 
            +
            	background-color: #FFFFFF;
         | 
| 36 39 | 
             
            }
         | 
| 37 40 |  | 
| 38 | 
            -
             | 
| 41 | 
            +
            #header
         | 
| 39 42 | 
             
            {
         | 
| 40 | 
            -
             | 
| 43 | 
            +
            	padding-right: 1em;
         | 
| 44 | 
            +
            	padding-left: 1em;
         | 
| 45 | 
            +
            	padding-bottom: 0.5em;
         | 
| 46 | 
            +
            	margin: 0px;
         | 
| 47 | 
            +
            	padding-top: 0px;
         | 
| 48 | 
            +
            	background-color: #B82619;
         | 
| 49 | 
            +
            	border-bottom: grey thin solid;
         | 
| 50 | 
            +
            	color : White ;
         | 
| 41 51 | 
             
            }
         | 
| 42 52 |  | 
| 43 | 
            -
             | 
| 44 | 
            -
                text-align: center ;
         | 
| 45 | 
            -
            } 
         | 
| 46 | 
            -
             | 
| 47 | 
            -
            table.Header
         | 
| 53 | 
            +
            #header a:link
         | 
| 48 54 | 
             
            {
         | 
| 49 | 
            -
                 | 
| 50 | 
            -
                 | 
| 51 | 
            -
                 | 
| 52 | 
            -
                padding-top: 0em;
         | 
| 53 | 
            -
                color: black;
         | 
| 54 | 
            -
                background-color: white;
         | 
| 55 | 
            -
                text-align: left;
         | 
| 56 | 
            -
                border-bottom: 1px solid #ccc;
         | 
| 55 | 
            +
                color: White;
         | 
| 56 | 
            +
                font-weight: bolder ;
         | 
| 57 | 
            +
                text-decoration: none;
         | 
| 57 58 | 
             
            }
         | 
| 58 59 |  | 
| 59 | 
            -
             | 
| 60 | 
            -
             | 
| 61 | 
            -
             
         | 
| 62 | 
            -
                 | 
| 63 | 
            -
                margin: 100px 0 0 0;
         | 
| 64 | 
            -
                padding: 6px;
         | 
| 65 | 
            -
                color: #000;
         | 
| 66 | 
            -
                background: #fff;
         | 
| 67 | 
            -
                border-top: 1px solid #ccc;
         | 
| 60 | 
            +
            #header a:visited {
         | 
| 61 | 
            +
                color: White;
         | 
| 62 | 
            +
                text-decoration: none;
         | 
| 63 | 
            +
                font-weight: normal ;
         | 
| 68 64 | 
             
            }
         | 
| 69 65 |  | 
| 70 | 
            -
             | 
| 71 | 
            -
             | 
| 66 | 
            +
            #header a:hover
         | 
| 67 | 
            +
            {
         | 
| 68 | 
            +
            	color: cornsilk;
         | 
| 72 69 | 
             
            }
         | 
| 73 70 |  | 
| 74 | 
            -
             | 
| 71 | 
            +
            #header h1
         | 
| 75 72 | 
             
            {
         | 
| 76 | 
            -
             | 
| 73 | 
            +
            	color : White ;
         | 
| 77 74 | 
             
            }
         | 
| 78 75 |  | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
| 76 | 
            +
            #footer
         | 
| 77 | 
            +
            {
         | 
| 78 | 
            +
            	border-top: grey thin solid;
         | 
| 79 | 
            +
            	background-color : silver;
         | 
| 81 80 | 
             
            }
         | 
| 82 81 |  | 
| 82 | 
            +
            /* Links */
         | 
| 83 | 
            +
             | 
| 83 84 | 
             
            a:link
         | 
| 84 85 | 
             
            {
         | 
| 85 86 | 
             
                color: #a50a11;
         | 
| @@ -97,28 +98,76 @@ a:hover { | |
| 97 98 | 
             
                text-decoration: underline;
         | 
| 98 99 | 
             
            }
         | 
| 99 100 |  | 
| 100 | 
            -
             | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 103 | 
            -
             | 
| 104 | 
            -
                 | 
| 105 | 
            -
                 | 
| 106 | 
            -
                 | 
| 107 | 
            -
                 | 
| 108 | 
            -
             | 
| 109 | 
            -
             | 
| 110 | 
            -
             | 
| 111 | 
            -
             | 
| 112 | 
            -
                 | 
| 113 | 
            -
             | 
| 101 | 
            +
            /* Headers */
         | 
| 102 | 
            +
             | 
| 103 | 
            +
            h1
         | 
| 104 | 
            +
            {
         | 
| 105 | 
            +
                font-weight: bold;
         | 
| 106 | 
            +
                font-size: 28pt;
         | 
| 107 | 
            +
                color: black;
         | 
| 108 | 
            +
                margin : 0em ;
         | 
| 109 | 
            +
            }
         | 
| 110 | 
            +
             | 
| 111 | 
            +
            h2,h3,h4,h5,h6 
         | 
| 112 | 
            +
            {
         | 
| 113 | 
            +
                color:black 
         | 
| 114 | 
            +
            }
         | 
| 115 | 
            +
             | 
| 116 | 
            +
            h2,h3.frontpage {
         | 
| 117 | 
            +
                text-align: center ;
         | 
| 118 | 
            +
            } 
         | 
| 119 | 
            +
             | 
| 120 | 
            +
            /* Style for tables drawn with --- and | in wiki markup */
         | 
| 121 | 
            +
             | 
| 122 | 
            +
            table.wikitable
         | 
| 123 | 
            +
            {
         | 
| 124 | 
            +
            	border-collapse: collapse;
         | 
| 125 | 
            +
            }
         | 
| 126 | 
            +
             | 
| 127 | 
            +
            table.wikitable tr
         | 
| 128 | 
            +
            {
         | 
| 129 | 
            +
            	padding-right: 0.4em;
         | 
| 130 | 
            +
            	padding-left: 0.4em;
         | 
| 131 | 
            +
            	padding-bottom: 0.4em;
         | 
| 132 | 
            +
            	margin: 0em;
         | 
| 133 | 
            +
            	padding-top: 0.4em;
         | 
| 114 134 | 
             
            }
         | 
| 115 | 
            -
             | 
| 135 | 
            +
             | 
| 136 | 
            +
            table.wikitable td
         | 
| 137 | 
            +
            {
         | 
| 138 | 
            +
            	border-right: 1px solid;
         | 
| 139 | 
            +
            	padding-right: 0.5em;
         | 
| 140 | 
            +
            	border-top: 1px solid;
         | 
| 141 | 
            +
            	padding-left: 0.5em;
         | 
| 142 | 
            +
            	padding-bottom: 0.5em;
         | 
| 143 | 
            +
            	border-left: 1px solid;
         | 
| 144 | 
            +
            	padding-top: 0.5em;
         | 
| 145 | 
            +
            	border-bottom: 1px solid;
         | 
| 146 | 
            +
            }
         | 
| 147 | 
            +
             | 
| 148 | 
            +
            /* Menu items */
         | 
| 149 | 
            +
             | 
| 150 | 
            +
            #menu ul
         | 
| 151 | 
            +
            {
         | 
| 152 | 
            +
            	margin-left : 0 ;
         | 
| 153 | 
            +
            	padding-left : 0.5em ;
         | 
| 154 | 
            +
            }
         | 
| 155 | 
            +
             | 
| 156 | 
            +
            #menu li
         | 
| 157 | 
            +
            {
         | 
| 158 | 
            +
            	list-style-type: none;
         | 
| 159 | 
            +
            	margin-left : 0 ;
         | 
| 160 | 
            +
            	padding-left : 0 ;
         | 
| 161 | 
            +
            }
         | 
| 162 | 
            +
             | 
| 163 | 
            +
            /* Style for lists of pages or versions (recent changes, search, versions */
         | 
| 164 | 
            +
             | 
| 116 165 | 
             
            table.topiclist
         | 
| 117 166 | 
             
            {
         | 
| 118 167 | 
             
                width: 100%;
         | 
| 119 168 | 
             
            }
         | 
| 120 169 |  | 
| 121 | 
            -
            table.topiclist  | 
| 170 | 
            +
            table.topiclist td.date
         | 
| 122 171 | 
             
            {
         | 
| 123 172 | 
             
                font-weight: bold;
         | 
| 124 173 | 
             
            }
         | 
| @@ -131,3 +180,24 @@ table.topiclist tr.odd | |
| 131 180 | 
             
            table.topiclist tr.even
         | 
| 132 181 | 
             
            {
         | 
| 133 182 | 
             
            }
         | 
| 183 | 
            +
             | 
| 184 | 
            +
            /* Style for the display of differences */
         | 
| 185 | 
            +
            div.diff_kept
         | 
| 186 | 
            +
            {
         | 
| 187 | 
            +
            	display : block ;
         | 
| 188 | 
            +
            	font-family: 'Courier New';
         | 
| 189 | 
            +
            }
         | 
| 190 | 
            +
             | 
| 191 | 
            +
            div.diff_added
         | 
| 192 | 
            +
            {
         | 
| 193 | 
            +
            	background-color: #ffffcc;
         | 
| 194 | 
            +
            	display : block ;
         | 
| 195 | 
            +
            	font-family: 'Courier New';
         | 
| 196 | 
            +
            }
         | 
| 197 | 
            +
             | 
| 198 | 
            +
            div.diff_deleted
         | 
| 199 | 
            +
            {
         | 
| 200 | 
            +
            	background-color: #ffcc33;
         | 
| 201 | 
            +
            	display : block ;
         | 
| 202 | 
            +
            	font-family: 'Courier New';
         | 
| 203 | 
            +
            }
         | 
| @@ -8,9 +8,9 @@ require 'English' | |
| 8 8 | 
             
            module Wiki2Go
         | 
| 9 9 |  | 
| 10 10 | 
             
              class LineFormatter
         | 
| 11 | 
            -
             | 
| 11 | 
            +
              
         | 
| 12 12 | 
             
                attr_reader :config
         | 
| 13 | 
            -
             | 
| 13 | 
            +
                
         | 
| 14 14 | 
             
                def initialize(web,storage,config,generate_html,editable)
         | 
| 15 15 | 
             
                  @web = web
         | 
| 16 16 | 
             
                  @storage = storage
         | 
| @@ -23,36 +23,47 @@ module Wiki2Go | |
| 23 23 | 
             
                  @editable      = editable
         | 
| 24 24 | 
             
                  @absolute_urls = false
         | 
| 25 25 | 
             
                end
         | 
| 26 | 
            -
             | 
| 26 | 
            +
                
         | 
| 27 27 | 
             
                public
         | 
| 28 | 
            -
             | 
| 28 | 
            +
                
         | 
| 29 | 
            +
                # Format one line with wiki formatting
         | 
| 29 30 | 
             
                def format_line(line)
         | 
| 30 31 | 
             
                  @added_bullets = false
         | 
| 31 32 | 
             
                  line = escape_wiki_markers(line)
         | 
| 32 | 
            -
                  line =  | 
| 33 | 
            +
                  line = format_tags(line)
         | 
| 34 | 
            +
                  line = format_bullets(line)
         | 
| 35 | 
            +
                  line = format_markup(line)
         | 
| 33 36 | 
             
                  line = format_table(line)
         | 
| 34 37 | 
             
                  line = remove_markers(line)
         | 
| 35 38 | 
             
                  if !@added_bullets then
         | 
| 36 39 | 
             
                    emit_bullets
         | 
| 37 40 | 
             
                  end
         | 
| 38 | 
            -
             | 
| 41 | 
            +
                  
         | 
| 39 42 | 
             
                  return formatted_output(line)
         | 
| 40 43 | 
             
                end
         | 
| 41 | 
            -
             | 
| 44 | 
            +
                
         | 
| 45 | 
            +
                # Call when the last line has been formatted. We may need to close lists.
         | 
| 42 46 | 
             
                def formatting_done
         | 
| 43 47 | 
             
                  emit_bullets
         | 
| 44 48 | 
             
                  result =@pre_line 
         | 
| 45 49 | 
             
                  @pre_line = ''
         | 
| 46 50 | 
             
                  result
         | 
| 47 51 | 
             
                end
         | 
| 48 | 
            -
             | 
| 52 | 
            +
                
         | 
| 49 53 | 
             
                # Return the path to the script verb, with the right extension and parameters
         | 
| 50 54 | 
             
                # * verb = name of the verb (view, edit,...)
         | 
| 51 55 | 
             
                # * parameters = further parameters: web.name, web.current_page, ...
         | 
| 52 56 | 
             
                def make_verb_url(verb,*parameters)
         | 
| 53 57 | 
             
                  make_url(@web.script_prefix,verb + @web.script_extension,*parameters)
         | 
| 54 58 | 
             
                end
         | 
| 55 | 
            -
             | 
| 59 | 
            +
                
         | 
| 60 | 
            +
                # Return the path to the script verb, with the right extension and parameters
         | 
| 61 | 
            +
                # * verb = name of the verb (view, edit,...)
         | 
| 62 | 
            +
                # Adds current subwiki and page name
         | 
| 63 | 
            +
                def verb_url(verb)
         | 
| 64 | 
            +
                  return make_verb_url(verb,@web.name,@web.current_page)
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
                
         | 
| 56 67 | 
             
                # Return the path to the given resource. Nil and empty parameters are ignored
         | 
| 57 68 | 
             
                # The generated url is relative to the root of the site
         | 
| 58 69 | 
             
                def make_url(*parameters)
         | 
| @@ -65,15 +76,30 @@ module Wiki2Go | |
| 65 76 | 
             
                  end
         | 
| 66 77 | 
             
                  result.squeeze('/')
         | 
| 67 78 | 
             
                end
         | 
| 68 | 
            -
             | 
| 79 | 
            +
                
         | 
| 80 | 
            +
                # Return an <a> tag filled in.
         | 
| 81 | 
            +
                def link_to(url,label,follow=true)
         | 
| 82 | 
            +
                  nofollow = (follow ? '' : " rel=\"nofollow\"")
         | 
| 83 | 
            +
                  return "<a href=\"#{url}\"#{nofollow}>#{label}</a>"
         | 
| 84 | 
            +
                end
         | 
| 85 | 
            +
                
         | 
| 86 | 
            +
                # Return an <a target="_blank"> tag filled in.
         | 
| 87 | 
            +
                def link_to_new_page(url,label)
         | 
| 88 | 
            +
                  return "<a href=\"#{url}\" target=\"_blank\">#{label}</a>"
         | 
| 89 | 
            +
                end
         | 
| 90 | 
            +
                
         | 
| 91 | 
            +
                # Return absolute URL to current page
         | 
| 69 92 | 
             
                def absolute_url
         | 
| 70 93 | 
             
                  absolute_url_of_topic(@web.current_page)
         | 
| 71 94 | 
             
                end
         | 
| 72 | 
            -
             | 
| 95 | 
            +
                
         | 
| 96 | 
            +
                # Return absolute URL of given page
         | 
| 73 97 | 
             
                def absolute_url_of_topic(topic)
         | 
| 74 98 | 
             
                  return @web.base_url.chop + view_page_url(@web.name,topic)
         | 
| 75 99 | 
             
                end
         | 
| 76 | 
            -
             | 
| 100 | 
            +
                
         | 
| 101 | 
            +
                # Return a link suitable for creating a new page with the rich editor, if editing is allowed
         | 
| 102 | 
            +
                # Return the name of the page, otherwise
         | 
| 77 103 | 
             
                def edit_link(subwiki,page,name)
         | 
| 78 104 | 
             
                  if @editable then
         | 
| 79 105 | 
             
                    return name + edit_this_link(subwiki,page,"?")
         | 
| @@ -81,51 +107,115 @@ module Wiki2Go | |
| 81 107 | 
             
                    return name 
         | 
| 82 108 | 
             
                  end
         | 
| 83 109 | 
             
                end
         | 
| 84 | 
            -
             | 
| 110 | 
            +
                
         | 
| 111 | 
            +
                # Return a link suitable for editing a page with the rich editor, if editing is allowed
         | 
| 112 | 
            +
                # Return empty string, otherwise
         | 
| 85 113 | 
             
                def edit_this_link(subwiki,page,name)
         | 
| 86 114 | 
             
                  if @editable then
         | 
| 87 | 
            -
                    return  | 
| 115 | 
            +
                    return link_to(make_verb_url('edit',subwiki,page),name,false)
         | 
| 88 116 | 
             
                  else
         | 
| 89 117 | 
             
                    return "" 
         | 
| 90 118 | 
             
                  end
         | 
| 91 119 | 
             
                end
         | 
| 92 | 
            -
             | 
| 93 | 
            -
                 | 
| 120 | 
            +
                
         | 
| 121 | 
            +
                # Return a link suitable for creating a new page with the wiki editor, if editing is allowed
         | 
| 122 | 
            +
                # Return the name of the page, otherwise
         | 
| 123 | 
            +
                def wikiedit_link(subwiki,page,name)
         | 
| 94 124 | 
             
                  if @editable then
         | 
| 95 | 
            -
                    return  | 
| 125 | 
            +
                    return name + wikiedit_this_link(subwiki,page,"?")
         | 
| 96 126 | 
             
                  else
         | 
| 97 | 
            -
                    return  | 
| 127 | 
            +
                    return name 
         | 
| 98 128 | 
             
                  end
         | 
| 99 129 | 
             
                end
         | 
| 100 | 
            -
             | 
| 101 | 
            -
                 | 
| 102 | 
            -
             | 
| 130 | 
            +
                
         | 
| 131 | 
            +
                # Return a link suitable for editing a page with the wiki editor, if editing is allowed
         | 
| 132 | 
            +
                # Return empty string, otherwise
         | 
| 133 | 
            +
                def wikiedit_this_link(subwiki,page,name)
         | 
| 134 | 
            +
                  if @editable then
         | 
| 135 | 
            +
                    return link_to(make_verb_url('wikiedit',subwiki,page),name,false)
         | 
| 136 | 
            +
                  else
         | 
| 137 | 
            +
                    return "" 
         | 
| 138 | 
            +
                  end
         | 
| 103 139 | 
             
                end
         | 
| 104 | 
            -
             | 
| 105 | 
            -
                 | 
| 106 | 
            -
             | 
| 140 | 
            +
                
         | 
| 141 | 
            +
                # Return a link suitable for creating a new page with the confgured editor, if editing is allowed
         | 
| 142 | 
            +
                # Return the name of the page, otherwise
         | 
| 143 | 
            +
                def editor_link(subwiki,page,name)
         | 
| 144 | 
            +
                  if @editable then
         | 
| 145 | 
            +
                    return editor_this_link(subwiki,page,name)
         | 
| 146 | 
            +
                  else
         | 
| 147 | 
            +
                    return name 
         | 
| 148 | 
            +
                  end
         | 
| 107 149 | 
             
                end
         | 
| 108 | 
            -
             | 
| 109 | 
            -
             | 
| 110 | 
            -
             | 
| 150 | 
            +
                
         | 
| 151 | 
            +
                    # Return a link suitable for creating a new page with the confgured editor, if editing is allowed
         | 
| 152 | 
            +
                # Return the name of the page, otherwise
         | 
| 153 | 
            +
                def editor_link2(subwiki,page,name)
         | 
| 154 | 
            +
                  if @editable then
         | 
| 155 | 
            +
                    return name + editor_this_link(subwiki,page,"?")
         | 
| 156 | 
            +
                  else
         | 
| 157 | 
            +
                    return name 
         | 
| 158 | 
            +
                  end
         | 
| 111 159 | 
             
                end
         | 
| 112 | 
            -
             | 
| 160 | 
            +
                
         | 
| 161 | 
            +
                # Return a link suitable for editing a page with the configured editor, if editing is allowed
         | 
| 162 | 
            +
                # Return empty string, otherwise
         | 
| 163 | 
            +
                def editor_this_link(subwiki,page,name)
         | 
| 164 | 
            +
                  if @editable then
         | 
| 165 | 
            +
                    return link_to(make_verb_url(@config.editor,subwiki,page),name,false)
         | 
| 166 | 
            +
                  else
         | 
| 167 | 
            +
                    return "" 
         | 
| 168 | 
            +
                  end
         | 
| 169 | 
            +
                end
         | 
| 170 | 
            +
                
         | 
| 171 | 
            +
                # URL to save current page in current subwiki
         | 
| 113 172 | 
             
                def save_url
         | 
| 114 | 
            -
                   | 
| 173 | 
            +
                  make_verb_url('save',@web.name,@web.current_page)
         | 
| 115 174 | 
             
                end
         | 
| 116 | 
            -
             | 
| 117 | 
            -
                 | 
| 118 | 
            -
             | 
| 175 | 
            +
                
         | 
| 176 | 
            +
                # Return a link suitable for saving a page, if editing is allowed
         | 
| 177 | 
            +
                # Return page name, otherwise
         | 
| 178 | 
            +
                #   def save_this_link(subwiki,page)
         | 
| 179 | 
            +
                #       if @editable then
         | 
| 180 | 
            +
                #           return make_verb_url('save',subwiki,page) 
         | 
| 181 | 
            +
                #else
         | 
| 182 | 
            +
                #return page 
         | 
| 183 | 
            +
                #end
         | 
| 184 | 
            +
                #end
         | 
| 185 | 
            +
                
         | 
| 186 | 
            +
                # URL to remove spam by user
         | 
| 187 | 
            +
                def removespam_url(user)
         | 
| 188 | 
            +
                  return make_verb_url('removespam',@web.name,'') 
         | 
| 119 189 | 
             
                end
         | 
| 120 | 
            -
             | 
| 121 | 
            -
                 | 
| 122 | 
            -
             | 
| 190 | 
            +
                
         | 
| 191 | 
            +
                # URL to display the different versions of a page
         | 
| 192 | 
            +
                def versions_url(page)
         | 
| 193 | 
            +
                  return make_verb_url('versions',@web.name,page)
         | 
| 123 194 | 
             
                end
         | 
| 124 | 
            -
             | 
| 125 | 
            -
                 | 
| 126 | 
            -
             | 
| 195 | 
            +
                
         | 
| 196 | 
            +
                # Link to display the different versions of a page
         | 
| 197 | 
            +
                def versions_link(page,label)
         | 
| 198 | 
            +
                  return link_to(versions_url(page),label,false)
         | 
| 127 199 | 
             
                end
         | 
| 128 | 
            -
             | 
| 200 | 
            +
                
         | 
| 201 | 
            +
                alias :version_url :versions_url
         | 
| 202 | 
            +
                alias :version_link :versions_link
         | 
| 203 | 
            +
                
         | 
| 204 | 
            +
                # URL to search for (optional) text
         | 
| 205 | 
            +
                def search_url(for_text=nil)
         | 
| 206 | 
            +
                  parameter = for_text.nil? ? '' :  '?text=' + CGI::escape(for_text)
         | 
| 207 | 
            +
                  return make_verb_url('search',@web.name) + parameter
         | 
| 208 | 
            +
                end
         | 
| 209 | 
            +
                
         | 
| 210 | 
            +
                # Link to search for given text, with (optional) label to display within link
         | 
| 211 | 
            +
                def search_link(for_text,label=nil)
         | 
| 212 | 
            +
                  label ||= for_text
         | 
| 213 | 
            +
                  return link_to(search_url(for_text),label,false)
         | 
| 214 | 
            +
                end
         | 
| 215 | 
            +
                
         | 
| 216 | 
            +
                alias :search_link2 :search_link
         | 
| 217 | 
            +
                
         | 
| 218 | 
            +
                # URL of 'recent changes' page
         | 
| 129 219 | 
             
                def changes_url
         | 
| 130 220 | 
             
                  if @generate_html then 
         | 
| 131 221 | 
             
                    return make_url(@web.name,'recent_changes.html') 
         | 
| @@ -133,114 +223,159 @@ module Wiki2Go | |
| 133 223 | 
             
                    return make_verb_url('changes',@web.name)
         | 
| 134 224 | 
             
                  end
         | 
| 135 225 | 
             
                end
         | 
| 136 | 
            -
             | 
| 137 | 
            -
                 | 
| 138 | 
            -
             | 
| 139 | 
            -
             | 
| 140 | 
            -
             | 
| 141 | 
            -
                def view_page_url(subwiki,page)
         | 
| 142 | 
            -
                  if @generate_html then 
         | 
| 143 | 
            -
                    return make_url(subwiki,page + ".html") 
         | 
| 144 | 
            -
                  else
         | 
| 145 | 
            -
                    return make_verb_url('view',subwiki,page)
         | 
| 146 | 
            -
                  end
         | 
| 226 | 
            +
                
         | 
| 227 | 
            +
                # Link to 'recent changes' page
         | 
| 228 | 
            +
                def changes_link(label)
         | 
| 229 | 
            +
                  return link_to(changes_url,label,false)
         | 
| 147 230 | 
             
                end
         | 
| 148 | 
            -
             | 
| 149 | 
            -
             | 
| 231 | 
            +
                
         | 
| 232 | 
            +
                # URL to the given page in the given subwiki
         | 
| 233 | 
            +
                # URL is relative or absolute depending on @absolute_urls setting
         | 
| 234 | 
            +
                def view_url(subwiki,page)
         | 
| 150 235 | 
             
                  if @absolute_urls then
         | 
| 151 236 | 
             
                    return @web.base_url.chop + view_page_url(subwiki,page)
         | 
| 152 237 | 
             
                  else
         | 
| 153 238 | 
             
                    return view_page_url(subwiki,page)
         | 
| 154 239 | 
             
                  end
         | 
| 155 240 | 
             
                end
         | 
| 156 | 
            -
             | 
| 157 241 |  | 
| 158 | 
            -
             | 
| 242 | 
            +
                # Link to view a page 
         | 
| 159 243 | 
             
                def view_link(subwiki,page,name)
         | 
| 160 244 | 
             
                  if subwiki == @web.name then
         | 
| 161 | 
            -
                    return  | 
| 245 | 
            +
                    return link_to(view_url(subwiki,page),name)
         | 
| 162 246 | 
             
                  else
         | 
| 163 | 
            -
                     | 
| 247 | 
            +
                    if page == name then
         | 
| 248 | 
            +
                      return link_to(view_url(subwiki,page),"#{subwiki}:#{name}")
         | 
| 249 | 
            +
                    else 
         | 
| 250 | 
            +
                      return link_to(view_url(subwiki,page),name)
         | 
| 251 | 
            +
                    end
         | 
| 164 252 | 
             
                  end
         | 
| 165 253 | 
             
                end
         | 
| 166 | 
            -
             | 
| 167 | 
            -
                 | 
| 168 | 
            -
             | 
| 169 | 
            -
             | 
| 170 | 
            -
             | 
| 171 | 
            -
             | 
| 254 | 
            +
                
         | 
| 255 | 
            +
                # Link to a non-wikipages
         | 
| 256 | 
            +
                # Images are rendered inline
         | 
| 257 | 
            +
                # .rbl pages are performed
         | 
| 258 | 
            +
                # HTML files are linked to
         | 
| 259 | 
            +
                # Other files are opened in a new browser window
         | 
| 260 | 
            +
                def resource_link(subwiki,page,name)
         | 
| 261 | 
            +
                  if page =~ /^(.+)\.(gif|jpg|jpeg|png)$/i then
         | 
| 262 | 
            +
                    filename = $1
         | 
| 263 | 
            +
                    alt_label = name
         | 
| 264 | 
            +
                    if page == name || url?(name) then
         | 
| 265 | 
            +
                      alt_label = filename
         | 
| 266 | 
            +
                    end
         | 
| 267 | 
            +
                    image_link = "<img src=\"#{resource_url(page)}\" border=0 alt=\"#{alt_label}\" >"
         | 
| 268 | 
            +
                    if url?(name) then
         | 
| 269 | 
            +
                      return redirect_link(image_link,name)
         | 
| 172 270 | 
             
                    else
         | 
| 173 | 
            -
                      return  | 
| 271 | 
            +
                      return image_link
         | 
| 174 272 | 
             
                    end
         | 
| 175 | 
            -
                   | 
| 176 | 
            -
                     | 
| 273 | 
            +
                  elsif page =~ /^(.*)\.rbl$/i then
         | 
| 274 | 
            +
                    page_name = $1
         | 
| 275 | 
            +
                    if page == name then
         | 
| 276 | 
            +
                      name = page_name
         | 
| 277 | 
            +
                    end
         | 
| 278 | 
            +
                    return perform_link(subwiki,page,name)
         | 
| 279 | 
            +
                  elsif page =~ /^(.+)\.html?$/i then
         | 
| 280 | 
            +
                    return link_to(resource_url(page),name)
         | 
| 281 | 
            +
                  else
         | 
| 282 | 
            +
                    return link_to_new_page(resource_url(page),name)
         | 
| 177 283 | 
             
                  end
         | 
| 178 284 | 
             
                end
         | 
| 179 285 |  | 
| 180 | 
            -
                 | 
| 181 | 
            -
             | 
| 286 | 
            +
                # URL to a specific version of a page    
         | 
| 287 | 
            +
                def view_version_url(subwiki,page,version)
         | 
| 288 | 
            +
                  return make_verb_url('view',subwiki,page)+query_string( 'version' => version )
         | 
| 182 289 | 
             
                end
         | 
| 183 | 
            -
             | 
| 184 | 
            -
                 | 
| 185 | 
            -
             | 
| 290 | 
            +
                
         | 
| 291 | 
            +
                # Link to a specific version of a page
         | 
| 292 | 
            +
                def view_version_link(subwiki,page,name,version)
         | 
| 293 | 
            +
                  return link_to(view_version_url(subwiki,page,version),name)
         | 
| 186 294 | 
             
                end
         | 
| 187 | 
            -
             | 
| 188 | 
            -
                 | 
| 189 | 
            -
             | 
| 190 | 
            -
                   | 
| 295 | 
            +
                
         | 
| 296 | 
            +
                # URL to diff page versions
         | 
| 297 | 
            +
                def diff_url(subwiki,page,from,to)
         | 
| 298 | 
            +
                  params = Hash.new
         | 
| 299 | 
            +
                  params['from'] = from if from >= 0
         | 
| 300 | 
            +
                  params['to'] = to if to >= 0
         | 
| 301 | 
            +
                  return make_verb_url('diff',subwiki,page)+query_string( params )
         | 
| 191 302 | 
             
                end
         | 
| 192 | 
            -
             | 
| 193 | 
            -
                 | 
| 194 | 
            -
             | 
| 303 | 
            +
                
         | 
| 304 | 
            +
                # Link to page version
         | 
| 305 | 
            +
                def diff_link(subwiki,page,name,from,to)
         | 
| 306 | 
            +
                  return link_to(diff_url(subwiki,page,from,to),name,false) if from == -1 && to == -1
         | 
| 307 | 
            +
                  return '' if from < 0
         | 
| 308 | 
            +
                  return '' if from >= to
         | 
| 309 | 
            +
                  
         | 
| 310 | 
            +
                  return link_to(diff_url(subwiki,page,from,to),name,false)
         | 
| 195 311 | 
             
                end
         | 
| 196 | 
            -
             | 
| 312 | 
            +
                
         | 
| 313 | 
            +
                # URL to side by side view of two page versions
         | 
| 314 | 
            +
                def sidebyside_url(subwiki,page,from,to)
         | 
| 315 | 
            +
                  params = Hash.new
         | 
| 316 | 
            +
                  params['from'] = from if from >= 0
         | 
| 317 | 
            +
                  params['to'] = to if to >= 0
         | 
| 318 | 
            +
                  return make_verb_url('sidebyside',subwiki,page)+query_string( params )
         | 
| 319 | 
            +
                end
         | 
| 320 | 
            +
                
         | 
| 321 | 
            +
                # Link to side by side view of two page versions
         | 
| 322 | 
            +
                def sidebyside_link(subwiki,page,name,from,to)
         | 
| 323 | 
            +
                  return link_to(sidebyside_url(subwiki,page,from,to),name,false) if from == -1 && to == -1
         | 
| 324 | 
            +
                  return '' if from < 0
         | 
| 325 | 
            +
                  return '' if from >= to
         | 
| 326 | 
            +
                  
         | 
| 327 | 
            +
                  return link_to(sidebyside_url(subwiki,page,from,to),name,false)
         | 
| 328 | 
            +
                end
         | 
| 329 | 
            +
                
         | 
| 330 | 
            +
                # Link to admin page
         | 
| 197 331 | 
             
                def admin_link(page,name)
         | 
| 198 | 
            -
                  return  | 
| 332 | 
            +
                  return link_to(make_verb_url('admin',page),name)
         | 
| 199 333 | 
             
                end
         | 
| 200 | 
            -
             | 
| 201 | 
            -
             | 
| 334 | 
            +
                
         | 
| 335 | 
            +
                
         | 
| 202 336 | 
             
                def redirect_url(url)
         | 
| 203 337 | 
             
                  if @config.redirect_url?(@web,url) then
         | 
| 204 | 
            -
                     | 
| 205 | 
            -
                    return redirected_url
         | 
| 338 | 
            +
                    return make_verb_url('redirect',@web.name) + "?url=" + CGI::escape(url) 
         | 
| 206 339 | 
             
                  else
         | 
| 207 340 | 
             
                    return url
         | 
| 208 341 | 
             
                  end
         | 
| 209 342 | 
             
                end
         | 
| 210 | 
            -
             | 
| 343 | 
            +
                
         | 
| 211 344 | 
             
                def redirect_link(label,url)
         | 
| 212 345 | 
             
                  if @config.redirect_url?(@web,url) then
         | 
| 213 | 
            -
                     | 
| 214 | 
            -
                    return "<a href=\"#{redirected_url}\" rel=\"nofollow\" target=\"_blank\">#{label}</a>"
         | 
| 346 | 
            +
                    return "<a href=\"#{redirect_url(url)}\" rel=\"nofollow\" target=\"_blank\">#{label}</a>"
         | 
| 215 347 | 
             
                  else
         | 
| 216 | 
            -
                    return  | 
| 348 | 
            +
                    return link_to_new_page(url,label)
         | 
| 217 349 | 
             
                  end
         | 
| 218 | 
            -
             | 
| 350 | 
            +
                  
         | 
| 351 | 
            +
                end
         | 
| 352 | 
            +
                
         | 
| 353 | 
            +
                def escape_spaces(name)
         | 
| 354 | 
            +
                  name.gsub(/ /,'%20')
         | 
| 219 355 | 
             
                end
         | 
| 220 356 |  | 
| 221 | 
            -
             | 
| 357 | 
            +
                # URL to a static resource (under the html subdirectory of the site)
         | 
| 222 358 | 
             
                def resource_url(name)
         | 
| 223 359 | 
             
                  if @absolute_urls then
         | 
| 224 | 
            -
                    @web.base_url.chop + make_url('html',@web.name,name)
         | 
| 360 | 
            +
                    @web.base_url.chop + make_url('html',@web.name,escape_spaces(name))
         | 
| 225 361 | 
             
                  else
         | 
| 226 | 
            -
                    make_url('html',@web.name,name)
         | 
| 362 | 
            +
                    make_url('html',@web.name,escape_spaces(name))
         | 
| 227 363 | 
             
                  end
         | 
| 228 364 | 
             
                end
         | 
| 229 | 
            -
             | 
| 365 | 
            +
                
         | 
| 366 | 
            +
                # Encode a mail address with javascript, so that it isn't harvestable
         | 
| 230 367 | 
             
                def encode_mail_to(addr) 
         | 
| 231 | 
            -
             | 
| 232 368 | 
             
                  addr =~ /(.*)@(.*)/ ;
         | 
| 233 369 | 
             
                  name = $1 ;
         | 
| 234 370 | 
             
                  site = $2 ;
         | 
| 235 | 
            -
             | 
| 236 | 
            -
                  return  "<a href=\"#{view_url(@web.name,"MailFormattingRules")}\" onmouseover=\"this.href='mai' + 'lto:' + '#{name}' + '@' + '#{site}'\">#{name}</a>" 
         | 
| 371 | 
            +
                  return  "<a href=\"#{view_url(@web.name,"MailFormattingRules")}\" rel=\"nofollow\" onmouseover=\"this.href='mai' + 'lto:' + '#{name}' + '@' + '#{site}'\">#{name}</a>" 
         | 
| 237 372 | 
             
                end
         | 
| 238 | 
            -
             | 
| 373 | 
            +
                
         | 
| 239 374 | 
             
                alias :encodeMailTo :encode_mail_to
         | 
| 240 | 
            -
             | 
| 375 | 
            +
                
         | 
| 241 376 | 
             
                private
         | 
| 242 | 
            -
             | 
| 243 | 
            -
             | 
| 377 | 
            +
                
         | 
| 378 | 
            +
                
         | 
| 244 379 | 
             
                def append(before,match,after)
         | 
| 245 380 | 
             
                  result = ''
         | 
| 246 381 | 
             
                  result += before if !before.nil?
         | 
| @@ -248,21 +383,67 @@ module Wiki2Go | |
| 248 383 | 
             
                  result += after if !after.nil?
         | 
| 249 384 | 
             
                  result
         | 
| 250 385 | 
             
                end
         | 
| 251 | 
            -
             | 
| 386 | 
            +
                
         | 
| 387 | 
            +
                def format_tags(text)
         | 
| 388 | 
            +
                  original = text.dup
         | 
| 389 | 
            +
                  fragments = []      
         | 
| 390 | 
            +
                  while ! text.nil? && text.length > 0
         | 
| 391 | 
            +
                    if text =~ /<(\S[^>]*)\>/ then
         | 
| 392 | 
            +
                      before,match,text = $`,$1,$'
         | 
| 393 | 
            +
                      fragments << format_wiki_markup(before)
         | 
| 394 | 
            +
                      fragments << escape_url_markers(format_tag(match))
         | 
| 395 | 
            +
                    else
         | 
| 396 | 
            +
                      fragments << format_wiki_markup(text)
         | 
| 397 | 
            +
                      break
         | 
| 398 | 
            +
                    end
         | 
| 399 | 
            +
                  end
         | 
| 400 | 
            +
                  
         | 
| 401 | 
            +
                  fragments.join
         | 
| 402 | 
            +
                end
         | 
| 403 | 
            +
                
         | 
| 252 404 | 
             
                def format_tag(text)
         | 
| 253 | 
            -
                  text = text.gsub(/" | 
| 254 | 
            -
             | 
| 405 | 
            +
                  text = text.gsub(/ target="_blank"/,'')
         | 
| 406 | 
            +
                  text = text.gsub(/^a (.*)"((http|ftp|gopher|news|https)\:[^"]*)"(.*)/i) { "a " + $1 + external_url($2) + $4 } 
         | 
| 407 | 
            +
                  
         | 
| 255 408 | 
             
                  return '<' + text + '>'
         | 
| 256 409 | 
             
                end
         | 
| 257 | 
            -
             | 
| 258 | 
            -
             | 
| 410 | 
            +
                
         | 
| 411 | 
            +
                # Relative URL to the given page in the given subwiki
         | 
| 412 | 
            +
                def view_page_url(subwiki,page)
         | 
| 413 | 
            +
                  if @generate_html && !Page.is_dynamic?(page) then 
         | 
| 414 | 
            +
                    return make_url(subwiki,page + ".html") 
         | 
| 415 | 
            +
                  else
         | 
| 416 | 
            +
                    return make_verb_url('view',subwiki,page)
         | 
| 417 | 
            +
                  end
         | 
| 418 | 
            +
                end
         | 
| 419 | 
            +
                
         | 
| 420 | 
            +
                def perform_link(subwiki,page,name)
         | 
| 421 | 
            +
                  if @storage.exists?(File.join(subwiki,page)) then
         | 
| 422 | 
            +
                    url = make_verb_url('view',subwiki,page)
         | 
| 423 | 
            +
                    if subwiki == @web.name then
         | 
| 424 | 
            +
                      return link_to(url,name)
         | 
| 425 | 
            +
                    else
         | 
| 426 | 
            +
                      return link_to(url,"#{subwiki}:#{name}")
         | 
| 427 | 
            +
                    end
         | 
| 428 | 
            +
                  else 
         | 
| 429 | 
            +
                    return editor_link2(subwiki,page,name)
         | 
| 430 | 
            +
                  end
         | 
| 431 | 
            +
                end
         | 
| 432 | 
            +
                
         | 
| 433 | 
            +
                def query_string(parameters)
         | 
| 434 | 
            +
                  return "" if parameters.nil? || parameters.size == 0
         | 
| 435 | 
            +
                  return "?" + parameters.collect { |key,value| key.to_s + '=' + CGI::escape(value.to_s)}.sort.join('&')
         | 
| 436 | 
            +
                end
         | 
| 437 | 
            +
                
         | 
| 438 | 
            +
                
         | 
| 439 | 
            +
                
         | 
| 259 440 | 
             
                def format_wiki_markup(line)
         | 
| 260 441 | 
             
                  if line =~ /^(.*)\{\!(.*)\!\}(.*)$/im then
         | 
| 261 442 | 
             
                    before,match,after = $1,$2,$3
         | 
| 262 443 | 
             
                    return append(format_wiki_markup(before),match,format_wiki_markup(after))
         | 
| 263 | 
            -
                  elsif line =~ /^(.*)<(\S.*)\>(.*)$/ then
         | 
| 264 | 
            -
                    before,match,after = $1,$2,$3
         | 
| 265 | 
            -
                    line =  append(format_wiki_markup(before),escape_url_markers(format_tag(match)),format_wiki_markup(after))
         | 
| 444 | 
            +
                    #      elsif line =~ /^(.*)<(\S.*)\>(.*)$/ then
         | 
| 445 | 
            +
                    #        before,match,after = $1,$2,$3
         | 
| 446 | 
            +
                    #        line =  append(format_wiki_markup(before),escape_url_markers(format_tag(match)),format_wiki_markup(after))
         | 
| 266 447 | 
             
                  elsif line =~ /^(.*)\{\%([^\}]*)\%\}(.*)$/ then
         | 
| 267 448 | 
             
                    before,match,after = $1,$2,$3
         | 
| 268 449 | 
             
                    line = append(format_wiki_markup(before),escape_url_markers(format_dynamic_link(match)),format_wiki_markup(after))
         | 
| @@ -274,34 +455,32 @@ module Wiki2Go | |
| 274 455 | 
             
                    line = append(format_wiki_markup(before),escape_url_markers(format_forced_link(match)),format_wiki_markup(after))
         | 
| 275 456 | 
             
                  elsif line =~ /^(.*)((http|ftp|gopher|news|https)\:\/\/(\w|\/|\.|_|-|\?|\=|&|;|\~|#|,)+)(.*)$/ then
         | 
| 276 457 | 
             
                    before,match,after = $1,$2,$5
         | 
| 277 | 
            -
                    line = append(format_wiki_markup(before),escape_url_markers(external_link(match)),format_wiki_markup(after))
         | 
| 458 | 
            +
                    line = append(format_wiki_markup(before),escape_url_markers(external_link(nil,match)),format_wiki_markup(after))
         | 
| 278 459 | 
             
                  elsif line =~ /^(.*)mailto\:([a-zA-Z0-9\-\_\.]+@[a-zA-Z0-9\-\_\.]+)(.*)$/ then
         | 
| 279 460 | 
             
                    before,match,after = $1,$2,$3
         | 
| 280 461 | 
             
                    line = append(format_wiki_markup(before),escape_url_markers(encode_mail_to(match)),format_wiki_markup(after))          
         | 
| 281 462 | 
             
                  else
         | 
| 282 463 | 
             
                    line = format_brackets(line)
         | 
| 283 464 | 
             
                    line = format_entities(line)
         | 
| 284 | 
            -
                    line =  | 
| 465 | 
            +
                    line = format_wiki_words(line)
         | 
| 285 466 | 
             
                  end
         | 
| 286 | 
            -
                  line = format_bullets(line)
         | 
| 287 | 
            -
                  line = format_markup(line)
         | 
| 288 467 | 
             
                  return line
         | 
| 289 468 | 
             
                end    
         | 
| 290 | 
            -
             | 
| 469 | 
            +
                
         | 
| 291 470 | 
             
                def formatted_output(line)
         | 
| 292 471 | 
             
                  output = @pre_line + line + @post_line
         | 
| 293 472 | 
             
                  @pre_line = ""
         | 
| 294 473 | 
             
                  @post_line = ""
         | 
| 295 474 | 
             
                  return output
         | 
| 296 475 | 
             
                end
         | 
| 297 | 
            -
             | 
| 298 | 
            -
             | 
| 476 | 
            +
                
         | 
| 477 | 
            +
                
         | 
| 299 478 | 
             
                def escape_wiki_markers(line)
         | 
| 300 479 | 
             
                  line = line.gsub(/%%/,"&percent;")
         | 
| 301 480 | 
             
                  line = line.gsub(/\{\{/,"&openingbrace;")
         | 
| 302 481 | 
             
                  line = line.gsub(/\}\}/,"&closingbrace;")
         | 
| 303 482 | 
             
                end
         | 
| 304 | 
            -
             | 
| 483 | 
            +
                
         | 
| 305 484 | 
             
                def escape_url_markers(line)
         | 
| 306 485 | 
             
                  line = line.gsub(/%/ ,'&percent;')
         | 
| 307 486 | 
             
                  line = line.gsub(/\{/,'&openingbrace;')
         | 
| @@ -311,7 +490,7 @@ module Wiki2Go | |
| 311 490 | 
             
                  line = line.gsub(/_/ ,'&underscore;')
         | 
| 312 491 | 
             
                  return line
         | 
| 313 492 | 
             
                end
         | 
| 314 | 
            -
             | 
| 493 | 
            +
                
         | 
| 315 494 | 
             
                def remove_markers(line)
         | 
| 316 495 | 
             
                  line = line.gsub(/&percent;/,"%")
         | 
| 317 496 | 
             
                  line = line.gsub(/&openingbrace;/,"{")
         | 
| @@ -321,14 +500,14 @@ module Wiki2Go | |
| 321 500 | 
             
                  line = line.gsub(/&underscore;/,"_")
         | 
| 322 501 | 
             
                  return line
         | 
| 323 502 | 
             
                end
         | 
| 324 | 
            -
             | 
| 325 | 
            -
             | 
| 503 | 
            +
                
         | 
| 504 | 
            +
                
         | 
| 326 505 | 
             
                def format_brackets(line)
         | 
| 327 506 | 
             
                  line = line.gsub(/</,"<\;") ;
         | 
| 328 507 | 
             
                  line = line.gsub(/>/,">\;") ;
         | 
| 329 508 | 
             
                  return line
         | 
| 330 509 | 
             
                end
         | 
| 331 | 
            -
             | 
| 510 | 
            +
                
         | 
| 332 511 | 
             
                def format_entities(line)
         | 
| 333 512 | 
             
                  line = line.gsub(/\~/,"˜") ;
         | 
| 334 513 | 
             
                  line = line.gsub(/&(\w+)\;/,"~\\1\;") ;
         | 
| @@ -338,7 +517,7 @@ module Wiki2Go | |
| 338 517 | 
             
                  line = line.gsub(/\t/,"   ") ;
         | 
| 339 518 | 
             
                  return line
         | 
| 340 519 | 
             
                end
         | 
| 341 | 
            -
             | 
| 520 | 
            +
                
         | 
| 342 521 | 
             
                def format_markup(line)
         | 
| 343 522 | 
             
                  line = line.gsub(/\*\*([^\*]*)\*\*/,"<h2>\\1<\/h2>")
         | 
| 344 523 | 
             
                  line = line.gsub(/\*([^\*]+)\*/,"<STRONG>\\1<\/STRONG>")
         | 
| @@ -346,13 +525,13 @@ module Wiki2Go | |
| 346 525 | 
             
                  line = line.gsub(/^---+/,"<hr>")
         | 
| 347 526 | 
             
                  return line
         | 
| 348 527 | 
             
                end
         | 
| 349 | 
            -
             | 
| 528 | 
            +
                
         | 
| 350 529 | 
             
                def format_bullets(line)
         | 
| 351 530 | 
             
                  line = line.gsub(/^([\s]{3,99})\*(.*)$/) { add_bullet($1,$2,'u') } 
         | 
| 352 531 | 
             
                  line = line.gsub(/^([\s]{3,99})(\d)+\.?(.*)$/) { add_bullet($1,$3,'o') } 
         | 
| 353 532 | 
             
                  return line
         | 
| 354 533 | 
             
                end
         | 
| 355 | 
            -
             | 
| 534 | 
            +
                
         | 
| 356 535 | 
             
                def format_table(line)
         | 
| 357 536 | 
             
                  if @in_table then
         | 
| 358 537 | 
             
                    replacement = "</table>"
         | 
| @@ -370,59 +549,52 @@ module Wiki2Go | |
| 370 549 | 
             
                    line = line.gsub(/\|/,"<\/td><td>")
         | 
| 371 550 | 
             
                  end
         | 
| 372 551 | 
             
                  return line
         | 
| 373 | 
            -
             | 
| 552 | 
            +
                  
         | 
| 374 553 | 
             
                end
         | 
| 375 | 
            -
             | 
| 376 | 
            -
                def  | 
| 377 | 
            -
                  line = line.gsub(/(^|[^\w\.])([A-Z]+[a-z0-9]+[A-Z]+[a-zA-Z0-9]*)/) { $1 +  | 
| 378 | 
            -
             | 
| 554 | 
            +
                
         | 
| 555 | 
            +
                def format_wiki_words(line)
         | 
| 556 | 
            +
                  line = line.gsub(/(^|[^\w\.])([A-Z]+[a-z0-9]+[A-Z]+[a-zA-Z0-9]*)/) { $1 + format_wiki_word($2) }
         | 
| 557 | 
            +
                  
         | 
| 379 558 | 
             
                end
         | 
| 380 | 
            -
             | 
| 381 | 
            -
                def external_link(url)
         | 
| 559 | 
            +
                
         | 
| 560 | 
            +
                def external_link(label,url)
         | 
| 382 561 | 
             
                  if url =~ /([^\/]+)\.(gif|jpg|jpeg|png)$/i then
         | 
| 383 | 
            -
                    alt = $1
         | 
| 562 | 
            +
                    alt = label || $1
         | 
| 384 563 | 
             
                    return "<img src=\"#{url}\" alt=\"#{alt}\">"
         | 
| 385 564 | 
             
                  else
         | 
| 386 | 
            -
                    return redirect_link(url,url)
         | 
| 565 | 
            +
                    return redirect_link(label || url,url)
         | 
| 387 566 | 
             
                  end
         | 
| 388 567 | 
             
                end      
         | 
| 389 | 
            -
             | 
| 390 | 
            -
                def  | 
| 568 | 
            +
                
         | 
| 569 | 
            +
                def external_url(url)
         | 
| 391 570 | 
             
                  return '"' + redirect_url(url) + (@config.redirect_url?(@web,url) ? '" rel="nofollow"' : '"') +' target="_blank"'
         | 
| 392 571 | 
             
                end      
         | 
| 393 | 
            -
             | 
| 572 | 
            +
                
         | 
| 394 573 | 
             
                def format_forced_link(link)
         | 
| 395 | 
            -
                  if ! link.gsub!(/^([ | 
| 396 | 
            -
                    link.gsub!(/^(([ | 
| 574 | 
            +
                  if ! link.gsub!(/^([^@]+)@(http.+)$/) { external_link($1,$2) } then
         | 
| 575 | 
            +
                    link.gsub!(/^(([^@]+)@)?(([^:]+):)?(.+)$/) { internal_link($2,$4,$5) }
         | 
| 397 576 | 
             
                  end
         | 
| 398 577 | 
             
                  link
         | 
| 399 578 | 
             
                end
         | 
| 400 | 
            -
             | 
| 401 | 
            -
                def  | 
| 402 | 
            -
                   | 
| 403 | 
            -
                end
         | 
| 404 | 
            -
             | 
| 405 | 
            -
                def labelLink(label,url)
         | 
| 406 | 
            -
                  return redirect_link(label,url)
         | 
| 407 | 
            -
                end
         | 
| 408 | 
            -
             | 
| 409 | 
            -
                def internalLink(page)
         | 
| 410 | 
            -
                  return internalSubwikiNamedLink(@web.name,page,page) 
         | 
| 579 | 
            +
                
         | 
| 580 | 
            +
                def format_wiki_word(word)
         | 
| 581 | 
            +
                  internal_link(word,@web.name,word)
         | 
| 411 582 | 
             
                end
         | 
| 412 | 
            -
             | 
| 413 | 
            -
                def  | 
| 414 | 
            -
                   | 
| 415 | 
            -
                  subwiki = default_wiki if subwiki.nil? || subwiki.empty?
         | 
| 416 | 
            -
                  internalSubwikiNamedLink(subwiki,page,name)
         | 
| 583 | 
            +
                
         | 
| 584 | 
            +
                def format_dynamic_link(link)
         | 
| 585 | 
            +
                  return link.gsub(/^(([^\%@]+)@)?(([^\%:]+):)?([^%]+)$/) { dynamic_link($2,$4,$5) }
         | 
| 417 586 | 
             
                end
         | 
| 418 | 
            -
             | 
| 419 | 
            -
                def dynamic_link( | 
| 420 | 
            -
                   | 
| 421 | 
            -
                  subwiki =  | 
| 422 | 
            -
                  perform_link(subwiki,page+'.rbl', | 
| 587 | 
            +
                
         | 
| 588 | 
            +
                def dynamic_link(label,subwiki,page)
         | 
| 589 | 
            +
                  label = page if label.nil? || label.empty?
         | 
| 590 | 
            +
                  subwiki = @web.name if subwiki.nil? || subwiki.empty?
         | 
| 591 | 
            +
                  perform_link(subwiki,page+'.rbl',label)
         | 
| 423 592 | 
             
                end
         | 
| 424 | 
            -
             | 
| 425 | 
            -
                def  | 
| 593 | 
            +
                
         | 
| 594 | 
            +
                def internal_link(label,subwiki,page)
         | 
| 595 | 
            +
                  label = page if label.nil? || label.empty?
         | 
| 596 | 
            +
                  subwiki = @web.name if subwiki.nil? || subwiki.empty?
         | 
| 597 | 
            +
                  
         | 
| 426 598 | 
             
                  if subwiki == "xpnl" then
         | 
| 427 599 | 
             
                    return "<a href=\"http://www.xpnl.org/Wiki/#{page}\" target=\"_blank\">xpnl:#{page}</a>"
         | 
| 428 600 | 
             
                  elsif subwiki == 'xpbe' then
         | 
| @@ -431,49 +603,25 @@ module Wiki2Go | |
| 431 603 | 
             
                    return "<a href=\"http://c2.com/cgi/wiki?#{page}\" target=\"_blank\">wiki:#{page}</a>"
         | 
| 432 604 | 
             
                  elsif subwiki == "book" then
         | 
| 433 605 | 
             
                    return "<a href=\"http://bookshelved.org/cgi-bin/wiki.pl?#{page}\" target=\"_blank\">book:#{page}</a>"
         | 
| 606 | 
            +
                  elsif subwiki == 'technorati' then
         | 
| 607 | 
            +
                    return "<a href=\"http://technorati.com/tag/#{page}\" target=\"_blank\" rel=\"tag\">#{label}</a>"
         | 
| 434 608 | 
             
                  elsif subwiki == "wiki2go" then
         | 
| 435 609 | 
             
                    return "<a href=\"http://wiki2go.nayima.be/Wiki2Go/#{page}.html\" target=\"_blank\">wiki2go:#{page}</a>"
         | 
| 436 610 | 
             
                  elsif subwiki =~ /^isbn$/i then
         | 
| 437 | 
            -
                     | 
| 438 | 
            -
                    return "<a href=\"http://www.amazon.co.uk/exec/obidos/ASIN/#{page}/#{@config.amazon_affiliate}\" target=\"_blank\">#{ | 
| 611 | 
            +
                    label = "ISBN " + page if page == label
         | 
| 612 | 
            +
                    return "<a href=\"http://www.amazon.co.uk/exec/obidos/ASIN/#{page}/#{@config.amazon_affiliate}\" target=\"_blank\">#{label}</a>"
         | 
| 439 613 | 
             
                  elsif page =~ /^isbn(.+)$/i then
         | 
| 440 | 
            -
                     | 
| 441 | 
            -
                    return "<a href=\"http://www.amazon.co.uk/exec/obidos/ASIN/#{$1}/#{@config.amazon_affiliate}\" target=\"_blank\">#{ | 
| 614 | 
            +
                    label = "ISBN " + $1 if page == label
         | 
| 615 | 
            +
                    return "<a href=\"http://www.amazon.co.uk/exec/obidos/ASIN/#{$1}/#{@config.amazon_affiliate}\" target=\"_blank\">#{label}</a>"
         | 
| 442 616 | 
             
                  elsif page =~ /\./ then
         | 
| 443 | 
            -
                    return resource_link(subwiki,page, | 
| 617 | 
            +
                    return resource_link(subwiki,page,label)
         | 
| 444 618 | 
             
                  elsif @storage.exists?(File.join(subwiki,page)) then
         | 
| 445 | 
            -
                    return view_link(subwiki,page, | 
| 446 | 
            -
                  else
         | 
| 447 | 
            -
                    return edit_link(subwiki,page,name)
         | 
| 448 | 
            -
                  end
         | 
| 449 | 
            -
                end
         | 
| 450 | 
            -
             | 
| 451 | 
            -
                def resource_link(subwiki,page,name)
         | 
| 452 | 
            -
                  if page =~ /^(.+)\.(gif|jpg|jpeg|png)$/i then
         | 
| 453 | 
            -
                    filename = $1
         | 
| 454 | 
            -
                    alt_label = name
         | 
| 455 | 
            -
                    if page == name || url?(name) then
         | 
| 456 | 
            -
                      alt_label = filename
         | 
| 457 | 
            -
                    end
         | 
| 458 | 
            -
                    image_link = "<img src=\"#{resource_url(page)}\" border=0 alt=\"#{alt_label}\" >"
         | 
| 459 | 
            -
                    if url?(name) then
         | 
| 460 | 
            -
                      return redirect_link(image_link,name)
         | 
| 461 | 
            -
                    else
         | 
| 462 | 
            -
                      return image_link
         | 
| 463 | 
            -
                    end
         | 
| 464 | 
            -
                  elsif page =~ /^(.*)\.rbl$/i then
         | 
| 465 | 
            -
                    page_name = $1
         | 
| 466 | 
            -
                    if page == name then
         | 
| 467 | 
            -
                      name = page_name
         | 
| 468 | 
            -
                    end
         | 
| 469 | 
            -
                    return perform_link(subwiki,page,name)
         | 
| 470 | 
            -
                  elsif page =~ /^(.+)\.html?$/i then
         | 
| 471 | 
            -
                    return "<a href=\"#{resource_url(page)}\">#{name}</a>"
         | 
| 619 | 
            +
                    return view_link(subwiki,page,label)
         | 
| 472 620 | 
             
                  else
         | 
| 473 | 
            -
                    return  | 
| 621 | 
            +
                    return editor_link2(subwiki,page,label)
         | 
| 474 622 | 
             
                  end
         | 
| 475 623 | 
             
                end
         | 
| 476 | 
            -
             | 
| 624 | 
            +
                
         | 
| 477 625 | 
             
                def add_bullet(prefix,text,code)
         | 
| 478 626 | 
             
                  @added_bullets = true
         | 
| 479 627 | 
             
                  depth = prefix.length / 3
         | 
| @@ -497,18 +645,18 @@ module Wiki2Go | |
| 497 645 | 
             
                  end
         | 
| 498 646 | 
             
                  return result + "<li>#{text}"
         | 
| 499 647 | 
             
                end
         | 
| 500 | 
            -
             | 
| 648 | 
            +
                
         | 
| 501 649 | 
             
                def emit_bullets
         | 
| 502 650 | 
             
                  while ! @bullets.empty?
         | 
| 503 651 | 
             
                    bullet = @bullets.pop
         | 
| 504 652 | 
             
                    @pre_line += "</#{bullet}l>" 
         | 
| 505 653 | 
             
                  end
         | 
| 506 654 | 
             
                end
         | 
| 507 | 
            -
             | 
| 655 | 
            +
                
         | 
| 508 656 | 
             
                def url?(name)
         | 
| 509 657 | 
             
                  name =~ /(http|ftp|gopher|news|https)\:(\w|\/|\.|_|-|\?|\=|&|;|\~|#|,)+/
         | 
| 510 658 | 
             
                end    
         | 
| 511 | 
            -
             | 
| 659 | 
            +
                
         | 
| 512 660 | 
             
              end
         | 
| 513 | 
            -
             | 
| 661 | 
            +
              
         | 
| 514 662 | 
             
            end
         |