metadata works
This commit is contained in:
parent
e059e0dd41
commit
d0ba98f2e8
Binary file not shown.
110
generate.coffee
110
generate.coffee
@ -189,46 +189,23 @@ class Node
|
|||||||
if @style.marginLeft
|
if @style.marginLeft
|
||||||
doc.x -= @style.marginLeft
|
doc.x -= @style.marginLeft
|
||||||
|
|
||||||
|
addPageNum = (doc, name) ->
|
||||||
|
range = doc.bufferedPageRange() # => { start: 0, count: 2 }
|
||||||
|
|
||||||
|
# todo: make more generic "draw text" function that sets the document properities based on provided styles
|
||||||
|
doc.font styles.default.font
|
||||||
|
for i in [range.start...range.start + range.count]
|
||||||
|
doc.switchToPage(i)
|
||||||
|
doc.y = 72/2
|
||||||
|
doc.x = 72
|
||||||
|
doc.text "#{name} #{i + 1}", _.extend({}, styles.default, {align: 'right'})
|
||||||
|
|
||||||
# reads and renders a markdown/literate coffeescript file to the document
|
# reads and renders a markdown/literate coffeescript file to the document
|
||||||
render = (doc, filename) ->
|
render = (doc, tree) ->
|
||||||
doc.font 'Times-Roman'
|
doc.font 'Times-Roman'
|
||||||
doc.fontSize 12
|
doc.fontSize 12
|
||||||
|
|
||||||
codeBlocks = []
|
codeBlocks = []
|
||||||
content = fs.readFileSync(filename, 'utf8')
|
|
||||||
|
|
||||||
body = ""
|
|
||||||
|
|
||||||
metadata_pattern = /// ^
|
|
||||||
([\w.-]+) # key
|
|
||||||
\:\ # colon
|
|
||||||
\s* # optional whitespace
|
|
||||||
(.+) # value
|
|
||||||
$///
|
|
||||||
|
|
||||||
metadata = {}
|
|
||||||
|
|
||||||
for line in content.split("\n")
|
|
||||||
if meta = line.match(metadata_pattern)
|
|
||||||
key = meta[1]
|
|
||||||
value = meta[2]
|
|
||||||
metadata[key] = value
|
|
||||||
else
|
|
||||||
body += line + "\n"
|
|
||||||
|
|
||||||
metadata.lastName ||= metadata.author?.split(" ").last()
|
|
||||||
# console.log metadata
|
|
||||||
|
|
||||||
# add header
|
|
||||||
doc.text(metadata.author, _.extend({}, styles.default, styles.meta))
|
|
||||||
doc.text(metadata.instructor, _.extend({}, styles.default, styles.meta))
|
|
||||||
doc.text(metadata.course, _.extend({}, styles.default, styles.meta))
|
|
||||||
doc.text(metadata.date, _.extend({}, styles.default, styles.meta))
|
|
||||||
doc.text(metadata.title, _.extend({}, styles.default, styles.title))
|
|
||||||
|
|
||||||
tree = md.parse body
|
|
||||||
console.log tree
|
|
||||||
tree.shift() # ignore 'markdown' first element
|
|
||||||
|
|
||||||
onWorksCited = false
|
onWorksCited = false
|
||||||
while tree.length
|
while tree.length
|
||||||
@ -243,18 +220,6 @@ render = (doc, filename) ->
|
|||||||
|
|
||||||
node.render(doc)
|
node.render(doc)
|
||||||
|
|
||||||
# add page numbers
|
|
||||||
range = doc.bufferedPageRange() # => { start: 0, count: 2 }
|
|
||||||
|
|
||||||
# todo: make more generic "draw text" function that sets the document properities based on provided styles
|
|
||||||
doc.font styles.default.font
|
|
||||||
for i in [range.start...range.start + range.count]
|
|
||||||
doc.switchToPage(i)
|
|
||||||
doc.y = 72/2
|
|
||||||
doc.x = 72
|
|
||||||
doc.text "#{metadata.lastName} #{i + 1}", _.extend({}, styles.default, {align: 'right'})
|
|
||||||
|
|
||||||
doc.flushPages()
|
|
||||||
doc
|
doc
|
||||||
|
|
||||||
# renders the title page of the guide
|
# renders the title page of the guide
|
||||||
@ -281,11 +246,58 @@ render = (doc, filename) ->
|
|||||||
|
|
||||||
# doc.addPage()
|
# doc.addPage()
|
||||||
|
|
||||||
|
extractMetadata = (text) ->
|
||||||
|
body = ""
|
||||||
|
metadata = {}
|
||||||
|
|
||||||
|
metadata_pattern = /// ^
|
||||||
|
([\w.-]+) # key
|
||||||
|
\:\ # colon
|
||||||
|
\s* # optional whitespace
|
||||||
|
(.+) # value
|
||||||
|
$///
|
||||||
|
|
||||||
|
for line in text.split("\n")
|
||||||
|
if meta = line.match(metadata_pattern)
|
||||||
|
key = meta[1]
|
||||||
|
value = meta[2]
|
||||||
|
metadata[key] = value
|
||||||
|
else
|
||||||
|
body += line + "\n"
|
||||||
|
|
||||||
|
{metadata: metadata, body: body}
|
||||||
|
|
||||||
do ->
|
do ->
|
||||||
|
filename = "paper.md"
|
||||||
|
content = fs.readFileSync(filename, 'utf8')
|
||||||
|
content = extractMetadata(content)
|
||||||
|
body = content.body
|
||||||
|
metadata = content.metadata
|
||||||
|
|
||||||
|
tree = md.parse body
|
||||||
|
tree.shift() # ignore 'markdown' first element
|
||||||
|
|
||||||
|
metadata.lastName ||= metadata.author?.split(" ").last()
|
||||||
|
|
||||||
doc = new PDFDocument
|
doc = new PDFDocument
|
||||||
bufferPages: true
|
bufferPages: true
|
||||||
|
|
||||||
doc.pipe fs.createWriteStream('guide.pdf')
|
doc.info.Title = metadata.title
|
||||||
render doc, 'test.coffee.md'
|
doc.info.Author = metadata.author
|
||||||
|
doc.info.Creator = "markdowntomla by christian.gen.co"
|
||||||
|
|
||||||
|
# add header
|
||||||
|
doc.font 'Times-Roman'
|
||||||
|
doc.fontSize 12
|
||||||
|
doc.text(metadata.author, _.extend({}, styles.default, styles.meta))
|
||||||
|
doc.text(metadata.instructor, _.extend({}, styles.default, styles.meta))
|
||||||
|
doc.text(metadata.course, _.extend({}, styles.default, styles.meta))
|
||||||
|
doc.text(metadata.date, _.extend({}, styles.default, styles.meta))
|
||||||
|
doc.text(metadata.title, _.extend({}, styles.default, styles.title))
|
||||||
|
|
||||||
|
doc.pipe fs.createWriteStream("#{metadata.title} by #{metadata.author}.pdf")
|
||||||
|
render doc, tree
|
||||||
|
addPageNum(doc, metadata.lastName)
|
||||||
|
doc.flushPages()
|
||||||
|
|
||||||
doc.end()
|
doc.end()
|
||||||
|
Loading…
Reference in New Issue
Block a user