trac-wiki 0.1.9 → 0.1.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +1 -0
- data/lib/trac-wiki.rb +3 -0
- data/lib/trac-wiki/parser.rb +93 -7
- data/lib/trac-wiki/version.rb +1 -1
- data/test/parser_test.rb +58 -7
- metadata +11 -17
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5c3c0e79552d6d60ecbb77c54fbaa434d208ca56
|
4
|
+
data.tar.gz: dd2e9ab2b74410c6b3abf6265d43185fcaec19cd
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c173fe3e96fdceaa1e587c2a41e75e50fa731bfb3403270463d3352014e8223dd459ba7df0e5ea9d6377be54d701d19ec3a00dfb3b259583cd70325ab9d5bc15
|
7
|
+
data.tar.gz: b7c6a4d413d44ea1bb30d9e49454420a5ecd639601ea79ef19f80a73e1831c1165bac4d94b9da75757d5ca440fc301ff5a062554329293f8bb5821e41a296e0f
|
data/Gemfile
CHANGED
data/lib/trac-wiki.rb
CHANGED
data/lib/trac-wiki/parser.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'cgi'
|
2
2
|
require 'uri'
|
3
|
+
require 'iconv'
|
3
4
|
|
4
5
|
# :main: TracWiki
|
5
6
|
|
@@ -43,6 +44,8 @@ module TracWiki
|
|
43
44
|
# Examples: http https ftp ftps
|
44
45
|
attr_accessor :allowed_schemes
|
45
46
|
|
47
|
+
attr_accessor :headings
|
48
|
+
|
46
49
|
|
47
50
|
# Disable url escaping for local links
|
48
51
|
# Escaping: [[/Test]] --> %2FTest
|
@@ -58,12 +61,30 @@ module TracWiki
|
|
58
61
|
attr_writer :math
|
59
62
|
def math?; @math; end
|
60
63
|
|
64
|
+
attr_writer :edit_heading
|
65
|
+
def edit_heading?; @edit_heading; end
|
66
|
+
|
67
|
+
# understand merge tags (see diff3(1))
|
68
|
+
# >>>>>>> mine
|
69
|
+
# ||||||| orig
|
70
|
+
# =======
|
71
|
+
# <<<<<<< yours
|
72
|
+
# convert to <div class="merge merge-mine">mine</div>
|
61
73
|
attr_writer :merge
|
62
74
|
def merge?; @merge; end
|
63
75
|
|
76
|
+
# every heading will had id, generated from heading text
|
77
|
+
attr_writer :id_from_heading
|
78
|
+
def id_from_heading?; @id_from_heading; end
|
79
|
+
|
80
|
+
# when id_from_heading, non ascii char are transliterated to ascii
|
81
|
+
attr_writer :id_translit
|
82
|
+
def id_translit?; @id_translit; end
|
83
|
+
|
64
84
|
# Create a new Parser instance.
|
65
85
|
def initialize(text, options = {})
|
66
86
|
@allowed_schemes = %w(http https ftp ftps)
|
87
|
+
@anames = {}
|
67
88
|
@text = text
|
68
89
|
@no_escape = nil
|
69
90
|
options.each_pair {|k,v| send("#{k}=", v) }
|
@@ -83,20 +104,33 @@ module TracWiki
|
|
83
104
|
# #=> "<p><strong>Hello <em>World</em></strong></p>"
|
84
105
|
def to_html
|
85
106
|
@out = ''
|
107
|
+
@edit_heading_class = 'editheading'
|
108
|
+
@headings = [ {level: 0, sline: 1 } ]
|
86
109
|
@p = false
|
87
110
|
@stack = []
|
88
111
|
@stacki = []
|
89
112
|
@was_math = false
|
113
|
+
@line_no = 1
|
90
114
|
parse_block(@text)
|
91
115
|
@out
|
92
116
|
end
|
93
117
|
|
118
|
+
def make_toc_html
|
119
|
+
@out = ''
|
120
|
+
parse_block(make_toc)
|
121
|
+
end
|
122
|
+
|
94
123
|
protected
|
95
124
|
|
96
125
|
# Escape any characters with special meaning in HTML using HTML
|
97
|
-
# entities.
|
126
|
+
# entities. (&<>" not ')
|
98
127
|
def escape_html(string)
|
99
|
-
CGI::escapeHTML(string)
|
128
|
+
#CGI::escapeHTML(string)
|
129
|
+
Parser.escapeHTML(string)
|
130
|
+
end
|
131
|
+
|
132
|
+
def self.escapeHTML(string)
|
133
|
+
string.gsub(/&/n, '&').gsub(/\"/n, '"').gsub(/>/n, '>').gsub(/</n, '<')
|
100
134
|
end
|
101
135
|
|
102
136
|
# Escape any characters with special meaning in URLs using URL
|
@@ -176,7 +210,10 @@ module TracWiki
|
|
176
210
|
# make_local_link("LocalLink") #=> "/LocalLink"
|
177
211
|
# make_local_link("Wikipedia:Bread") #=> "http://en.wikipedia.org/wiki/Bread"
|
178
212
|
def make_local_link(link) #:doc:
|
179
|
-
|
213
|
+
return link if no_escape?
|
214
|
+
link, anch = link.split(/#/, 2)
|
215
|
+
return escape_url(link) if ! anch
|
216
|
+
"#{escape_url(link)}##{escape_url(anch)}"
|
180
217
|
end
|
181
218
|
|
182
219
|
# Sanatize a direct url (e.g. http://wikipedia.org/). The default
|
@@ -246,13 +283,24 @@ module TracWiki
|
|
246
283
|
end
|
247
284
|
|
248
285
|
def make_headline(level, text, aname)
|
249
|
-
ret = "<h#{level}
|
286
|
+
ret = "<h#{level}"
|
250
287
|
if aname
|
251
|
-
ret
|
288
|
+
ret += " id=\"#{ escape_html(aname) }\""
|
289
|
+
end
|
290
|
+
ret += ">" + escape_html(text)
|
291
|
+
|
292
|
+
if edit_heading?
|
293
|
+
ret += edit_heading_link(@headings.size - 1)
|
252
294
|
end
|
295
|
+
|
296
|
+
ret += "</h#{level}>"
|
253
297
|
ret
|
254
298
|
end
|
255
299
|
|
300
|
+
def edit_heading_link(section)
|
301
|
+
"<a class='#{@edit_heading_class}' href=\"?edit=#{section}\">edit</a>"
|
302
|
+
end
|
303
|
+
|
256
304
|
def make_explicit_link(link)
|
257
305
|
begin
|
258
306
|
uri = URI.parse(link)
|
@@ -262,6 +310,18 @@ module TracWiki
|
|
262
310
|
make_local_link(link)
|
263
311
|
end
|
264
312
|
|
313
|
+
|
314
|
+
def make_toc
|
315
|
+
@headings.map do |h|
|
316
|
+
if h[:level] < 1
|
317
|
+
''
|
318
|
+
else
|
319
|
+
ind = " " * (h[:level] - 1)
|
320
|
+
"#{ind}* [[##{h[:aname]}|#{h[:title]}]]\n"
|
321
|
+
end
|
322
|
+
end.join
|
323
|
+
end
|
324
|
+
|
265
325
|
def parse_inline(str)
|
266
326
|
until str.empty?
|
267
327
|
case str
|
@@ -512,10 +572,12 @@ module TracWiki
|
|
512
572
|
|
513
573
|
# heading == Wiki Ruless ==
|
514
574
|
# heading == Wiki Ruless == #tag
|
515
|
-
when str =~ /\A
|
575
|
+
when str =~ /\A[[:blank:]]*(={1,6})\s*(.*?)\s*=*\s*(#(\S*))?\s*$(\r?\n)?/
|
516
576
|
level = $1.size
|
517
577
|
title= $2
|
518
|
-
aname= $4
|
578
|
+
aname= aname_nice($4, title)
|
579
|
+
@headings.last[:eline] = @line_no - 1
|
580
|
+
@headings.push({ :title => title, :sline => @line_no, :aname => aname, :level => level, })
|
519
581
|
end_paragraph
|
520
582
|
@out << make_headline(level, title, aname)
|
521
583
|
|
@@ -576,10 +638,34 @@ module TracWiki
|
|
576
638
|
else # case str
|
577
639
|
raise "Parse error at #{str[0,30].inspect}"
|
578
640
|
end
|
641
|
+
@line_no += ($`+$&).count("\n")
|
579
642
|
str = $'
|
580
643
|
end
|
581
644
|
end_paragraph
|
645
|
+
@headings.last[:eline] = @line_no - 1
|
582
646
|
@out
|
583
647
|
end
|
648
|
+
|
649
|
+
def aname_nice(aname, title)
|
650
|
+
|
651
|
+
if aname.nil? && id_from_heading?
|
652
|
+
aname = title.gsub /\s+/, '_'
|
653
|
+
if id_translit?
|
654
|
+
aname = Iconv.iconv('ascii//translit', 'utf-8', aname).join
|
655
|
+
end
|
656
|
+
end
|
657
|
+
return nil if aname.nil?
|
658
|
+
aname_ori = aname
|
659
|
+
count = 2
|
660
|
+
while @anames[aname]
|
661
|
+
aname = aname_ori + ".#{count}"
|
662
|
+
count+=1
|
663
|
+
end
|
664
|
+
@anames[aname] = true
|
665
|
+
aname
|
666
|
+
end
|
667
|
+
|
668
|
+
|
669
|
+
|
584
670
|
end
|
585
671
|
end
|
data/lib/trac-wiki/version.rb
CHANGED
data/test/parser_test.rb
CHANGED
@@ -1,9 +1,17 @@
|
|
1
1
|
require 'trac-wiki'
|
2
|
+
require 'pp'
|
3
|
+
|
2
4
|
|
3
5
|
class Bacon::Context
|
4
6
|
def tc(html, wiki, options = {})
|
5
7
|
TracWiki.render(wiki, options).should.equal html
|
6
8
|
end
|
9
|
+
def h(hash, wiki, opts = {})
|
10
|
+
parser = TracWiki.parser(wiki, opts)
|
11
|
+
parser.to_html
|
12
|
+
#pp parser.headers
|
13
|
+
parser.headings.should == hash
|
14
|
+
end
|
7
15
|
end
|
8
16
|
|
9
17
|
describe TracWiki::Parser do
|
@@ -141,12 +149,14 @@ describe TracWiki::Parser do
|
|
141
149
|
tc "<h1>Heading 1</h1>", "= Heading 1 ="
|
142
150
|
tc "<h2>Heading 2</h2>", "== Heading 2 =="
|
143
151
|
tc "<h3>Heading 3</h3>", "=== Heading 3 ==="
|
144
|
-
tc "<
|
145
|
-
tc "<
|
146
|
-
tc "<
|
147
|
-
tc "<
|
148
|
-
tc "<
|
149
|
-
|
152
|
+
tc "<h3 id=\"HE3\">Heading 3</h3>", "=== Heading 3 === #HE3"
|
153
|
+
tc "<h3 id=\"Heading-3\">Heading 3</h3>", "=== Heading 3 === #Heading-3"
|
154
|
+
tc "<h3 id=\"Heading/3\">Heading 3</h3>", "=== Heading 3 === #Heading/3"
|
155
|
+
tc "<h3 id=\"Heading/3\">Heading 3</h3>", "=== Heading 3 === #Heading/3 "
|
156
|
+
tc "<h3 id=\"Heading/3\">Heading 3</h3><h3 id=\"Heading/3.2\">Heading 3</h3>",
|
157
|
+
"=== Heading 3 === #Heading/3\n=== Heading 3 === #Heading/3\n "
|
158
|
+
tc "<h3 id=\"Heading<3>\">Heading 3</h3>", "=== Heading 3 === #Heading<3>"
|
159
|
+
tc "<h3 id=\"Heading'"3"'\">Heading 3</h3>", "=== Heading 3 === #Heading'\"3\"'"
|
150
160
|
# WARNING: Optional feature, not specified in
|
151
161
|
tc "<h4>Heading 4</h4>", "==== Heading 4 ===="
|
152
162
|
tc "<h5>Heading 5</h5>", "===== Heading 5 ====="
|
@@ -182,6 +192,8 @@ describe TracWiki::Parser do
|
|
182
192
|
it 'should parse links' do
|
183
193
|
# Links
|
184
194
|
tc "<p><a href=\"link\">link</a></p>\n", "[[link]]"
|
195
|
+
tc "<p><a href=\"link#link\">link#link</a></p>\n", "[[link#link]]"
|
196
|
+
tc "<p><a href=\"#link\">#link</a></p>\n", "[[#link]]"
|
185
197
|
|
186
198
|
# Links can appear in paragraphs (i.e. inline item)
|
187
199
|
tc "<p>Hello, <a href=\"world\">world</a></p>\n", "Hello, [[world]]"
|
@@ -191,11 +203,12 @@ describe TracWiki::Parser do
|
|
191
203
|
|
192
204
|
# URLs
|
193
205
|
tc "<p><a href=\"http://www.example.org/\">http://www.example.org/</a></p>\n", "[[http://www.example.org/]]"
|
206
|
+
tc "<p><a href=\"http://www.example.org/#anch\">http://www.example.org/#anch</a></p>\n", "[[http://www.example.org/#anch]]"
|
194
207
|
|
195
208
|
# Single punctuation characters at the end of URLs
|
196
209
|
# should not be considered a part of the URL.
|
197
210
|
[',','.','?','!',':',';','\'','"'].each do |punct|
|
198
|
-
esc_punct =
|
211
|
+
esc_punct = TracWiki::Parser.escapeHTML(punct)
|
199
212
|
tc "<p><a href=\"http://www.example.org/\">http://www.example.org/</a>#{esc_punct}</p>\n", "http://www.example.org/#{punct}"
|
200
213
|
end
|
201
214
|
# Nameds URLs (by example)
|
@@ -803,5 +816,43 @@ describe TracWiki::Parser do
|
|
803
816
|
|
804
817
|
tc "<h6></h6><p>ahoj</p>\n", "=======\nahoj\n", :merge => false
|
805
818
|
end
|
819
|
+
it 'should compute headers' do
|
820
|
+
h( [ {:level=>0, :sline=>1, :eline=>2},
|
821
|
+
{:title=>"ahoj", :sline=>3, :eline=> 5, :aname=>nil, :level=>2},
|
822
|
+
],
|
823
|
+
"\nahoj\n== ahoj ==\nbhoj\nchoj\n")
|
824
|
+
h( [ {:level=>0, :sline=>1, :eline=>2},
|
825
|
+
{:title=>"ahoj", :sline=>3, :eline => 5, :aname=>nil, :level=>2},
|
826
|
+
{:title=>"dhoj", :sline=>6, :eline => 7, :aname=>nil, :level=>3},
|
827
|
+
],
|
828
|
+
"\nahoj\n== ahoj ==\nbhoj\nchoj\n===dhoj===\nkuk\n")
|
829
|
+
h( [ {:level=>0, :sline=>1, :eline=>2},
|
830
|
+
{:title=>"ahoj", :sline=>3, :eline => 7, :aname=>nil, :level=>2},
|
831
|
+
{:title=>"dhoj", :sline=>8, :eline => 9, :aname=>nil, :level=>3},
|
832
|
+
],
|
833
|
+
"\nahoj\n== ahoj ==\nbhoj\nchoj\n\n\n===dhoj===\nkuk\n")
|
834
|
+
h( [ {:level=>0, :sline=>1, :eline=>2},
|
835
|
+
{:title=>"ah o ~'j", :sline=>3, :eline => 5, :aname=>nil, :level=>2},
|
836
|
+
{:title=>"*dhoj", :sline=>6, :eline => 7, :aname=>'ble', :level=>3},
|
837
|
+
],
|
838
|
+
"\nahoj\n== ah o ~'j ==\nbhoj\nchoj\n===*dhoj ===#ble\nkuk\n")
|
839
|
+
h( [ {:level=>0, :sline=>1, :eline=>2},
|
840
|
+
{:title=>"ah o ~'j", :sline=>3, :eline => 8, :aname=>nil, :level=>2},
|
841
|
+
{:title=>"*dhoj", :sline=>9, :eline => 11, :aname=>'ble', :level=>3},
|
842
|
+
], <<eos)
|
843
|
+
|
844
|
+
ahoj
|
845
|
+
== ah o ~'j ==
|
846
|
+
{{{
|
847
|
+
==a1.5hoj==
|
848
|
+
}}}
|
849
|
+
|
850
|
+
|
851
|
+
===*dhoj ===#ble
|
852
|
+
kuk
|
853
|
+
|
854
|
+
eos
|
855
|
+
|
856
|
+
end
|
806
857
|
end
|
807
858
|
# vim: tw=0
|
metadata
CHANGED
@@ -1,46 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trac-wiki
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.12
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Vitas Stradal
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-10-06 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: bacon
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
description: TracWiki markup language render (http://trac.edgewall.org/wiki/WikiFormatting
|
@@ -65,26 +60,25 @@ files:
|
|
65
60
|
homepage: http://github.com/vitstradal/trac-wiki
|
66
61
|
licenses:
|
67
62
|
- GPL-2
|
63
|
+
metadata: {}
|
68
64
|
post_install_message:
|
69
65
|
rdoc_options: []
|
70
66
|
require_paths:
|
71
67
|
- lib
|
72
68
|
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
69
|
requirements:
|
75
|
-
- -
|
70
|
+
- - '>='
|
76
71
|
- !ruby/object:Gem::Version
|
77
72
|
version: '0'
|
78
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
-
none: false
|
80
74
|
requirements:
|
81
|
-
- -
|
75
|
+
- - '>='
|
82
76
|
- !ruby/object:Gem::Version
|
83
77
|
version: '0'
|
84
78
|
requirements: []
|
85
79
|
rubyforge_project: trac-wiki
|
86
|
-
rubygems_version:
|
80
|
+
rubygems_version: 2.0.3
|
87
81
|
signing_key:
|
88
|
-
specification_version:
|
82
|
+
specification_version: 4
|
89
83
|
summary: Trac Wiki markup language
|
90
84
|
test_files: []
|