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
(also: #title)
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.
-
#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.
131 132 133 |
# File 'lib/gollum-lib/page.rb', line 131 def path @path end |
#version ⇒ Object
Public: The current version of the page.
Returns the Gollum::Git::Commit.
265 266 267 |
# File 'lib/gollum-lib/page.rb', line 265 def version @version end |
#wiki ⇒ Object (readonly)
The underlying wiki repo.
Returns the Gollum::Wiki containing the page.
372 373 374 |
# File 'lib/gollum-lib/page.rb', line 372 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.
348 349 350 351 352 |
# File 'lib/gollum-lib/page.rb', line 348 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).
359 360 361 |
# File 'lib/gollum-lib/page.rb', line 359 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
178 179 180 |
# File 'lib/gollum-lib/page.rb', line 178 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.
385 386 387 388 389 390 391 392 393 394 |
# File 'lib/gollum-lib/page.rb', line 385 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.
404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 |
# File 'lib/gollum-lib/page.rb', line 404 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.
467 468 469 470 471 472 473 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 |
# File 'lib/gollum-lib/page.rb', line 467 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 subpage = subpageblob.page(@wiki, @version) subpage.parent_page = self instance_variable_set("@#{subpagename}", subpage) 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.
305 306 307 308 |
# File 'lib/gollum-lib/page.rb', line 305 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
251 252 253 |
# File 'lib/gollum-lib/page.rb', line 251 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.
214 215 216 217 218 219 220 221 222 223 224 225 226 227 |
# File 'lib/gollum-lib/page.rb', line 214 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.
297 298 299 300 |
# File 'lib/gollum-lib/page.rb', line 297 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.
323 324 325 |
# File 'lib/gollum-lib/page.rb', line 323 def historical? !!@historical end |
#inspect ⇒ Object
502 503 504 |
# File 'lib/gollum-lib/page.rb', line 502 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.
282 283 284 285 |
# File 'lib/gollum-lib/page.rb', line 282 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.
258 259 260 |
# File 'lib/gollum-lib/page.rb', line 258 def markup_class @markup_class ||= @wiki.markup_classes[format].new(self) end |
#metadata ⇒ Object
Public: Embedded metadata.
Returns Hash of metadata.
243 244 245 246 |
# File 'lib/gollum-lib/page.rb', line 243 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
166 167 168 169 170 171 172 173 |
# File 'lib/gollum-lib/page.rb', line 166 def if title = ['title'] return title unless title.nil? end nil end |
#name ⇒ Object Also known as: title
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.
453 454 455 456 457 458 459 460 |
# File 'lib/gollum-lib/page.rb', line 453 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.
427 428 429 430 431 |
# File 'lib/gollum-lib/page.rb', line 427 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.
185 186 187 188 189 190 191 192 193 194 |
# File 'lib/gollum-lib/page.rb', line 185 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.
313 314 315 316 |
# File 'lib/gollum-lib/page.rb', line 313 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.
124 125 126 |
# File 'lib/gollum-lib/page.rb', line 124 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.
201 202 203 204 205 206 207 |
# File 'lib/gollum-lib/page.rb', line 201 def text_data(encoding=nil) if raw_data.respond_to?(:encoding) raw_data.force_encoding(encoding || Encoding::UTF_8) else raw_data end end |
#toc_data ⇒ Object
Public: The table of contents of the page.
formatted_data - page already marked up in html.
Returns the String data.
234 235 236 237 238 |
# File 'lib/gollum-lib/page.rb', line 234 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.
439 440 441 442 443 444 445 |
# File 'lib/gollum-lib/page.rb', line 439 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
136 137 138 139 140 141 142 143 144 145 |
# File 'lib/gollum-lib/page.rb', line 136 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
150 151 152 |
# File 'lib/gollum-lib/page.rb', line 150 def url_path_display url_path.gsub("-", " ") end |
#url_path_title ⇒ Object
Public: Defines title for page.rb
Returns the String title
157 158 159 |
# File 'lib/gollum-lib/page.rb', line 157 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.
290 291 292 |
# File 'lib/gollum-lib/page.rb', line 290 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.
275 276 277 |
# File 'lib/gollum-lib/page.rb', line 275 def versions( = {}) @wiki.repo.git.versions_for_path(@path, @wiki.ref, ()) end |