Browse Source

Add support for nested Admonitions, Refactor create-pluto-nb function

pull/214/head
Sogari 3 years ago committed by Simon Christ
parent
commit
8e20d6e802
  1. 103
      src/Literate.jl

103
src/Literate.jl

@ -862,8 +862,7 @@ function chunkToMD(chunk)
write(buffer, line.first * line.second, '\n') write(buffer, line.first * line.second, '\n')
end end
seek(buffer, 0) seek(buffer, 0)
str = Markdown.parse(read(buffer, String)) return Markdown.parse(read(buffer, String))
return str
end end
function formatAnswer(answer) function formatAnswer(answer)
@ -907,10 +906,10 @@ end
function processNonAdmonitions(item, io) function processNonAdmonitions(item, io)
# Handle non-admonition elements # Handle non-admonition elements
write(io, string(Markdown.MD(item)), '\n') return string(Markdown.MD(item))
end end
function processSingleChoice(admonition, depth, io, helperList) function processSingleChoice(admonition, io, helperList, helperTestList)
# Handle single-choice processing # Handle single-choice processing
questionName = replace("$(admonition.title)" * "$(replace(string(gensym()), "#" => ""))", r"[^\d\w]+" => "") questionName = replace("$(admonition.title)" * "$(replace(string(gensym()), "#" => ""))", r"[^\d\w]+" => "")
answers = [] answers = []
@ -940,20 +939,19 @@ function processSingleChoice(admonition, depth, io, helperList)
push!(restList, answerList[begin:end-1]) push!(restList, answerList[begin:end-1])
end end
# Pluto nb helper functions
#####################################################
radioBind = writeRadioBind(questionName, answers) radioBind = writeRadioBind(questionName, answers)
logicBind = writeSingleLogic(questionName, questionDict) logicBind = writeSingleLogic(questionName, questionDict)
result = writeControlFlow(questionName, restList)
write(io, result, '\n')
# Pluto nb helper functions
####################################################
push!(helperList, radioBind) push!(helperList, radioBind)
push!(helperList, logicBind) push!(helperList, logicBind)
return writeControlFlow(questionName, restList)
end end
function processMultipleChoice(admonition, depth, io, helperList) function processMultipleChoice(admonition, io, helperList)
# Handle multiple-choice processing # Handle multiple-choice processing
questionName = replace("$(admonition.title)" * "$(replace(string(gensym()), "#" => ""))", r"[^\d\w]+" => "") questionName = replace("$(admonition.title)" * "$(replace(string(gensym()), "#" => ""))", r"[^\d\w]+" => "")
answers = [] answers = []
@ -981,20 +979,19 @@ function processMultipleChoice(admonition, depth, io, helperList)
push!(restList, answerList[begin:end-1]) push!(restList, answerList[begin:end-1])
end end
radioBind = writeMultiBind(questionName, answers)
logicBind = writeMultiLogic(questionName, questionDict)
result = writeControlFlow(questionName, restList)
write(io, result, '\n')
# Pluto nb helper functions # Pluto nb helper functions
#################################################### ####################################################
radioBind = writeMultiBind(questionName, answers)
logicBind = writeMultiLogic(questionName, questionDict)
push!(helperList, radioBind) push!(helperList, radioBind)
push!(helperList, logicBind) push!(helperList, logicBind)
return writeControlFlow(questionName, restList)
end end
function processFreecode(admonition, depth, io, helperList, helperTestList) function processFreecode(admonition, io, helperList, helperTestList)
# Handle freecode processing # Handle freecode processing
questionName = replace("$(admonition.title)" * "$(replace(string(gensym()), "#" => ""))", r"[^\d\w]+" => "") questionName = replace("$(admonition.title)" * "$(replace(string(gensym()), "#" => ""))", r"[^\d\w]+" => "")
tests = [] tests = []
@ -1014,44 +1011,55 @@ function processFreecode(admonition, depth, io, helperList, helperTestList)
push!(restList, testList[begin:end-1]) push!(restList, testList[begin:end-1])
end end
radioBind = writeFreeBind(questionName, tests)
logicBind = writeFreeLogic(questionName, tests)
result = writeControlFlow(questionName, restList)
write(io, result, '\n')
# Pluto nb helper functions # Pluto nb helper functions
#################################################### ####################################################
radioBind = writeFreeBind(questionName, tests)
logicBind = writeFreeLogic(questionName, tests)
push!(helperTestList, radioBind) push!(helperTestList, radioBind)
push!(helperList, logicBind) push!(helperList, logicBind)
return writeControlFlow(questionName, restList)
end end
function processNormalAdmonition(admonition, depth, io) function processNormalAdmonition(admonition, io, helperList, helperTestList)
write(io, string(Markdown.MD(admonition)), '\n') newContentList = []
for element in admonition.content
if isa(element, Markdown.Admonition)
processedElement = processAdmonition(element, io, helperList, helperTestList)
push!(newContentList, Markdown.Paragraph([processedElement]))
else
push!(newContentList, element)
end
end
updatedAdmonition = Markdown.Admonition(admonition.category, admonition.title, newContentList)
return string(Markdown.MD(updatedAdmonition))
end end
function processAdmonition(admonition, depth, io, helperList, helperTestList) function processAdmonition(admonition, io, helperList, helperTestList)
category = admonition.category category = admonition.category
if category == "sc" if category == "sc"
processSingleChoice(admonition, depth, io, helperList) return processSingleChoice(admonition, io, helperList, helperTestList)
elseif category == "mc" elseif category == "mc"
processMultipleChoice(admonition, depth, io, helperList) return processMultipleChoice(admonition, io, helperList)
elseif category == "freecode" elseif category == "freecode"
processFreecode(admonition, depth, io, helperList, helperTestList) return processFreecode(admonition, io, helperList, helperTestList)
else else
processNormalAdmonition(admonition, depth, io) return processNormalAdmonition(admonition, io, helperList, helperTestList)
end end
end end
function processContent(mdContent, io) function writeContent(mdContent, io, helperList, helperTestList)
for item in mdContent for item in mdContent
if isa(item, Markdown.Admonition) if isa(item, Markdown.Admonition)
processAdmonition(item, 0, io) result = processAdmonition(item, io, helperList, helperTestList)
else else
processNonAdmonitions(item, io) result = processNonAdmonitions(item, io)
end end
write(io, result, '\n')
end end
end end
@ -1094,29 +1102,16 @@ function create_notebook(flavor::PlutoFlavor, chunks, config)
line = escape_string(chunk.lines[1].second, '"') line = escape_string(chunk.lines[1].second, '"')
write(io, "$(flavor.use_cm ? "cm" : "md")\"", line, "\"\n") write(io, "$(flavor.use_cm ? "cm" : "md")\"", line, "\"\n")
elseif containsAdmonition(chunk) elseif containsAdmonition(chunk)
write(io, "$(flavor.use_cm ? "cm" : "md")\"\"\"\n")
str = chunkToMD(chunk)
helperList = [] helperList = []
helperTestList = [] helperTestList = []
str = chunkToMD(chunk)
mdContent = str.content mdContent = str.content
for item in mdContent
if !isa(item, Markdown.Admonition)
write(io, string(Markdown.MD(item)), '\n')
elseif isa(item, Markdown.Admonition)
# The Admonition
########################################################
admonition = item
questionCategory = admonition.category
processAdmonition(admonition, 0, io, helperList, helperTestList)
end
end
write(io, "$(flavor.use_cm ? "cm" : "md")\"\"\"\n")
writeContent(mdContent, io, helperList, helperTestList)
write(io, "\"\"\"\n") write(io, "\"\"\"\n")
cellCounter = formatCells(io, ionb, cellCounter, uuids, folds, fold) cellCounter = formatCells(io, ionb, cellCounter, uuids, folds, fold)
for item in helperTestList for item in helperTestList
@ -1128,11 +1123,8 @@ function create_notebook(flavor::PlutoFlavor, chunks, config)
write(io, item, '\n') write(io, item, '\n')
cellCounter = formatCellsEnd(io, ionb, cellCounter, singleChoiceContent, singleChoiceUuids, singleChoiceFolds, fold) cellCounter = formatCellsEnd(io, ionb, cellCounter, singleChoiceContent, singleChoiceUuids, singleChoiceFolds, fold)
end end
else else
################################################################ # Handle chunks without admonitions
# Chunk doesnt contain an Admonition
################################################################
write(io, "$(flavor.use_cm ? "cm" : "md")\"\"\"\n") write(io, "$(flavor.use_cm ? "cm" : "md")\"\"\"\n")
for line in chunk.lines for line in chunk.lines
@ -1148,6 +1140,7 @@ function create_notebook(flavor::PlutoFlavor, chunks, config)
end end
seek(io, 0) seek(io, 0)
content = read(io, String) content = read(io, String)
# Compute number of expressions in the code block and perhaps wrap in begin/end # Compute number of expressions in the code block and perhaps wrap in begin/end
nexprs, idx = 0, 1 nexprs, idx = 0, 1
ex = nothing ex = nothing

Loading…
Cancel
Save