Class: Gollum::Page
Constant Summary collapse
- VALID_PAGE_RE =
/^(.+)\.(md|mkdn?|mdown|markdown|textile|rdoc|org|creole|re?st(\.txt)?|asciidoc|pod|(media)?wiki)$/i
- FORMAT_NAMES =
{ :markdown => "Markdown", :textile => "Textile", :rdoc => "RDoc", :org => "Org-mode", :creole => "Creole", :rest => "reStructuredText", :asciidoc => "AsciiDoc", :mediawiki => "MediaWiki", :pod => "Pod" }
Instance Attribute Summary collapse
-
#historical ⇒ Object
writeonly
Sets a Boolean determing whether this page is a historical version.
-
#path ⇒ Object
readonly
Public: The path of the page within the repo.
-
#version ⇒ Object
Public: The current version of the page.
-
#wiki ⇒ Object
readonly
The underlying wiki repo.
Class Method Summary collapse
-
.canonicalize_filename(filename) ⇒ Object
Reusable filter to turn a filename (without path) into a canonical name.
-
.cname(name, char_white_sub = '-', char_other_sub = '-') ⇒ Object
Convert a human page name into a canonical page name.
-
.format_for(filename) ⇒ Object
Public: The format of a given filename.
-
.format_to_ext(format) ⇒ Object
Convert a format Symbol into an extension String.
-
.strip_filename(filename) ⇒ Object
Reusable filter to strip extension and path from filename.
-
.valid_filename?(filename) ⇒ Boolean
Checks if a filename has a valid extension understood by GitHub::Markup.
-
.valid_page_name?(filename) ⇒ Boolean
Checks if a filename has a valid extension understood by GitHub::Markup.
Instance Method Summary collapse
-
#filename ⇒ Object
Public: The on-disk filename of the page including extension.
-
#filename_stripped ⇒ Object
Public: The on-disk filename of the page with extension stripped.
-
#find(name, version) ⇒ Object
Find a page in the given Gollum repo.
-
#find_page_in_tree(map, name, checked_dir = nil) ⇒ Object
Find a page in a given tree.
-
#find_sub_page(name) ⇒ Object
Loads a sub page.
-
#footer ⇒ Object
Public: The footer Page.
-
#format ⇒ Object
Public: The format of the page.
-
#formatted_data(encoding = nil, &block) ⇒ Object
Public: The formatted contents of the page.
-
#historical? ⇒ Boolean
Gets a Boolean determining whether this page is a historical version.
-
#initialize(wiki) ⇒ Page
constructor
Public: Initialize a page.
- #inspect ⇒ Object
-
#markup_class ⇒ Object
Gets the Gollum::Markup instance that will render this page’s content.
-
#name ⇒ Object
Public: The canonical page name without extension, and dashes converted to spaces.
-
#page_match(name, filename) ⇒ Object
Compare the canonicalized versions of the two names.
-
#populate(blob, path = nil) ⇒ Object
Populate the Page with information from the Blob.
-
#raw_data ⇒ Object
Public: The raw contents of the page.
-
#sidebar ⇒ Object
Public: The sidebar Page.
-
#text_data(encoding = nil) ⇒ Object
Public: A text data encoded in specified encoding.
-
#title ⇒ Object
Public: If the first element of a formatted page is an <h1> tag it can be considered the title of the page and used in the display.
-
#tree_path(treemap, tree) ⇒ Object
The full directory path for the given tree.
-
#versions(options = {}) ⇒ Object
Public: All of the versions that have touched the Page.
Methods included from Pagination
included, #log_pagination_options, #page_to_skip
Constructor Details
#initialize(wiki) ⇒ Page
Public: Initialize a page.
wiki - The Gollum::Wiki in question.
Returns a newly initialized Gollum::Page.
100 101 102 103 |
# File 'lib/gollum/page.rb', line 100 def initialize(wiki) @wiki = wiki @blob = @footer = @sidebar = nil end |
Instance Attribute Details
#historical=(value) ⇒ Object (writeonly)
Sets a Boolean determing whether this page is a historical version.
Returns nothing.
21 22 23 |
# File 'lib/gollum/page.rb', line 21 def historical=(value) @historical = value end |
#path ⇒ Object (readonly)
Public: The path of the page within the repo.
Returns the String path.
161 162 163 |
# File 'lib/gollum/page.rb', line 161 def path @path end |
#version ⇒ Object
Public: The current version of the page.
Returns the Grit::Commit.
211 212 213 |
# File 'lib/gollum/page.rb', line 211 def version @version end |
#wiki ⇒ Object (readonly)
The underlying wiki repo.
Returns the Gollum::Wiki containing the page.
312 313 314 |
# File 'lib/gollum/page.rb', line 312 def wiki @wiki end |
Class Method Details
.canonicalize_filename(filename) ⇒ Object
Reusable filter to turn a filename (without path) into a canonical name. Strips extension, converts dashes to spaces.
Returns the filtered String.
82 83 84 |
# File 'lib/gollum/page.rb', line 82 def self.canonicalize_filename(filename) strip_filename(filename).gsub('-', ' ') end |
.cname(name, char_white_sub = '-', char_other_sub = '-') ⇒ Object
Convert a human page name into a canonical page name.
name - The String human page name. char_white_sub - Substitution for whitespace char_other_sub - Substitution for other special chars
Examples
Page.cname("Bilbo Baggins")
# => 'Bilbo-Baggins'
Page.cname("Bilbo Baggins",'_')
# => 'Bilbo_Baggins'
Returns the String canonical name.
278 279 280 281 282 |
# File 'lib/gollum/page.rb', line 278 def self.cname(name, char_white_sub = '-', char_other_sub = '-') name.respond_to?(:gsub) ? name.gsub(%r{\s},char_white_sub).gsub(%r{[/<>+]}, char_other_sub) : '' end |
.format_for(filename) ⇒ Object
Public: The format of a given filename.
filename - The String filename.
Returns the Symbol format of the page. One of:
[ :markdown | :textile | :rdoc | :org | :rest | :asciidoc | :pod |
:roff ]
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/gollum/page.rb', line 51 def self.format_for(filename) case filename.to_s when /\.(md|mkdn?|mdown|markdown)$/i :markdown when /\.(textile)$/i :textile when /\.(rdoc)$/i :rdoc when /\.(org)$/i :org when /\.(creole)$/i :creole when /\.(re?st(\.txt)?)$/i :rest when /\.(asciidoc)$/i :asciidoc when /\.(pod)$/i :pod when /\.(\d)$/i :roff when /\.(media)?wiki$/i :mediawiki else nil end end |
.format_to_ext(format) ⇒ Object
Convert a format Symbol into an extension String.
format - The format Symbol.
Returns the String extension (no leading period).
289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/gollum/page.rb', line 289 def self.format_to_ext(format) case format when :markdown then 'md' when :textile then 'textile' when :rdoc then 'rdoc' when :org then 'org' when :creole then 'creole' when :rest then 'rest' when :asciidoc then 'asciidoc' when :pod then 'pod' when :mediawiki then 'mediawiki' end end |
.strip_filename(filename) ⇒ Object
Reusable filter to strip extension and path from filename
filename - The string path or filename to strip
Returns the stripped String.
91 92 93 |
# File 'lib/gollum/page.rb', line 91 def self.strip_filename(filename) ::File.basename(filename, ::File.extname(filename)) end |
.valid_filename?(filename) ⇒ Boolean
Checks if a filename has a valid extension understood by GitHub::Markup.
filename - String filename, like “Home.md”.
Returns the matching String basename of the file without the extension.
28 29 30 |
# File 'lib/gollum/page.rb', line 28 def self.valid_filename?(filename) filename && filename.to_s =~ VALID_PAGE_RE && $1 end |
.valid_page_name?(filename) ⇒ Boolean
Checks if a filename has a valid extension understood by GitHub::Markup. Also, checks if the filename has no “_” in the front (such as _Footer.md).
filename - String filename, like “Home.md”.
Returns the matching String basename of the file without the extension.
39 40 41 42 |
# File 'lib/gollum/page.rb', line 39 def self.valid_page_name?(filename) match = valid_filename?(filename) filename =~ /^_/ ? false : match end |
Instance Method Details
#filename ⇒ Object
Public: The on-disk filename of the page including extension.
Returns the String name.
108 109 110 |
# File 'lib/gollum/page.rb', line 108 def filename @blob && @blob.name end |
#filename_stripped ⇒ Object
Public: The on-disk filename of the page with extension stripped.
Returns the String name.
115 116 117 |
# File 'lib/gollum/page.rb', line 115 def filename_stripped self.class.strip_filename(filename) end |
#find(name, version) ⇒ Object
Find a page in the given Gollum repo.
name - The human or canonical String page name to find. version - The String version ID to find.
Returns a Gollum::Page or nil if the page could not be found.
325 326 327 328 329 330 331 332 333 334 |
# File 'lib/gollum/page.rb', line 325 def find(name, version) map = @wiki.tree_map_for(version.to_s) if page = find_page_in_tree(map, name) page.version = version.is_a?(Grit::Commit) ? version : @wiki.commit_for(version) page.historical = page.version.to_s == version.to_s page end rescue Grit::GitRuby::Repository::NoSuchShaFound end |
#find_page_in_tree(map, name, checked_dir = nil) ⇒ Object
Find a page in a given tree.
map - The Array tree map from Wiki#tree_map. name - The canonical String page name. checked_dir - Optional String of the directory a matching page needs
to be in. The string should
Returns a Gollum::Page or nil if the page could not be found.
344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 |
# File 'lib/gollum/page.rb', line 344 def find_page_in_tree(map, name, checked_dir = nil) return nil if !map || name.to_s.empty? if checked_dir = BlobEntry.normalize_dir(checked_dir) checked_dir.downcase! end map.each do |entry| next if entry.name.to_s.empty? next unless checked_dir.nil? || entry.dir.downcase == checked_dir next unless page_match(name, entry.name) return entry.page(@wiki, @version) end return nil # nothing was found end |
#find_sub_page(name) ⇒ Object
Loads a sub page. Sub page nanes (footers) are prefixed with an underscore to distinguish them from other Pages.
name - String page name.
Returns the Page or nil if none exists.
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 |
# File 'lib/gollum/page.rb', line 407 def find_sub_page(name) return nil unless self.version return nil if self.filename =~ /^_/ name = "_#{name.to_s.capitalize}" return nil if page_match(name, self.filename) dirs = self.path.split('/') dirs.pop map = @wiki.tree_map_for(self.version.id) while !dirs.empty? if page = find_page_in_tree(map, name, dirs.join('/')) return page end dirs.pop end find_page_in_tree(map, name, '') end |
#footer ⇒ Object
Public: The footer Page.
Returns the footer Page or nil if none exists.
237 238 239 |
# File 'lib/gollum/page.rb', line 237 def @footer ||= find_sub_page(:footer) end |
#format ⇒ Object
Public: The format of the page.
Returns the Symbol format of the page. One of:
[ :markdown | :textile | :rdoc | :org | :rest | :asciidoc | :pod |
:roff ]
197 198 199 |
# File 'lib/gollum/page.rb', line 197 def format self.class.format_for(@blob.name) end |
#formatted_data(encoding = nil, &block) ⇒ Object
Public: The formatted contents of the page.
encoding - Encoding Constant or String.
Returns the String data.
188 189 190 |
# File 'lib/gollum/page.rb', line 188 def formatted_data(encoding = nil, &block) @blob && markup_class.render(historical?, encoding, &block) end |
#historical? ⇒ Boolean
Gets a Boolean determining whether this page is a historical version. Historical pages are pulled using exact SHA hashes and format all links with rel=“nofollow”
Returns true if the page is pulled from a named branch or tag, or false.
253 254 255 |
# File 'lib/gollum/page.rb', line 253 def historical? !!@historical end |
#inspect ⇒ Object
426 427 428 |
# File 'lib/gollum/page.rb', line 426 def inspect %(#<#{self.class.name}:#{object_id} #{name} (#{format}) @wiki=#{@wiki.repo.path.inspect}>) end |
#markup_class ⇒ Object
Gets the Gollum::Markup instance that will render this page’s content.
Returns a Gollum::Markup instance.
204 205 206 |
# File 'lib/gollum/page.rb', line 204 def markup_class @markup_class ||= @wiki.markup_classes[format].new(self) end |
#name ⇒ Object
Public: The canonical page name without extension, and dashes converted to spaces.
Returns the String name.
123 124 125 |
# File 'lib/gollum/page.rb', line 123 def name self.class.canonicalize_filename(filename) end |
#page_match(name, filename) ⇒ Object
Compare the canonicalized versions of the two names.
name - The human or canonical String page name. filename - the String filename on disk (including extension).
Returns a Boolean.
392 393 394 395 396 397 398 399 |
# File 'lib/gollum/page.rb', line 392 def page_match(name, filename) if match = self.class.valid_filename?(filename) @wiki.ws_subs.each do |sub| return true if Page.cname(name).downcase == Page.cname(match, sub).downcase end end false end |
#populate(blob, path = nil) ⇒ Object
Populate the Page with information from the Blob.
blob - The Grit::Blob that contains the info. path - The String directory path of the page file.
Returns the populated Gollum::Page.
366 367 368 369 370 |
# File 'lib/gollum/page.rb', line 366 def populate(blob, path=nil) @blob = blob @path = "#{path}/#{blob.name}"[1..-1] self end |
#raw_data ⇒ Object
Public: The raw contents of the page.
Returns the String data.
166 167 168 |
# File 'lib/gollum/page.rb', line 166 def raw_data @blob && @blob.data end |
#sidebar ⇒ Object
Public: The sidebar Page.
Returns the sidebar Page or nil if none exists.
244 245 246 |
# File 'lib/gollum/page.rb', line 244 def @sidebar ||= find_sub_page(:sidebar) end |
#text_data(encoding = nil) ⇒ Object
Public: A text data encoded in specified encoding.
encoding - An Encoding or nil
Returns a character encoding aware String.
175 176 177 178 179 180 181 |
# File 'lib/gollum/page.rb', line 175 def text_data(encoding=nil) if raw_data.respond_to?(:encoding) raw_data.force_encoding(encoding || Encoding::UTF_8) else raw_data end end |
#title ⇒ Object
Public: If the first element of a formatted page is an <h1> tag it can be considered the title of the page and used in the display. If the first element is NOT an <h1> tag, the title will be constructed from the filename by stripping the extension and replacing any dashes with spaces.
Returns the fully sanitized String title.
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/gollum/page.rb', line 134 def title doc = Nokogiri::HTML(%{<div id="gollum-root">} + self.formatted_data + %{</div>}) header = case self.format when :asciidoc doc.css("div#gollum-root > div#header > h1:first-child") when :org doc.css("div#gollum-root > p.title:first-child") when :pod doc.css("div#gollum-root > a.dummyTopAnchor:first-child + h1") when :rest doc.css("div#gollum-root > div > div > h1:first-child") else doc.css("div#gollum-root > h1:first-child") end if !header.empty? Sanitize.clean(header.to_html) else Sanitize.clean(name) end.strip end |
#tree_path(treemap, tree) ⇒ Object
The full directory path for the given tree.
treemap - The Hash treemap containing parentage information. tree - The Grit::Tree for which to compute the path.
Returns the String path.
378 379 380 381 382 383 384 |
# File 'lib/gollum/page.rb', line 378 def tree_path(treemap, tree) if ptree = treemap[tree] tree_path(treemap, ptree) + '/' + tree.name else '' end end |
#versions(options = {}) ⇒ Object
Public: All of the versions that have touched the Page.
options - The options Hash:
:page - The Integer page number (default: 1).
:per_page - The Integer max count of items to return.
:follow - Follow's a file across renames, but falls back
to a slower Grit native call. (default: false)
Returns an Array of Grit::Commit.
222 223 224 225 226 227 228 229 230 231 232 |
# File 'lib/gollum/page.rb', line 222 def versions( = {}) if [:follow] [:pretty] = 'raw' .delete :max_count .delete :skip log = @wiki.repo.git.native "log", , @wiki.ref, "--", @path Grit::Commit.list_from_string(@wiki.repo, log) else @wiki.repo.log(@wiki.ref, @path, ()) end end |