summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/page_index.rb8
-rw-r--r--lib/page_local.rb15
-rw-r--r--lib/page_pdf.rb62
-rw-r--r--lib/sitegen.rb2
4 files changed, 83 insertions, 4 deletions
diff --git a/lib/page_index.rb b/lib/page_index.rb
index 585fd57..31d4682 100644
--- a/lib/page_index.rb
+++ b/lib/page_index.rb
@@ -28,13 +28,15 @@ class IndexPage < LocalPage
@ls ||= Dir::entries(local_infile)
.select{|fname|not fname.start_with?(".")}
.map{|fname|"#{local_infile}/#{fname}"}
- .select{|path|Dir::exist?(path) or Config::get.html_suffixes.include?(File::extname(path).gsub(/^[.]/, ''))}
end
def index_pages
if @pages.nil?
@pages = Set[]
for path in _ls
- @pages.add( Dir::exist?(path) ? IndexPage::new(path) : LocalPage::new(path) )
+ page = LocalPage::load(path)
+ unless page.nil?
+ @pages.add(page)
+ end
end
for data in (_metadata['external'] || [])
@pages.add(RemotePage::new(data))
@@ -59,7 +61,7 @@ class IndexPage < LocalPage
unless depth <= 1
ret += "<section><h#{depth}>[#{atom_title}](#{cururl.route_to(url)})</h#{depth}>\n\n"
end
- for page in index_pages.select{|page|not page.is_a?(IndexPage)}.sort_by{|page|page.atom_published}
+ for page in index_pages.select{|page|not page.is_a?(IndexPage)}.sort_by{|page|page.atom_updated}.reverse
ret += page.index_link(cururl, depth+1)
end
ret += "\n"
diff --git a/lib/page_local.rb b/lib/page_local.rb
index e13fa33..6c70ac3 100644
--- a/lib/page_local.rb
+++ b/lib/page_local.rb
@@ -9,6 +9,21 @@ require 'pandoc'
require 'person'
class LocalPage < Page
+ def self.load(inpath)
+ case
+ when Dir::exist?(inpath)
+ require 'page_index'
+ return IndexPage::new(inpath)
+ when [".md", ".org"].include?(File::extname(inpath))
+ return LocalPage::new(inpath)
+ when ".pdf" == File::extname(inpath)
+ require 'page_pdf'
+ return PdfPage::new(inpath)
+ else
+ return nil
+ end
+ end
+
def initialize(infile)
@infile = infile
super()
diff --git a/lib/page_pdf.rb b/lib/page_pdf.rb
new file mode 100644
index 0000000..e70c887
--- /dev/null
+++ b/lib/page_pdf.rb
@@ -0,0 +1,62 @@
+# coding: utf-8
+require 'erb'
+require 'open3'
+require 'yaml'
+
+require 'page_local'
+
+class PdfPage < LocalPage
+ def initialize(filename)
+ super(filename)
+ end
+
+ def pdf_metadata
+ if @metadata.nil?
+ stdout, stderr, status = Open3::capture3("pdfinfo", "--", local_infile)
+ unless stderr.empty?
+ raise stderr
+ end
+ unless status.success?
+ raise status
+ end
+ raw_metadata = stdout.split("\n").map{|l|l.split(":", 2).map{|c|c.strip}}.to_h
+
+ # Transform the PDF property names to match our metadata names
+ key_map = {
+ "Title" => "title",
+ "Author" => "author",
+ "CreationDate" => "published",
+ "ModDate" => "updated",
+ # "Keywords" => "categories",
+ }
+ @metadata = raw_metadata.map{|k,v|[key_map[k]||k,v]}.to_h
+
+ yamlfile = local_infile.sub(/\.pdf$/, '.yaml')
+ if File::exist?(yamlfile)
+ @metadata = @metadata.merge(YAML::load(File::read(yamlfile)))
+ end
+ end
+ @metadata
+ end
+ def pdf_js_url
+ @@pdjfs ||= Config::get.url + 'pdfjs/web/viewer.html'
+ end
+ def pdf_viewer_url
+ @viewer_url ||= pdf_js_url + ('?file=' + URI::encode_www_form_component(pdf_js_url.route_to(local_srcurl)))
+ end
+
+ def local_intype
+ return 'markdown'
+ end
+ def local_depends
+ if @depends.nil?
+ yamlfile = local_infile.sub(/\.pdf$/, '.yaml')
+ metafile = File::exist?(yamlfile) ? yamlfile : File::dirname(yamlfile)
+ tmplfile = "tmpl/pdf.md.erb"
+ @depends = super.map{|k,v|[k,v.merge([metafile, tmplfile])]}.to_h
+ end
+ @depends
+ end
+end
+
+ERB::new(File::read("tmpl/pdf.md.erb")).def_method(PdfPage, 'local_input()', "tmpl/pdf.md.erb")
diff --git a/lib/sitegen.rb b/lib/sitegen.rb
index 78222a3..4a3dd48 100644
--- a/lib/sitegen.rb
+++ b/lib/sitegen.rb
@@ -40,7 +40,7 @@ module Sitegen
end
@deps
end
- def self.Makefile()
+ def self.Makefile
str = ''
dependencies.each do |target, deps|
str += "#{target.to_s}: #{deps.sort.join(' ')}\n"