Files
side-by-side/source/documents/scripts/services/reader/markdown.js.coffee
T
Vit Brunner 46b3033e2a Fix markdown metadata reading
Was breaking on trailing whitespace, which is markdown for <br> and
something people could commonly put after metadata, as it makes things
more readable when processed by regular markdown.
2013-06-17 23:02:22 +01:00

63 lines
1.5 KiB
CoffeeScript

angular.module("sideBySide").factory("markdownReader", () ->
# Read markdown poem
#
# For sample input, see:
# source/documents/tests/services/reader/markdown.js.coffee
#
# @param source [String] Markdown poem
# @return [Object] Poem object
return (source) ->
# Read meta information from markdown block
#
# @param block [string] Meta block
# @param inlineLexer [Object] Inline markdown lexer
# @return [Object] Meta properties
readMeta = (text, inlineLexer) ->
meta = {}
for line in text.split("\n")
lexed = inlineLexer.output(line)
match = /([^:]*):(.*)/.exec(lexed)
meta[match[1].trim()] = match[2].trim()
return meta
# Read and remove one section from start of lexed blocks
#
# @param lexed [Array] Lexed blocks
# @return [Array] Section
readSection = (lexed) ->
items = []
while lexed.length > 0
break if lexed[0]["type"] == "heading"
items.push(lexed.shift())
return items
# Read content from lexed blocks
#
# @param lexed [Array] Lexed blocks
# @return [Array] Content
readContent = (lexed) ->
content = []
while lexed.length > 0
heading = if lexed[0]["type"] == "heading" \
then lexed.shift().text \
else heading = ''
text = readSection(lexed)
text.links = lexed.links
content.push({
section: heading
text: marked.parser(text)
})
return content
lexed = marked.lexer(source)
meta = lexed.shift()
meta = readMeta(meta.text, new marked.InlineLexer(lexed.links))
return {
meta: meta
content: readContent(lexed)
}
)