Browse Source

Refactor create Pluto-nb function, Prepare nested admonitions

pull/214/head
Sogari 3 years ago committed by Simon Christ
parent
commit
7b54b311f8
  1. 173
      src/Literate.jl

173
src/Literate.jl

@ -909,70 +909,14 @@ function formatCellsEnd(io, ionb, cellCounter, singleChoiceContent, singleChoice @@ -909,70 +909,14 @@ function formatCellsEnd(io, ionb, cellCounter, singleChoiceContent, singleChoice
return cellCounter
end
function create_notebook(flavor::PlutoFlavor, chunks, config)
ionb = IOBuffer()
# Print header
write(ionb, """
### A Pluto.jl notebook ###
# v0.16.0
# ╔═╡ a0000000-0000-0000-0000-000000000000
using $(flavor.use_cm ? "CommonMark, PlutoUI, Test" : "Markdown")
""")
# Print cells
uuids = Base.UUID[]
singleChoiceUuids = Base.UUID[]
singleChoiceFolds = Bool[]
singleChoiceContent = String[]
folds = Bool[]
default_fold = Dict{String,Bool}("markdown"=>true, "code"=>false) # toggleable ???
cellCounter = 1
for chunk in chunks
io = IOBuffer()
# Jupyter style metadata # TODO: factor out, identical to jupyter notebook
chunktype = isa(chunk, MDChunk) ? "markdown" : "code"
fold = default_fold[chunktype]
if !isempty(chunk.lines) && line_is_nbmeta(chunk.lines[1])
@show chunk.lines
metatype, metadata = parse_nbmeta(chunk.lines[1])
metatype !== nothing && metatype != chunktype && error("specifying a different cell type is not supported")
popfirst!(chunk.lines)
fold = get(metadata, "fold", fold)
end
if isa(chunk, MDChunk)
if length(chunk.lines) == 1
line = escape_string(chunk.lines[1].second, '"')
write(io, "$(flavor.use_cm ? "cm" : "md")\"", line, "\"\n")
elseif containsAdmonition(chunk)
write(io, "$(flavor.use_cm ? "cm" : "md")\"\"\"\n")
str = chunkToMD(chunk)
helperList = []
helperTestList = []
# Content before the Admonition
################################################################
mdContent = str.content
for item in mdContent
if !isa(item, Markdown.Admonition)
function processNonAdmonitions(item, io)
# Handle non-admonition elements
write(io, string(Markdown.MD(item)), '\n')
elseif isa(item, Markdown.Admonition)
# The Admonition
########################################################
end
admonition = item
function processSingleChoice(admonition, depth, io, helperList)
# Handle single-choice processing
questionName = replace("$(admonition.title)" * "$(replace(string(gensym()), "#" => ""))", r"[^\d\w]+" => "")
questionCategory = admonition.category
if questionCategory == "sc"
####################################################
# Single-Choice Admonition
####################################################
answers = []
questionDict = Dict("correct" => "")
@ -1011,12 +955,11 @@ function create_notebook(flavor::PlutoFlavor, chunks, config) @@ -1011,12 +955,11 @@ function create_notebook(flavor::PlutoFlavor, chunks, config)
push!(helperList, radioBind)
push!(helperList, logicBind)
end
elseif questionCategory == "mc"
####################################################
# Multiple-Choice Admonition
####################################################
function processMultipleChoice(admonition, depth, io, helperList)
# Handle multiple-choice processing
questionName = replace("$(admonition.title)" * "$(replace(string(gensym()), "#" => ""))", r"[^\d\w]+" => "")
answers = []
questionDict = Dict("correct" => String[])
@ -1053,12 +996,11 @@ function create_notebook(flavor::PlutoFlavor, chunks, config) @@ -1053,12 +996,11 @@ function create_notebook(flavor::PlutoFlavor, chunks, config)
push!(helperList, radioBind)
push!(helperList, logicBind)
end
elseif questionCategory == "freecode"
####################################################
# Freecode Admonition
####################################################
function processFreecode(admonition, depth, io, helperList, helperTestList)
# Handle freecode processing
questionName = replace("$(admonition.title)" * "$(replace(string(gensym()), "#" => ""))", r"[^\d\w]+" => "")
tests = []
testList = filter(x -> isa(x, Markdown.List), admonition.content)
@ -1087,14 +1029,94 @@ function create_notebook(flavor::PlutoFlavor, chunks, config) @@ -1087,14 +1029,94 @@ function create_notebook(flavor::PlutoFlavor, chunks, config)
push!(helperTestList, radioBind)
push!(helperList, logicBind)
end
function processNormalAdmonition(admonition, depth, io)
write(io, string(Markdown.MD(admonition)), '\n')
end
function processAdmonition(admonition, depth, io, helperList, helperTestList)
category = admonition.category
if category == "sc"
processSingleChoice(admonition, depth, io, helperList)
elseif category == "mc"
processMultipleChoice(admonition, depth, io, helperList)
elseif category == "freecode"
processFreecode(admonition, depth, io, helperList, helperTestList)
else
####################################################
# Normal Admonitions
####################################################
processNormalAdmonition(admonition, depth, io)
end
end
write(io, string(Markdown.MD(item)), '\n')
function processContent(mdContent, io)
for item in mdContent
if isa(item, Markdown.Admonition)
processAdmonition(item, 0, io)
else
processNonAdmonitions(item, io)
end
end
end
function create_notebook(flavor::PlutoFlavor, chunks, config)
ionb = IOBuffer()
# Print header
write(ionb, """
### A Pluto.jl notebook ###
# v0.16.0
# ╔═╡ a0000000-0000-0000-0000-000000000000
using $(flavor.use_cm ? "CommonMark, PlutoUI, Test" : "Markdown")
""")
# Print cells
uuids = Base.UUID[]
singleChoiceUuids = Base.UUID[]
singleChoiceFolds = Bool[]
singleChoiceContent = String[]
folds = Bool[]
default_fold = Dict{String,Bool}("markdown"=>true, "code"=>false) # toggleable ???
cellCounter = 1
for chunk in chunks
io = IOBuffer()
# Jupyter style metadata # TODO: factor out, identical to jupyter notebook
chunktype = isa(chunk, MDChunk) ? "markdown" : "code"
fold = default_fold[chunktype]
if !isempty(chunk.lines) && line_is_nbmeta(chunk.lines[1])
@show chunk.lines
metatype, metadata = parse_nbmeta(chunk.lines[1])
metatype !== nothing && metatype != chunktype && error("specifying a different cell type is not supported")
popfirst!(chunk.lines)
fold = get(metadata, "fold", fold)
end
if isa(chunk, MDChunk)
if length(chunk.lines) == 1
line = escape_string(chunk.lines[1].second, '"')
write(io, "$(flavor.use_cm ? "cm" : "md")\"", line, "\"\n")
elseif containsAdmonition(chunk)
write(io, "$(flavor.use_cm ? "cm" : "md")\"\"\"\n")
str = chunkToMD(chunk)
helperList = []
helperTestList = []
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
@ -1132,6 +1154,7 @@ function create_notebook(flavor::PlutoFlavor, chunks, config) @@ -1132,6 +1154,7 @@ function create_notebook(flavor::PlutoFlavor, chunks, config)
content = read(io, String)
# Compute number of expressions in the code block and perhaps wrap in begin/end
nexprs, idx = 0, 1
ex = nothing
while true
ex, idx = Meta.parse(content, idx)
ex === nothing && break

Loading…
Cancel
Save