gollum-lib 3.0.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of gollum-lib might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d4dcf391053842849c400121f0f21c035094742f
4
- data.tar.gz: 58367a8f8ded27b4ef7457e48fae7f6019a3141e
3
+ metadata.gz: 1c4e3d8ea8a629bdd6bc0a8b13dc901366811de7
4
+ data.tar.gz: b894bed5617bedddbfaed91003cf82f50b9785c5
5
5
  SHA512:
6
- metadata.gz: 42e1d2261b367bb8b65b1ced6497ad11597f4d07c8a7a69cf33856da53663e1ef984c632bc645bf4543f7e1a84819bb83a283e70eb2ca028344fd00673a9b4c7
7
- data.tar.gz: 67c364841f195db1e110fa453ee35e5b2f22029204d10090638fed88560edd353de91fde9bc7fad8993342104ca31a53ea0009c3cfe72d6b834188fff555ff8b
6
+ metadata.gz: 4ca45f261d3d0a22ea9686b682b380c3cb14cb878cd86dec20fb780ed600cedce4ac9352ab58439a5c19af21a07f90246bcc9330d4f8315b2c630b1bb5efc8c5
7
+ data.tar.gz: 56b810b3f1384448377ea7c109e1f708269f072827ac19d139638141be8fd01d8a9f3a54aae52e3a6eae295a8aacae52ebaf0115887dba9358e47c3e03d2d771
data/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gemspec
3
+ gemspec
data/README.md CHANGED
@@ -1,9 +1,9 @@
1
1
  gollum lib -- A wiki built on top of Git
2
2
  ========================================
3
3
 
