Class: Gollum::Page
- Inherits:
-
Object
- Object
- Gollum::Page
- Includes:
- Pagination
- Defined in:
- lib/gollum-lib/page.rb
Constant Summary collapse
- SUBPAGENAMES =
[:header, :footer, :sidebar]
Instance Attribute Summary collapse
-
#historical ⇒ Object
writeonly
Sets a Boolean determing whether this page is a historical version.
-
#parent_page ⇒ Object
Parent page if this is a sub page.
-
#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.
-
.parse_filename(filename) ⇒ Object
Checks a filename against the registered markup extensions.
-
.strip_filename(filename) ⇒ Object
Reusable filter to strip extension and path from filename.
-
.valid_filename?(filename) ⇒ Boolean
Checks if a filename has a valid, registered extension.
-
.valid_page_name?(filename) ⇒ Boolean
Checks if a filename has a valid extension understood by GitHub::Markup.
Instance Method Summary collapse
-
#escaped_url_path ⇒ Object
Public: The url_path, but CGI escaped.
-
#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, dir = nil, exact = false) ⇒ Object
Find a page in the given Gollum repo.
-
#find_page_in_tree(map, name, checked_dir = nil, exact = false) ⇒ Object
Find a page in a given tree.
-
#find_sub_pages(subpagenames = SUBPAGENAMES, map = nil) ⇒ Object
Loads sub pages.
-
#footer ⇒ Object
Public: The footer Page.
-
#format ⇒ Object
Public: The format of the page.
-
#formatted_data(encoding = nil, include_levels = 10, &block) ⇒ Object
Public: The formatted contents of the page.
-
#header ⇒ Object
Public: The header Page.
-
#historical? ⇒ Boolean
Gets a Boolean determining whether this page is a historical version.
-
#initialize(wiki) ⇒ Page
constructor
Public: Initialize a page.
- #inspect ⇒ Object
-
#last_version ⇒ Object
Public: The last version that has touched the Page.
-
#markup_class ⇒ Object
Gets the Gollum::Markup instance that will render this page’s content.
-
#metadata ⇒ Object
Public: Embedded metadata.
-
#metadata_title ⇒ Object
Public: Metadata title.
-
#name ⇒ Object
Public: The canonical page name without extension, and dashes converted to spaces.
-
#page_match(name, path) ⇒ 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.
-
#sub_page ⇒ Object
Public: Determines if this is a sub-page Sub-pages have filenames beginning with an underscore.
-
#text_data(encoding = nil) ⇒ Object
Public: A text data encoded in specified encoding.
-
#title ⇒ Object
Public: The title will be constructed from the filename by stripping the extension and replacing any dashes with spaces.
-
#toc_data ⇒ Object
Public: The table of contents of the page.
-
#tree_path(treemap, tree) ⇒ Object
The full directory path for the given tree.
-
#url_path ⇒ Object
Public: The url path required to reach this page within the repo.
-
#url_path_display ⇒ Object
Public: The display form of the url path required to reach this page within the repo.
-
#url_path_title ⇒ Object
Public: Defines title for page.rb.
-
#version_short ⇒ Object
Public: The first 7 characters of the current version.
-
#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.
88 89 90 91 92 93 94 |
# File 'lib/gollum-lib/page.rb', line 88 def initialize(wiki) @wiki = wiki @blob = nil @formatted_data = nil @doc = nil @parent_page = nil end |
Instance Attribute Details
#historical=(value) ⇒ Object (writeonly)
Sets a Boolean determing whether this page is a historical version.
Returns nothing.
13 14 15 |
# File 'lib/gollum-lib/page.rb', line 13 def historical=(value) @historical = value end |
#parent_page ⇒ Object
Parent page if this is a sub page
Returns a Page
18 19 20 |
# File 'lib/gollum-lib/page.rb', line 18 def parent_page @parent_page end |
#path ⇒ Object (readonly)
Public: The path of the page within the repo.
Returns the String path.
138 139 140 |
# File 'lib/gollum-lib/page.rb', line 138 def path @path end |
#version ⇒ Object
Public: The current version of the page.
Returns the Gollum::Git::Commit.
272 273 274 |
# File 'lib/gollum-lib/page.rb', line 272 def version @version end |
#wiki ⇒ Object (readonly)
The underlying wiki repo.
Returns the Gollum::Wiki containing the page.
379 380 381 |
# File 'lib/gollum-lib/page.rb', line 379 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.
70 71 72 |
# File 'lib/gollum-lib/page.rb', line 70 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.
355 356 357 358 359 |
# File 'lib/gollum-lib/page.rb', line 355 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 the registered format types
62 63 64 |
# File 'lib/gollum-lib/page.rb', line 62 def self.format_for(filename) self.parse_filename(filename).last 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).
366 367 368 |
# File 'lib/gollum-lib/page.rb', line 366 def self.format_to_ext(format) format == :markdown ? "md" : format.to_s end |
.parse_filename(filename) ⇒ Object
Checks a filename against the registered markup extensions
filename - String filename, like “Home.md”
Returns e.g. [“Home”, :markdown], or [] if the extension is unregistered
26 27 28 29 30 31 32 33 34 |
# File 'lib/gollum-lib/page.rb', line 26 def self.parse_filename(filename) return [] unless filename =~ /^(.+)\.([a-zA-Z]\w*)$/i pref, ext = Regexp.last_match[1], Regexp.last_match[2] Gollum::Markup.formats.each_pair do |name, format| return [pref, name] if ext =~ format[:regexp] 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.
79 80 81 |
# File 'lib/gollum-lib/page.rb', line 79 def self.strip_filename(filename) ::File.basename(filename, ::File.extname(filename)) end |
.valid_filename?(filename) ⇒ Boolean
Checks if a filename has a valid, registered extension
filename - String filename, like “Home.md”.
Returns the matching String basename of the file without the extension.
41 42 43 |
# File 'lib/gollum-lib/page.rb', line 41 def self.valid_filename?(filename) self.parse_filename(filename).first 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.
52 53 54 55 |
# File 'lib/gollum-lib/page.rb', line 52 def self.valid_page_name?(filename) match = valid_filename?(filename) filename =~ /^_/ ? false : match end |
Instance Method Details
#escaped_url_path ⇒ Object
Public: The url_path, but CGI escaped.
Returns the String url_path
185 186 187 |
# File 'lib/gollum-lib/page.rb', line 185 def escaped_url_path CGI.escape(self.url_path).gsub('%2F', '/') end |
#filename ⇒ Object
Public: The on-disk filename of the page including extension.
Returns the String name.
99 100 101 |
# File 'lib/gollum-lib/page.rb', line 99 def filename @blob && @blob.name end |
#filename_stripped ⇒ Object
Public: The on-disk filename of the page with extension stripped.
Returns the String name.
106 107 108 |
# File 'lib/gollum-lib/page.rb', line 106 def filename_stripped self.class.strip_filename(filename) end |
#find(name, version, dir = nil, exact = false) ⇒ 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.
392 393 394 395 396 397 398 399 400 401 |
# File 'lib/gollum-lib/page.rb', line 392 def find(name, version, dir = nil, exact = false) map = @wiki.tree_map_for(version.to_s) if (page = find_page_in_tree(map, name, dir, exact)) page.version = version.is_a?(Gollum::Git::Commit) ? version : @wiki.commit_for(version) page.historical = page.version.to_s == version.to_s page end rescue Gollum::Git::NoSuchShaFound end |
#find_page_in_tree(map, name, checked_dir = nil, exact = false) ⇒ 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.
411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 |
# File 'lib/gollum-lib/page.rb', line 411 def find_page_in_tree(map, name, checked_dir = nil, exact = false) return nil if !map || name.to_s.empty? checked_dir = BlobEntry.normalize_dir(checked_dir) checked_dir = '' if exact && checked_dir.nil? name = ::File.join(checked_dir, name) if checked_dir map.each do |entry| next if entry.name.to_s.empty? path = checked_dir ? ::File.join(entry.dir, entry.name) : entry.name next unless page_match(name, path) return entry.page(@wiki, @version) end return nil # nothing was found end |
#find_sub_pages(subpagenames = SUBPAGENAMES, map = nil) ⇒ Object
Loads sub pages. Sub page names (footers, headers, sidebars) are prefixed with an underscore to distinguish them from other Pages. If there is not one within the current directory, starts walking up the directory tree to try and find one within parent directories.
474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 |
# File 'lib/gollum-lib/page.rb', line 474 def find_sub_pages(subpagenames = SUBPAGENAMES, map = nil) subpagenames.each{|subpagename| instance_variable_set("@#{subpagename}", nil)} return nil if self.filename =~ /^_/ || ! self.version map ||= @wiki.tree_map_for(@wiki.ref, true) valid_names = subpagenames.map(&:capitalize).join("|") # From Ruby 2.2 onwards map.select! could be used map = map.select{|entry| entry.name =~ /^_(#{valid_names})/ } return if map.empty? subpagenames.each do |subpagename| dir = ::Pathname.new(self.path) while dir = dir.parent do subpageblob = map.find do |blob_entry| filename = "_#{subpagename.to_s.capitalize}" searchpath = dir == Pathname.new('.') ? Pathname.new(filename) : dir + filename entrypath = ::Pathname.new(blob_entry.path) # Ignore extentions entrypath = entrypath.dirname + entrypath.basename(entrypath.extname) entrypath == searchpath end if subpageblob instance_variable_set("@#{subpagename}", subpageblob.page(@wiki, @version) ) break end break if dir == Pathname.new('.') end end end |
#footer ⇒ Object
Public: The footer Page.
Returns the footer Page or nil if none exists.
312 313 314 315 |
# File 'lib/gollum-lib/page.rb', line 312 def find_sub_pages unless defined?(@footer) @footer end |
#format ⇒ Object
Public: The format of the page.
Returns the Symbol format of the page; one of the registered format types
258 259 260 |
# File 'lib/gollum-lib/page.rb', line 258 def format self.class.format_for(@blob.name) end |
#formatted_data(encoding = nil, include_levels = 10, &block) ⇒ Object
Public: The formatted contents of the page.
encoding - Encoding Constant or String.
Returns the String data.
221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
# File 'lib/gollum-lib/page.rb', line 221 def formatted_data(encoding = nil, include_levels = 10, &block) return nil unless @blob if @formatted_data && @doc then yield @doc if block_given? else @formatted_data = markup_class.render(historical?, encoding, include_levels) do |doc| @doc = doc yield doc if block_given? end end @formatted_data end |
#header ⇒ Object
Public: The header Page.
Returns the header Page or nil if none exists.
304 305 306 307 |
# File 'lib/gollum-lib/page.rb', line 304 def header find_sub_pages unless defined?(@header) @header 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.
330 331 332 |
# File 'lib/gollum-lib/page.rb', line 330 def historical? !!@historical end |
#inspect ⇒ Object
507 508 509 |
# File 'lib/gollum-lib/page.rb', line 507 def inspect %(#<#{self.class.name}:#{object_id} #{name} (#{format}) @wiki=#{@wiki.repo.path.inspect}>) end |
#last_version ⇒ Object
Public: The last version that has touched the Page. Can be nil.
Returns Gollum::Git::Commit, or nil.
289 290 291 292 |
# File 'lib/gollum-lib/page.rb', line 289 def last_version return @last_version if defined? @last_version @last_version = @wiki.repo.git.versions_for_path(@path, @wiki.ref, {:max_count => 1}).first end |
#markup_class ⇒ Object
Gets the Gollum::Markup instance that will render this page’s content.
Returns a Gollum::Markup instance.
265 266 267 |
# File 'lib/gollum-lib/page.rb', line 265 def markup_class @markup_class ||= @wiki.markup_classes[format].new(self) end |
#metadata ⇒ Object
Public: Embedded metadata.
Returns Hash of metadata.
250 251 252 253 |
# File 'lib/gollum-lib/page.rb', line 250 def formatted_data if markup_class. == nil markup_class. end |
#metadata_title ⇒ Object
Public: Metadata title
Set with <!– — title: New Title –> in page content
Returns the String title or nil if not defined
173 174 175 176 177 178 179 180 |
# File 'lib/gollum-lib/page.rb', line 173 def if title = ['title'] return title unless title.nil? end nil end |
#name ⇒ Object
Public: The canonical page name without extension, and dashes converted to spaces.
Returns the String name.
114 115 116 |
# File 'lib/gollum-lib/page.rb', line 114 def name self.class.canonicalize_filename(filename) end |
#page_match(name, path) ⇒ Object
Compare the canonicalized versions of the two names.
name - The human or canonical String page name. path - the String path on disk (including file extension).
Returns a Boolean.
460 461 462 463 464 465 466 467 |
# File 'lib/gollum-lib/page.rb', line 460 def page_match(name, path) if (match = self.class.valid_filename?(path)) @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 Gollum::Git::Blob that contains the info. path - The String directory path of the page file.
Returns the populated Gollum::Page.
434 435 436 437 438 |
# File 'lib/gollum-lib/page.rb', line 434 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.
192 193 194 195 196 197 198 199 200 201 |
# File 'lib/gollum-lib/page.rb', line 192 def raw_data return nil unless @blob if !@wiki.repo. && @blob.is_symlink new_path = @blob.symlink_target(::File.join(@wiki.repo.path, '..', self.path)) return IO.read(new_path) if new_path end @blob.data end |
#sidebar ⇒ Object
Public: The sidebar Page.
Returns the sidebar Page or nil if none exists.
320 321 322 323 |
# File 'lib/gollum-lib/page.rb', line 320 def find_sub_pages unless defined?(@sidebar) @sidebar end |
#sub_page ⇒ Object
Public: Determines if this is a sub-page Sub-pages have filenames beginning with an underscore
Returns true or false.
131 132 133 |
# File 'lib/gollum-lib/page.rb', line 131 def sub_page filename =~ /^_/ 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.
208 209 210 211 212 213 214 |
# File 'lib/gollum-lib/page.rb', line 208 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: The title will be constructed from the filename by stripping the extension and replacing any dashes with spaces.
Returns the fully sanitized String title.
123 124 125 |
# File 'lib/gollum-lib/page.rb', line 123 def title Sanitize.clean(name).strip end |
#toc_data ⇒ Object
Public: The table of contents of the page.
formatted_data - page already marked up in html.
Returns the String data.
241 242 243 244 245 |
# File 'lib/gollum-lib/page.rb', line 241 def toc_data return @parent_page.toc_data if @parent_page and @sub_page formatted_data if markup_class.toc == nil markup_class.toc end |
#tree_path(treemap, tree) ⇒ Object
The full directory path for the given tree.
treemap - The Hash treemap containing parentage information. tree - The Gollum::Git::Tree for which to compute the path.
Returns the String path.
446 447 448 449 450 451 452 |
# File 'lib/gollum-lib/page.rb', line 446 def tree_path(treemap, tree) if (ptree = treemap[tree]) tree_path(treemap, ptree) + '/' + tree.name else '' end end |
#url_path ⇒ Object
Public: The url path required to reach this page within the repo.
Returns the String url_path
143 144 145 146 147 148 149 150 151 152 |
# File 'lib/gollum-lib/page.rb', line 143 def url_path path = if self.path.include?('/') self.path.sub(/\/[^\/]+$/, '/') else '' end path << Page.cname(self.name, '-', '-') path end |
#url_path_display ⇒ Object
Public: The display form of the url path required to reach this page within the repo.
Returns the String url_path
157 158 159 |
# File 'lib/gollum-lib/page.rb', line 157 def url_path_display url_path.gsub("-", " ") end |
#url_path_title ⇒ Object
Public: Defines title for page.rb
Returns the String title
164 165 166 |
# File 'lib/gollum-lib/page.rb', line 164 def url_path_title || url_path_display end |
#version_short ⇒ Object
Public: The first 7 characters of the current version.
Returns the first 7 characters of the current version.
297 298 299 |
# File 'lib/gollum-lib/page.rb', line 297 def version_short version.to_s[0, 7] 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, slower. (default: false)
Returns an Array of Gollum::Git::Commit.
282 283 284 |
# File 'lib/gollum-lib/page.rb', line 282 def versions( = {}) @wiki.repo.git.versions_for_path(@path, @wiki.ref, ()) end |