Files
textmate/bin/gen_html
Allan Odgaard aeec0874b3 Fix warning about invalid ERB trim mode
We don’t care about the trim mode as nobody is reading the generated HTML, but we have to supply something, previously we enabled everything, which is now giving an error despite the documentation saying that trim mode can be “one or more of the following modifiers”:

	%  enables Ruby code processing for lines beginning with %
	<> omit newline for lines starting with <% and ending in %>
	>  omit newline for lines ending in %>
	-  omit blank lines ending in -%>

It would seem that ‘<>’ is mutually exclusive with ‘-’ so now we pass ‘%-’ for trim mode.
2019-12-26 23:20:48 +07:00

116 lines
3.1 KiB
Ruby
Executable File

#!/System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/ruby
# == Synopsis
#
# gen_html: generates HTML file from markdown and optional template(s)
#
# == Usage
#
# gen_html [OPTION] ... [FILE]
#
# --help:
# show help
#
# -t/--title «title»
# make «title» available to template (as `page_name`)
#
# -h/--header «file»
# prepend «file» as header (erb)
#
# -f/--footer «file»
# append «file» as footer (erb)
#
# FILE: The markdown document to read (defaults to stdin)
$KCODE = 'U' if RUBY_VERSION < "1.9"
require 'optparse'
require 'erb'
def expand_tpl(str, binding)
ERB.new(str, 0, '%-').result(binding)
end
def expand_tpl_file(path, binding)
expand_tpl(File.read(path), binding)
end
def find_exe(cmd)
dir = ENV['PATH'].split(':').find { |dir| File.executable? File.join(dir, cmd) }
dir ? "#{dir}/#{cmd}" : nil
end
def wrap_key_equivalents(src)
src.gsub(/ `([^`]+⇥)` | \( ([⌃⌥⇧⌘↓↑←→]+) \) | ( [⎋⇥↩⌅⌫⌦] | [⌃⌥⇧⌘]+ ( (?=[ ]|-\w+) | F\d+ | . ) ) /x) do
if $1
"<kbd class='tabTrigger'>#$1</kbd>"
elsif $2
"(<kbd class='keyEquivalent'>#$2</kbd>)"
else
"<kbd class='keyEquivalent'>#$&</kbd>"
end
end
end
def wrap_authors(src)
src.gsub(/ \*\[ (.+?) \]\* /x) do
"<span class='credit'>#$1</span>"
end
end
def wrap_in_article(html)
html.gsub(/<h2\b.*>.*<\/h2>(?m:.*?)(?=\s*<h2|\z)/) do
"<article>\n#$&\n</article>\n"
end
end
title, header, footer, warn = 'untitled', nil, nil, false
OptionParser.new do |opts|
opts.banner = "Usage: gen_html [options] [file]"
opts.separator "Synopsis:"
opts.separator "gen_html: generates HTML file from markdown and optional template(s)"
opts.separator "Options:"
opts.on("-?", "--help", "show help.") do |v|
puts opts
exit
end
opts.on("-h","--header FILE", "prepend «file» as header (erb)") do |arg|
header = arg
end
opts.on("-f","--footer FILE", "append «file» as footer (erb)") do |arg|
footer = arg
end
opts.on("-t","--title TITLE", "make «title» available to template (as `page_name`)") do |arg|
title = arg
end
opts.on("-w","--warn", "enable warnings") do |arg|
warn = true
end
end.parse!
MARKDOWN_COMPILERS = %w[ multimarkdown ]
filter = MARKDOWN_COMPILERS.find { |exe| find_exe exe }
abort "Unable to find a markdown compiler" if filter.nil?
filters = "|#{filter} --nosmart"
document = ARGF.read
document = wrap_authors(wrap_key_equivalents(document))
head, body = document.scan(/\A((?:^\w+:\s+.*$\n)*)\n?((?m:.*))\z/).flatten
tmp = head.scan(/^(\w+):\s+(.*)$/).collect { |pair| [pair[0].downcase, pair[1].strip] }
headers = Hash[*tmp.flatten]
page_title = headers['title'] || title
css_files = headers['css'].to_s.split(/,\s*/)
js_files = headers['js'].to_s.split(/,\s*/)
meta_data = Hash[*headers['meta'].to_s.scan(/(.*?)="(.*?)"(?:,\s*)?/).flatten]
STDOUT << expand_tpl_file(header, binding) unless header.nil?
STDOUT << open(filters, 'r+') { |io| io << body; io.close_write; wrap_in_article(expand_tpl(io.read, binding)) }
STDOUT << expand_tpl_file(footer, binding) unless footer.nil?