4
- [![Gem Version](https://badge.fury.io/rb/gollum-lib.png)](http://rubygems.org/gems/gollum-lib)
5
- [![Build Status](https://travis-ci.org/gollum/gollum-lib.png)](https://travis-ci.org/gollum/gollum-lib)
6
- [![Dependency Status](https://gemnasium.com/gollum/gollum-lib.png)](https://gemnasium.com/gollum/gollum-lib)
4
+ [![Gem Version](https://badge.fury.io/rb/gollum-lib.svg)](http://badge.fury.io/rb/gollum-lib)
5
+ [![Build Status](https://travis-ci.org/gollum/gollum-lib.svg?branch=master)](https://travis-ci.org/gollum/gollum-lib)
6
+ [![Dependency Status](https://gemnasium.com/gollum/gollum-lib.svg)](https://gemnasium.com/gollum/gollum-lib)
7
7
 
8
8
  ## DESCRIPTION
9
9
 
@@ -43,7 +43,7 @@ In order to use the various formats that Gollum supports, you will need to
43
43
  separately install the necessary dependencies for each format. You only need
44
44
  to install the dependencies for the formats that you plan to use.
45
45
 
46
- * [ASCIIDoc](http://www.methods.co.nz/asciidoc/) -- `brew install asciidoc` on mac or `apt-get install -y asciidoc` on Ubuntu
46
+ * [AsciiDoc](http://www.methods.co.nz/asciidoc/) -- `gem install asciidoctor`
47
47
  * [Creole](http://wikicreole.org/) -- `gem install creole`
48
48
  * [Markdown](http://daringfireball.net/projects/markdown/) -- `gem install redcarpet`
49
49
  * [GitHub Flavored Markdown](https://help.github.com/articles/github-flavored-markdown) -- `gem install github-markdown`
@@ -105,7 +105,7 @@ page.format
105
105
  # => :markdown
106
106
 
107
107
  vsn = page.version
108
- # => <Grit::Commit>
108
+ # => <Gollum::Git::Commit>
109
109
 
110
110
  vsn.id
111
111
  # => '3ca43e12377ea1e32ea5c9ce5992ec8bf266e3e5'
@@ -129,7 +129,7 @@ Get a list of versions for a given page:
129
129
 
130
130
  ```ruby
131
131
  vsns = wiki.page('page-name').versions
132
- # => [<Grit::Commit, <Grit::Commit, <Grit::Commit>]
132
+ # => [<Gollum::Git::Commit, <Gollum::Git::Commit, <Gollum::Git::Commit>]
133
133
 
134
134
  vsns.first.id
135
135
  # => '3ca43e12377ea1e32ea5c9ce5992ec8bf266e3e5'
@@ -154,7 +154,7 @@ file.raw_data
154
154
  # => "alert('hello');"
155
155
 
156
156
  file.version
157
- # => <Grit::Commit>
157
+ # => <Gollum::Git::Commit>
158
158
  ```
159
159
 
160
160
  Get a specific version of a given static file:
@@ -5,8 +5,8 @@ Gem::Specification.new do |s|
5
5
  s.required_ruby_version = '>= 1.9'
6
6
 
7
7
  s.name = 'gollum-lib'
8
- s.version = '3.0.0'
9
- s.date = '2014-04-05'
8
+ s.version = '4.0.0'
9
+ s.date = '2014-11-26'
10
10
  s.rubyforge_project = 'gollum-lib'
11
11
  s.license = 'MIT'
12
12
 
@@ -22,33 +22,33 @@ Gem::Specification.new do |s|
22
22
  s.rdoc_options = ['--charset=UTF-8']
23
23
  s.extra_rdoc_files = %w[README.md LICENSE]
24
24
 
25
- s.add_dependency 'gitlab-grit', '~> 2.6.5'
26
- s.add_dependency 'rouge', '~> 1.3.3'
27
- s.add_dependency 'nokogiri', '~> 1.6.1'
25
+ s.add_dependency 'gollum-grit_adapter', '~> 0.1.0'
26
+ s.add_dependency 'rouge', '~> 1.7.4'
27
+ s.add_dependency 'nokogiri', '~> 1.6.4'
28
28
  s.add_dependency 'stringex', '~> 2.5.1'
29
29
  s.add_dependency 'sanitize', '~> 2.1.0'
30
- s.add_dependency 'github-markup', '~> 1.1.0'
30
+ s.add_dependency 'github-markup', '~> 1.3.1'
31
31
 
32
- s.add_development_dependency 'org-ruby', '~> 0.9.3'
33
- s.add_development_dependency 'github-markdown', '~> 0.6.5'
32
+ s.add_development_dependency 'org-ruby', '~> 0.9.9'
33
+ s.add_development_dependency 'github-markdown', '~> 0.6.7'
34
34
  s.add_development_dependency 'RedCloth', '~> 4.2.9'
35
- s.add_development_dependency 'mocha', '~> 1.0.0'
35
+ s.add_development_dependency 'mocha', '~> 1.1.0'
36
36
  s.add_development_dependency 'shoulda', '~> 3.5.0'
37
37
  s.add_development_dependency 'wikicloth', '~> 0.8.1'
38
- s.add_development_dependency 'rake', '~> 10.2.2'
39
- s.add_development_dependency 'pry', '~> 0.9.12'
38
+ s.add_development_dependency 'rake', '~> 10.4.0'
39
+ s.add_development_dependency 'pry', '~> 0.10.1'
40
40
  # required by pry
41
41
  s.add_development_dependency 'rb-readline', '~> 0.5.1'
42
42
  # updating minitest-reporters requires a new minitest which fails with gollum's tests.
43
43
  s.add_development_dependency 'minitest-reporters', '~> 0.14.16'
44
44
  s.add_development_dependency 'nokogiri-diff', '~> 0.2.0'
45
45
  # required by guard
46
- s.add_development_dependency 'guard', '~> 2.6.0'
47
- s.add_development_dependency 'guard-minitest', '~> 2.2.0'
46
+ s.add_development_dependency 'guard', '~> 2.8.2'
47
+ s.add_development_dependency 'guard-minitest', '~> 2.3.2'
48
48
  s.add_development_dependency 'rb-inotify', '~> 0.9.3'
49
49
  s.add_development_dependency 'rb-fsevent', '~> 0.9.4'
50
50
  s.add_development_dependency 'rb-fchange', '~> 0.0.6'
51
- s.add_development_dependency 'twitter_cldr', '~> 2.4.2'
51
+ s.add_development_dependency 'twitter_cldr', '~> 3.1.0'
52
52
  # = MANIFEST =
53
53
  s.files = %w[
54
54
  Gemfile
@@ -65,6 +65,7 @@ Gem::Specification.new do |s|
65
65
  lib/gollum-lib/file_view.rb
66
66
  lib/gollum-lib/filter.rb
67
67
  lib/gollum-lib/filter/code.rb
68
+ lib/gollum-lib/filter/macro.rb
68
69
  lib/gollum-lib/filter/metadata.rb
69
70
  lib/gollum-lib/filter/plain_text.rb
70
71
  lib/gollum-lib/filter/remote_code.rb
@@ -75,9 +76,10 @@ Gem::Specification.new do |s|
75
76
  lib/gollum-lib/filter/wsd.rb
76
77
  lib/gollum-lib/git_access.rb
77
78
  lib/gollum-lib/gitcode.rb
78
- lib/gollum-lib/grit_ext.rb
79
79
  lib/gollum-lib/helpers.rb
80
80
  lib/gollum-lib/hook.rb
81
+ lib/gollum-lib/macro.rb
82
+ lib/gollum-lib/macro/all_pages.rb
81
83
  lib/gollum-lib/markup.rb
82
84
  lib/gollum-lib/markups.rb
83
85
  lib/gollum-lib/page.rb
@@ -4,9 +4,15 @@ require 'digest/md5'
4
4
  require 'digest/sha1'
5
5
  require 'ostruct'
6
6
 
7
+ DEFAULT_ADAPTER = 'grit_adapter'
8
+
9
+ if defined?(Gollum::GIT_ADAPTER)
10
+ require "#{Gollum::GIT_ADAPTER.downcase}_adapter"
11
+ else
12
+ require DEFAULT_ADAPTER
13
+ end
14
+
7
15
  # external
8
- require 'grit'
9
- require File.expand_path('../gollum-lib/grit_ext', __FILE__)
10
16
  require 'github/markup'
11
17
  require 'sanitize'
12
18
 
@@ -18,6 +24,7 @@ require File.expand_path('../gollum-lib/pagination', __FILE__)
18
24
  require File.expand_path('../gollum-lib/blob_entry', __FILE__)
19
25
  require File.expand_path('../gollum-lib/wiki', __FILE__)
20
26
  require File.expand_path('../gollum-lib/page', __FILE__)
27
+ require File.expand_path('../gollum-lib/macro', __FILE__)
21
28
  require File.expand_path('../gollum-lib/file', __FILE__)
22
29
  require File.expand_path('../gollum-lib/file_view', __FILE__)
23
30
  require File.expand_path('../gollum-lib/markup', __FILE__)
@@ -31,21 +38,13 @@ $KCODE = 'U' if RUBY_VERSION[0, 3] == '1.8'
31
38
 
32
39
  module Gollum
33
40
  module Lib
34
- VERSION = '3.0.0'
41
+ VERSION = '4.0.0'
35
42
  end
36
43
 
37
44
  def self.assets_path
38
45
  ::File.expand_path('gollum/frontend/public', ::File.dirname(__FILE__))
39
46
  end
40
47
 
41
- def self.set_git_timeout(time)
42
- Grit::Git.git_timeout = time
43
- end
44
-
45
- def self.set_git_max_filesize(size)
46
- Grit::Git.git_max_size = size
47
- end
48
-
49
48
  class Error < StandardError; end
50
49
 
51
50
  class DuplicatePageError < Error
@@ -31,13 +31,13 @@ module Gollum
31
31
  @name ||= ::File.basename(@path)
32
32
  end
33
33
 
34
- # Gets a Grit::Blob instance for this blob.
34
+ # Gets a Gollum::Git::Blob instance for this blob.
35
35
  #
36
- # repo - Grit::Repo instance for the Grit::Blob.
36
+ # repo - Gollum::Git::Repo instance for the Gollum::Git::Blob.
37
37
  #
38
- # Returns an unbaked Grit::Blob instance.
38
+ # Returns an unbaked Gollum::Git::Blob instance.
39
39
  def blob(repo)
40
- @blob ||= Grit::Blob.create(repo,
40
+ @blob ||= Gollum::Git::Blob.create(repo,
41
41
  :id => @sha, :name => name, :size => @size, :mode => @mode)
42
42
  end
43
43
 
@@ -18,7 +18,7 @@ module Gollum
18
18
  # :message - The String commit message.
19
19
  # :name - The String author full name.
20
20
  # :email - The String email address.
21
- # :parent - Optional Grit::Commit parent to this update.
21
+ # :parent - Optional Gollum::Git::Commit parent to this update.
22
22
  # :tree - Optional String SHA of the tree to create the
23
23
  # index from.
24
24
  # :committer - Optional Gollum::Committer instance. If provided,
@@ -35,7 +35,7 @@ module Gollum
35
35
 
36
36
  # Public: References the Git index for this commit.
37
37
  #
38
- # Returns a Grit::Index.
38
+ # Returns a Gollum::Git::Index.
39
39
  def index
40
40
  @index ||= begin
41
41
  idx = @wiki.repo.index
@@ -50,18 +50,18 @@ module Gollum
50
50
 
51
51
  # Public: The committer for this commit.
52
52
  #
53
- # Returns a Grit::Actor.
53
+ # Returns a Gollum::Git::Actor.
54
54
  def actor
55
55
  @actor ||= begin
56
56
  @options[:name] = @wiki.default_committer_name if @options[:name].to_s.empty?
57
57
  @options[:email] = @wiki.default_committer_email if @options[:email].to_s.empty?
58
- Grit::Actor.new(@options[:name], @options[:email])
58
+ Gollum::Git::Actor.new(@options[:name], @options[:email])
59
59
  end
60
60
  end
61
61
 
62
62
  # Public: The parent commits to this pending commit.
63
63
  #
64
- # Returns an array of Grit::Commit instances.
64
+ # Returns an array of Gollum::Git::Commit instances.
65
65
  def parents
66
66
  @parents ||= begin
67
67
  arr = [@options[:parent] || @wiki.repo.commit(@wiki.ref)]
@@ -155,9 +155,9 @@ module Gollum
155
155
 
156
156
  Dir.chdir(::File.join(@wiki.repo.path, '..')) do
157
157
  if file_path_scheduled_for_deletion?(index.tree, path)
158
- @wiki.repo.git.rm({ 'f' => true }, '--', path)
158
+ @wiki.repo.git.rm(path, :force => true)
159
159
  else
160
- @wiki.repo.git.checkout({}, 'HEAD', '--', path)
160
+ @wiki.repo.git.checkout(path, 'HEAD')
161
161
  end
162
162
  end
163
163
  end
@@ -73,7 +73,7 @@ module Gollum
73
73
  return @on_disk_path
74
74
  end
75
75
 
76
- # Public: The Grit::Commit version of the file.
76
+ # Public: The Gollum::Git::Commit version of the file.
77
77
  attr_accessor :version
78
78
 
79
79
  # Public: The String path of the file.
@@ -86,7 +86,7 @@ module Gollum
86
86
 
87
87
  # Populate the File with information from the Blob.
88
88
  #
89
- # blob - The Grit::Blob that contains the info.
89
+ # blob - The Gollum::Git::Blob that contains the info.
90
90
  # path - The String directory path of the file.
91
91
  #
92
92
  # Returns the populated Gollum::File.
@@ -139,7 +139,7 @@ module Gollum
139
139
  def find(name, version, try_on_disk=false)
140
140
  checked = name.downcase
141
141
  map = @wiki.tree_map_for(version)
142
- commit = version.is_a?(Grit::Commit) ? version : @wiki.commit_for(version)
142
+ commit = version.is_a?(Gollum::Git::Commit) ? version : @wiki.commit_for(version)
143
143
 
144
144
  if entry = map.detect { |entry| entry.path.downcase == checked }
145
145
  @path = name
@@ -85,6 +85,9 @@ class Gollum::Filter::Code < Gollum::Filter
85
85
  end
86
86
  else # Rouge
87
87
  begin
88
+ # if `lang` was not defined then assume plaintext
89
+ # if `lang` is defined but cannot be found then wrap it and escape it
90
+ lang ||= 'plaintext'
88
91
  if Rouge::Lexer.find(lang).nil?
89
92
  lexer = Rouge::Lexers::PlainText.new
90
93
  formatter = Rouge::Formatters::HTML.new(:wrap => false)
@@ -110,7 +113,8 @@ class Gollum::Filter::Code < Gollum::Filter
110
113
  "<pre><code>#{CGI.escapeHTML(spec[:code])}</code></pre>"
111
114
  end
112
115
  end
113
- data.gsub!(id) do
116
+ # Removes paragraph tags surrounding <pre> blocks, see issue https://github.com/gollum/gollum-lib/issues/97
117
+ data.gsub!(/(<p>#{id}<\/p>|#{id})/) do
114
118
  body
115
119
  end
116
120
  end
@@ -0,0 +1,56 @@
1
+ # ~*~ encoding: utf-8 ~*~
2
+
3
+ # Replace specified tokens with dynamically generated content.
4
+ class Gollum::Filter::Macro < Gollum::Filter
5
+ def extract(data)
6
+ quoted_arg = %r{".*?"}
7
+ unquoted_arg = %r{[^,)]+}
8
+ named_arg = %r{[a-z0-9_]+=".*?"}
9
+
10
+ arg = %r{(?:#{quoted_arg}|#{unquoted_arg}|#{named_arg})}
11
+ arg_list = %r{(\s*|#{arg}(?:\s*,\s*#{arg})*)}
12
+
13
+ data.gsub(/\<\<\s*([A-Z][A-Za-z0-9]*)\s*\(#{arg_list}\)\s*\>\>/) do
14
+ id = Digest::SHA1.hexdigest($1 + $2)
15
+ macro = $1
16
+ argstr = $2
17
+ args = []
18
+ opts = {}
19
+
20
+ argstr.scan /,?\s*(#{arg})\s*/ do |arg|
21
+ # Stabstabstab
22
+ arg = arg.first
23
+
24
+ if arg =~ /^([a-z0-9_]+)="(.*?)"/
25
+ opts[$1] = $2
26
+ elsif arg =~ /^"(.*)"$/
27
+ args << $1
28
+ else
29
+ args << arg
30
+ end
31
+ end
32
+
33
+ args << opts unless opts.empty?
34
+
35
+ @map[id] = { :macro => macro, :args => args }
36
+ id
37
+ end
38
+ end
39
+
40
+ def process(data)
41
+ @map.each do |id, spec|
42
+ macro = spec[:macro]
43
+ args = spec[:args]
44
+
45
+ data.gsub!(id) do
46
+ begin
47
+ Gollum::Macro.instance(macro, @markup.wiki, @markup.page).render(*args)
48
+ rescue StandardError => e
49
+ "!!!Macro Error: #{e.message}!!!"
50
+ end
51
+ end
52
+ end
53
+
54
+ data
55
+ end
56
+ end
@@ -15,51 +15,53 @@ class Gollum::Filter::Tags < Gollum::Filter
15
15
  parts = $2.split('][')
16
16
  parts[0][0..4] = ""
17
17
  link = "#{parts[1]}|#{parts[0].sub(/\.org/, '')}"
18
- id = Digest::SHA1.hexdigest(link)
19
- @map[id] = link
18
+ id = register_tag(link)
20
19
  "#{pre}#{id}#{post}"
21
20
  else
22
21
  $&
23
22
  end
24
23
  else
25
- id = Digest::SHA1.hexdigest($2)
26
- @map[id] = $2
24
+ id = register_tag($2)
27
25
  "#{$1}#{id}#{$3}"
28
26
  end
29
27
  end
30
28
  data
31
29
  end
32
30
 
33
- # Process all tags from the tagmap and replace the placeholders with the
31
+ def register_tag(tag)
32
+ id = "TAG#{Digest::SHA1.hexdigest(tag)}TAG"
33
+ @map[id] = tag
34
+ id
35
+ end
36
+
37
+ # Process all text nodes from the doc and replace the placeholders with the
34
38
  # final markup.
35
- def process(data)
36
- @map.each do |id, tag|
37
- # If it's preformatted, just put the tag back
38
- if is_preformatted?(data, id)
39
- data.gsub!(id) do
40
- "[[#{tag}]]"
41
- end
42
- else
43
- data.gsub!(id) do
44
- process_tag(tag).gsub('%2F', '/')
39
+ def process(rendered_data)
40
+ doc = Nokogiri::HTML::DocumentFragment.parse(rendered_data)
41
+ doc.traverse do |node|
42
+ if node.text? then
43
+ content = node.content
44
+ content.gsub!(/TAG[a-f0-9]+TAG/) do |id|
45
+ if tag = @map[id] then
46
+ if is_preformatted?(node) then
47
+ "[[#{tag}]]"
48
+ else
49
+ process_tag(tag).gsub('%2f', '/')
50
+ end
51
+ end
45
52
  end
53
+ node.replace(content) if content != node.content
46
54
  end
47
55
  end
48
56
 
49
- data
57
+ doc.to_html
50
58
  end
51
59
 
52
60
  private
53
- # Find `id` within `data` and determine if it's within
54
- # preformatted tags.
55
- #
56
- # data - The String data (with placeholders).
57
- # id - The String SHA1 hash.
61
+
58
62
  PREFORMATTED_TAGS = %w(code tt)
59
63
 
60
- def is_preformatted?(data, id)
61
- doc = Nokogiri::HTML::DocumentFragment.parse(data)
62
- node = doc.search("[text()*='#{id}']").first
64
+ def is_preformatted?(node)
63
65
  node && (PREFORMATTED_TAGS.include?(node.name) ||
64
66
  node.ancestors.any? { |a| PREFORMATTED_TAGS.include?(a.name) })
65
67
  end
@@ -79,6 +81,8 @@ class Gollum::Filter::Tags < Gollum::Filter
79
81
  html
80
82
  elsif html = process_image_tag(tag)
81
83
  html
84
+ elsif html = process_external_link_tag(tag)
85
+ html
82
86
  elsif html = process_file_link_tag(tag)
83
87
  html
84
88
  else
@@ -199,6 +203,35 @@ class Gollum::Filter::Tags < Gollum::Filter
199
203
  end
200
204
  end
201
205
 
206
+ # Return the String HTML if the tag is a valid external link tag or
207
+ # nil if it is not.
208
+ def process_external_link_tag(tag)
209
+ parts = tag.split('|')
210
+ return if parts.size.zero?
211
+ if parts.size == 1
212
+ url = parts[0].strip
213
+ else
214
+ name, url = *parts.compact.map(&:strip)
215
+ end
216
+ accepted_protocols = @markup.wiki.sanitization.protocols['a']['href'].dup
217
+ if accepted_protocols.include?(:relative)
218
+ accepted_protocols.select!{|protocol| protocol != :relative}
219
+ regexp = %r{^((#{accepted_protocols.join("|")}):)?(//)}
220
+ else
221
+ regexp = %r{^((#{accepted_protocols.join("|")}):)}
222
+ end
223
+ if url =~ regexp
224
+ if name.nil?
225
+ %{<a href="#{url}">#{url}</a>}
226
+ else
227
+ %{<a href="#{url}">#{name}</a>}
228
+ end
229
+ else
230
+ nil
231
+ end
232
+
233
+ end
234
+
202
235
  # Attempt to process the tag as a file link tag.
203
236
  #
204
237
  # tag - The String tag contents (the stuff inside the double
@@ -214,8 +247,6 @@ class Gollum::Filter::Tags < Gollum::Filter
214
247
  path = parts[1] && parts[1].strip
215
248
  path = if path && file = @markup.find_file(path)
216
249
  ::File.join @markup.wiki.base_path, file.path
217
- elsif path =~ %r{^https?://}
218
- path
219
250
  else
220
251
  nil
221
252
  end
@@ -243,25 +274,21 @@ class Gollum::Filter::Tags < Gollum::Filter
243
274
  name, page_name = *parts.compact.map(&:strip)
244
275
  cname = @markup.wiki.page_class.cname(page_name || name)
245
276
 
246
- if name =~ %r{^https?://} && page_name.nil?
247
- %{<a href="#{name}">#{name}</a>}
248
- else
249
- presence = "absent"
250
- link_name = cname
251
- page, extra = find_page_from_name(cname)
252
- if page
253
- link_name = @markup.wiki.page_class.cname(page.name)
254
- presence = "present"
255
- end
256
- link = ::File.join(@markup.wiki.base_path, page ? page.escaped_url_path : CGI.escape(link_name))
277
+ presence = "absent"
278
+ link_name = cname
279
+ page, extra = find_page_from_name(cname)
280
+ if page
281
+ link_name = @markup.wiki.page_class.cname(page.name)
282
+ presence = "present"
283
+ end
284
+ link = ::File.join(@markup.wiki.base_path, page ? page.escaped_url_path : CGI.escape(link_name))
257
285
 
258
- # //page is invalid
259
- # strip all duplicate forward slashes using helpers.rb trim_leading_slash
260
- # //page => /page
261
- link = trim_leading_slash link
286
+ # //page is invalid
287
+ # strip all duplicate forward slashes using helpers.rb trim_leading_slash
288
+ # //page => /page
289
+ link = trim_leading_slash link
262
290
 
263
- %{<a class="internal #{presence}" href="#{link}#{extra}">#{name}</a>}
264
- end
291
+ %{<a class="internal #{presence}" href="#{link}#{extra}">#{name}</a>}
265
292
  end
266
293
 
267
294
  # Find a page from a given cname. If the page has an anchor (#) and has