# coding: utf-8 load 'pandoc.rb' require 'erb' require 'date' require 'set' require 'uri' $license_urls = { "CC BY-SA-3.0" => 'https://creativecommons.org/licenses/by-sa/3.0/', 'WTFPL-2' => "http://www.wtfpl.net/txt/copying/", } $person_uris = { "Luke Shumaker" => "https://lukeshu.com/", "Andrew Murrell" => "https://andrewdm.me/", } $person_emails = { "Luke Shumaker" => "lukeshu@parabola.nu", "Andrew Murrell" => "ImFromNASA@gmail.com", } $tag_names = { "DM" => "DMing Resource", "ES" => "Essay", "FF" => "Flash Fiction", "HB" => "Homebrew", "SS" => "Short Story", "WP" => "WIP", } $url = URI::parse('https://www.andrewdm.me') class Tag def initialize(abbr) @abbr = abbr end def abbr @abbr end def name $tag_names[@abbr] end def html return "#{name}" end end class Person def initialize(name) @name = name end def name @name end def uri $person_uris[@name] end def email $person_emails[@name] end def html if not email.nil? return "#{name}" elsif not uri.nil? return "#{name}" else return @name end end def atom ret = "" ret += "#{name}" unless name.nil? ret += "#{uri}" unless uri.nil? ret += "#{email}" unless email.nil? end end class License def initialize(name) @name = name end def name @name end def url $license_urls[@name] end def html "#{name}" end end class Page def initialize(infile) @infile = infile end def infile ; @infile ; end def input ; @input ||= File.read(infile) ; end def pandoc if @pandoc.nil? types = { 'md' => 'markdown' } ext = File.extname(infile).gsub(/^[.]/, '') type = types[ext] || ext @pandoc = Pandoc::load(type, input) if @pandoc['pandoc_format'] @pandoc = Pandoc::load(@pandoc['pandoc_format'], input) end end @pandoc end def title ; @title ||= pandoc['title'] || input.split("\n",2).first ; end def showtitle ; @showtitle ||= ! pandoc['title'].nil? ; end def author ; @author ||= Person.new( pandoc['author'] || "Andrew Murrell") ; end def license ; @license ||= License.new(pandoc['license'] || "CC BY-SA-3.0") ; end def content ; @content ||= pandoc.to('html5 '+(pandoc['pandoc_flags']||'')) ; end def head ; @head ||= pandoc['html_head_extra'] ; end def class ; @class ||= pandoc['class'] ; end def tags if @tags.nil? raw = pandoc['tags'] || [] if raw.is_a?(String) raw = raw.split end @tags = raw.map{|tag|Tag.new(tag)} end @tags end def _published if @_published.nil? raw = pandoc['published'] @_published = Date.parse(raw) unless raw.nil? end if @_published.nil? raw = `git log -n1 --reverse --format='%cI' -- #{infile}` @_published = DateTime.iso8601(raw) unless raw.empty? end @_published end def _updated if @_updated.nil? raw = pandoc['updated'] @_updated = Date.parse(raw) unless raw.nil? end if @_updated.nil? raw = `git log -n1 --format='%cI' -- #{infile}` @_updated = DateTime.iso8601(raw) unless raw.empty? end @_updated end def published if @published.nil? unless _published.nil? @published = _published else unless _updated.nil? @published = _updated end end # sanity check unless _published.nil? or _updated.nil? if _updated < _published @published = _updated end end end @published end def updated if @updated.nil? unless _updated.nil? @updated = _updated else unless _published.nil? @updated = _published end end end @updated end def rights if published.nil? || updated.nil? years = '' else first = published.year last = updated.year years = `git log --date=format:'%Y' --format='%cd' -- .config/login.sh`.split('\n').map{|s|s.to_i} years.unshift(first) years.unshift(last) # Remove dups and git years outside of [first,last] # TODO: simplify year spans years = Set[*years.select{|i|i > first && i < last}].sort.join(', ') end @rights ||= "

The content of this page is Copyright © #{years} #{author.html}.

\n" + "

This page is licensed under the #{license.html} license.

" end def abssrcpath @srcpath ||= infile.sub(/^(src|out)\//, '/') end def absoutpath @outpath ||= abssrcpath.sub(/\.[^\/.]*$/, '.html').sub(/\/index[.]html$/, '') end def url @url ||= $url + absoutpath end def srcurl @srcurl ||= $url + abssrcpath end def breadcrumbs if @breadcrumbs.nil? bc = [] u = url.path u = "/" if u == "" while u != "/" bc.unshift("#{File.basename(u, File.extname(u))}") u = File.dirname(u) end bc.unshift("Andrew D. Murrell") @breadcrumbs = bc.join(' » ') end @breadcrumbs end end def html_escape(html) html .gsub('&', '&') .gsub('>', '>') .gsub('<', '<') end class ExternPage def initialize(metadata) @metadata = metadata end def title @metadata['title'] end def content nil end def tags if @tags.nil? raw = @metadata['tags'] || [] if raw.is_a?(String) raw = raw.split end @tags = raw.map{|tag|Tag.new(tag)} end return @tags end def url return $url + @metadata['url'] end def author Person.new(@metadata['author'] || "Andrew Murrell") end def published str = @metadata['published'] if str.nil? and ! @metadata['updated'].nil? str = @metadata['updated'] end return Date.parse(str) end def updated str = @metadata['updated'] if str.nil? and ! @metadata['published'].nil? str = @metadata['published'] end return Date.parse(str) end end