Skip to content

Commit

Permalink
Merge pull request #2475 from laborg/simplifysettings
Browse files Browse the repository at this point in the history
  • Loading branch information
mortenpi authored Mar 8, 2024
2 parents 8395fe5 + fc3a175 commit c0e2223
Showing 1 changed file with 43 additions and 65 deletions.
108 changes: 43 additions & 65 deletions src/html/HTMLWriter.jl
Original file line number Diff line number Diff line change
Expand Up @@ -664,17 +664,15 @@ struct DCtx
navnode :: Documenter.NavNode
# The following fields were keyword arguments to mdconvert()
droplinks :: Bool
settings :: Union{HTML, Nothing}
footnotes :: Union{Vector{Node{Nothing}},Nothing}

DCtx(ctx, navnode, droplinks=false) = new(ctx, navnode, droplinks, ctx.settings, [])
DCtx(ctx, navnode, droplinks=false) = new(ctx, navnode, droplinks, [])
DCtx(
dctx::DCtx;
navnode = dctx.navnode,
droplinks = dctx.droplinks,
settings = dctx.settings,
footnotes = dctx.footnotes,
) = new(dctx.ctx, navnode, droplinks, settings, footnotes)
) = new(dctx.ctx, navnode, droplinks, footnotes)
end

function SearchRecord(ctx::HTMLContext, navnode; fragment="", title=nothing, category="page", text="")
Expand Down Expand Up @@ -723,7 +721,6 @@ Returns a page (as a [`Documenter.Page`](@ref) object) using the [`HTMLContext`]
"""
getpage(ctx::HTMLContext, path) = ctx.doc.blueprint.pages[path]
getpage(ctx::HTMLContext, navnode::Documenter.NavNode) = getpage(ctx, navnode.page)
getpage(dctx::DCtx) = getpage(dctx.ctx, dctx.navnode)

function render(doc::Documenter.Document, settings::HTML=HTML())
@info "HTMLWriter: rendering HTML pages."
Expand Down Expand Up @@ -884,7 +881,7 @@ function render_page(ctx, navnode)
div[Symbol("data-docstringscollapsed") => "true"]()
)
end
htmldoc = render_html(ctx, navnode, head, sidebar, navbar, article, footer, meta_divs)
htmldoc = render_html(ctx, head, sidebar, navbar, article, footer, meta_divs)
write_html(ctx, navnode, htmldoc)
end

Expand All @@ -894,7 +891,7 @@ end
"""
Renders the main `<html>` tag.
"""
function render_html(ctx, navnode, head, sidebar, navbar, article, footer, scripts::Vector{DOM.Node}=DOM.Node[])
function render_html(ctx, head, sidebar, navbar, article, footer, scripts::Vector{DOM.Node}=DOM.Node[])
@tags html body div
DOM.HTMLDocument(
html[:lang=>ctx.settings.lang](
Expand All @@ -903,7 +900,7 @@ function render_html(ctx, navnode, head, sidebar, navbar, article, footer, scrip
div["#documenter"](
sidebar,
div[".docs-main"](navbar, article, footer),
render_settings(ctx),
render_settings(),
),
),
scripts...
Expand All @@ -914,7 +911,7 @@ end
"""
Renders the modal settings dialog.
"""
function render_settings(ctx)
function render_settings()
@tags div header section footer p button hr span select option label a

theme_selector = p(
Expand Down Expand Up @@ -1442,7 +1439,6 @@ end

function render_article(ctx, navnode)
dctx = DCtx(ctx, navnode)
# function render_article(ctx, navnode)
@tags article section ul li hr span a div p

# Build the page itself (and collect any footnotes)
Expand Down Expand Up @@ -1638,7 +1634,7 @@ end
## domify(...)
# ------------

function domify(dctx::DCtx, node::Node, element::MarkdownAST.AbstractElement)
function domify(::DCtx, ::Node, element::MarkdownAST.AbstractElement)
error("Unimplemented element: $(typeof(element))")
end

Expand All @@ -1660,9 +1656,7 @@ domify(dctx::DCtx, node::Node, ::MarkdownAST.Document) = domify(dctx, node.child

function domify(dctx::DCtx, node::Node, ah::Documenter.AnchoredHeader)
@assert length(node.children) == 1 && isa(first(node.children).element, MarkdownAST.Heading)
ctx, navnode = dctx.ctx, dctx.navnode
anchor = ah.anchor
# function domify(ctx, navnode, anchor::Anchor)
@tags a
frag = Documenter.anchor_fragment(anchor)
legacy = anchor.nth == 1 ? (a[:id => lstrip(frag, '#')*"-1"],) : ()
Expand Down Expand Up @@ -1697,18 +1691,17 @@ function domify(lb::ListBuilder)
ul(map(e -> isa(e, ListBuilder) ? li[".no-marker"](domify(e)) : li(e), lb.es))
end

function domify(dctx::DCtx, node::Node, contents::Documenter.ContentsNode)
function domify(dctx::DCtx, ::Node, contentsnode::Documenter.ContentsNode)
ctx, navnode = dctx.ctx, dctx.navnode
# function domify(ctx, navnode, contents::Documenter.ContentsNode)
@tags a
navnode_dir = dirname(navnode.page)
navnode_url = get_url(ctx, navnode)
lb = ListBuilder()
for (count, path, anchor) in contents.elements
for (count, path, anchor) in contentsnode.elements
header = first(anchor.node.children)
level = header.element.level
# Skip header levels smaller than the requested mindepth
level = level - contents.mindepth + 1
level = level - contentsnode.mindepth + 1
level < 1 && continue
path = joinpath(navnode_dir, path) # links in ContentsNodes are relative to current page
path = pretty_url(ctx, relhref(navnode_url, get_url(ctx, path)))
Expand All @@ -1719,13 +1712,12 @@ function domify(dctx::DCtx, node::Node, contents::Documenter.ContentsNode)
domify(lb)
end

function domify(dctx::DCtx, node::Node, index::Documenter.IndexNode)
function domify(dctx::DCtx, ::Node, indexnode::Documenter.IndexNode)
ctx, navnode = dctx.ctx, dctx.navnode
# function domify(ctx, navnode, index::Documenter.IndexNode)
@tags a code li ul
navnode_dir = dirname(navnode.page)
navnode_url = get_url(ctx, navnode)
lis = map(index.elements) do el
lis = map(indexnode.elements) do el
object, doc, path, mod, cat = el
path = joinpath(navnode_dir, path) # links in IndexNodes are relative to current page
path = pretty_url(ctx, relhref(navnode_url, get_url(ctx, path)))
Expand All @@ -1737,34 +1729,32 @@ end

domify(dctx::DCtx, node::Node, ::Documenter.DocsNodesBlock) = domify(dctx, node.children)

function domify(dctx::DCtx, mdast_node::Node, node::Documenter.DocsNode)
function domify(dctx::DCtx, mdast_node::Node, docsnode::Documenter.DocsNode)
ctx, navnode = dctx.ctx, dctx.navnode
# function domify(ctx, navnode, node::Documenter.DocsNode)
@tags a code article header span

# push to search index
rec = SearchRecord(ctx, navnode;
fragment=Documenter.anchor_fragment(node.anchor),
title=string(node.object.binding),
category=Documenter.doccat(node.object),
fragment=Documenter.anchor_fragment(docsnode.anchor),
title=string(docsnode.object.binding),
category=Documenter.doccat(docsnode.object),
text = mdflatten(mdast_node))
push!(ctx.search_index, rec)

article[".docstring"](
header(
a[".docstring-article-toggle-button.fa-solid.fa-chevron-down", :href=>"javascript:;", :title=>"Collapse docstring"],
a[".docstring-binding", :id=>node.anchor.id, :href=>"#$(node.anchor.id)"](code("$(node.object.binding)")),
a[".docstring-binding", :id=>docsnode.anchor.id, :href=>"#$(docsnode.anchor.id)"](code("$(docsnode.object.binding)")),
"", # &mdash;
span[".docstring-category"]("$(Documenter.doccat(node.object))")
span[".docstring-category"]("$(Documenter.doccat(docsnode.object))")
),
domify_doc(dctx, mdast_node)
)
end

function domify_doc(dctx::DCtx, node::Node)
@assert node.element isa Documenter.DocsNode
ctx, navnode = dctx.ctx, dctx.navnode
# function domify_doc(ctx, navnode, md::Markdown.MD)
ctx = dctx.ctx
@tags a section footer div
# The `:results` field contains a vector of `Docs.DocStr` objects associated with
# each markdown object. The `DocStr` contains data such as file and line info that
Expand All @@ -1790,8 +1780,8 @@ end
domify(::DCtx, ::Node, ::Documenter.MetaNode) = DOM.Node[]
domify(::DCtx, ::Node, ::Documenter.SetupNode) = DOM.Node[]

function domify(::DCtx, ::Node, raw::Documenter.RawNode)
raw.name === :html ? Tag(Symbol("#RAW#"))(raw.text) : DOM.Node[]
function domify(::DCtx, ::Node, rawnode::Documenter.RawNode)
rawnode.name === :html ? Tag(Symbol("#RAW#"))(rawnode.text) : DOM.Node[]
end


Expand Down Expand Up @@ -1901,10 +1891,9 @@ corresponding HTML file). If the data is under the threshold, no file is created
function returns `nothing`.
"""
function write_data_file(dctx::DCtx, data::Union{Vector{UInt8},AbstractString}; suffix::AbstractString)
ctx, navnode = dctx.ctx, dctx.navnode
# If we're under the threshold, we return `nothing`, indicating to the caller that
# they should inline the file instead.
if length(data) < ctx.settings.example_size_threshold
if length(data) < dctx.ctx.settings.example_size_threshold
return nothing
end
slug = dataslug(data)
Expand Down Expand Up @@ -2022,7 +2011,6 @@ was unable to find any `<h1>` headers).
"""
function pagetitle(page::Node)
@assert page.element isa MarkdownAST.Document
# function pagetitle(page::Documenter.Page)
title = nothing
for node in page.children
# AnchoredHeaders should have just one child node, which is the Heading node
Expand All @@ -2039,7 +2027,6 @@ end

function pagetitle(dctx::DCtx)
ctx, navnode = dctx.ctx, dctx.navnode
# function pagetitle(ctx, navnode::Documenter.NavNode)
if navnode.title_override !== nothing
# parse title_override as markdown
md = Markdown.parse(navnode.title_override)
Expand All @@ -2052,7 +2039,7 @@ function pagetitle(dctx::DCtx)
end

if navnode.page !== nothing
title = pagetitle(getpage(dctx).mdast)
title = pagetitle(getpage(ctx, navnode).mdast)
title === nothing || return title
end

Expand All @@ -2069,7 +2056,6 @@ in the navigation menu twice.
"""
function collect_subsections(page::MarkdownAST.Node)
@assert page.element isa MarkdownAST.Document
# function collect_subsections(page::Documenter.Page)
sections = []
title_found = false
for node in page.children
Expand Down Expand Up @@ -2114,10 +2100,8 @@ function domify_ansicoloredtext(text::AbstractString, class = "")
return stack[1].nodes
end

function domify(dctx::DCtx, node::Node, e::MarkdownAST.Text)
ctx, navnode = dctx.ctx, dctx.navnode
function domify(::DCtx, ::Node, e::MarkdownAST.Text)
text = e.text
# function mdconvert(text::AbstractString, parent; kwargs...)

# Javascript LaTeX engines have a hard time dealing with `$` floating around
# because they use them as in-line escapes. You can try a few different
Expand All @@ -2134,10 +2118,10 @@ domify(dctx::DCtx, node::Node, ::MarkdownAST.BlockQuote) = Tag(:blockquote)(domi

domify(dctx::DCtx, node::Node, ::MarkdownAST.Strong) = Tag(:strong)(domify(dctx, node.children))

function domify(dctx::DCtx, node::Node, c::MarkdownAST.CodeBlock)
ctx, navnode, settings = dctx.ctx, dctx.navnode, dctx.settings
function domify(dctx::DCtx, ::Node, c::MarkdownAST.CodeBlock)
ctx = dctx.ctx
settings = ctx.settings
language = c.info
# function mdconvert(c::Markdown.Code, parent::MDBlockContext; settings::Union{HTML,Nothing}=nothing, kwargs...)
@tags pre code
language = Documenter.codelang(language)
if language == "documenter-ansi" # From @repl blocks (through MultiCodeBlock)
Expand All @@ -2152,8 +2136,6 @@ function domify(dctx::DCtx, node::Node, c::MarkdownAST.CodeBlock)
end

function domify(dctx::DCtx, node::Node, mcb::Documenter.MultiCodeBlock)
ctx, navnode = dctx.ctx, dctx.navnode
# function mdconvert(mcb::Documenter.MultiCodeBlock, parent::MDBlockContext; kwargs...)
@tags pre br
p = pre()
for (i, thing) in enumerate(node.children)
Expand All @@ -2171,7 +2153,7 @@ function domify(dctx::DCtx, node::Node, mcb::Documenter.MultiCodeBlock)
return p
end

domify(dctx::DCtx, node::Node, c::MarkdownAST.Code) = Tag(:code)(c.code)
domify(::DCtx, ::Node, c::MarkdownAST.Code) = Tag(:code)(c.code)

function hljs_prerender(c::MarkdownAST.CodeBlock, settings::HTML)
@assert settings.prerender "unreachable"
Expand Down Expand Up @@ -2200,14 +2182,12 @@ function domify(dctx::DCtx, node::Node, h::MarkdownAST.Heading)
DOM.Tag(Symbol("h$N"))(domify(dctx, node.children))
end

domify(dctx::DCtx, node::Node, ::MarkdownAST.ThematicBreak) = Tag(:hr)()
domify(::DCtx, ::Node, ::MarkdownAST.ThematicBreak) = Tag(:hr)()

const ImageElements = Union{MarkdownAST.Image, Documenter.LocalImage}
function domify(dctx::DCtx, node::Node, i::ImageElements)
ctx, navnode = dctx.ctx, dctx.navnode
alt = mdflatten(node.children)
url = filehref(dctx, node, i)
# function mdconvert(i::Markdown.Image, parent; kwargs...)
# TODO: Implement .title
@tags video img a

Expand All @@ -2222,18 +2202,17 @@ end

domify(dctx::DCtx, node::Node, ::MarkdownAST.Emph) = Tag(:em)(domify(dctx, node.children))

domify(dctx::DCtx, node::Node, m::MarkdownAST.DisplayMath) = Tag(:p)[".math-container"](string("\\[", m.math, "\\]"))
domify(::DCtx, ::Node, m::MarkdownAST.DisplayMath) = Tag(:p)[".math-container"](string("\\[", m.math, "\\]"))

domify(dctx::DCtx, node::Node, m::MarkdownAST.InlineMath) = Tag(:span)(string('$', m.math, '$'))
domify(::DCtx, ::Node, m::MarkdownAST.InlineMath) = Tag(:span)(string('$', m.math, '$'))

domify(dctx::DCtx, node::Node, m::MarkdownAST.LineBreak) = Tag(:br)()
domify(::DCtx, ::Node, m::MarkdownAST.LineBreak) = Tag(:br)()
# TODO: Implement SoftBreak, Backslash (but they don't appear in standard library Markdown conversions)

const LinkElements = Union{MarkdownAST.Link, Documenter.PageLink, Documenter.LocalLink}
function domify(dctx::DCtx, node::Node, link::LinkElements)
droplinks = dctx.droplinks
url = filehref(dctx, node, link)
# function mdconvert(link::Markdown.Link, parent; droplinks=false, kwargs...)
link_text = domify(dctx, node.children)
droplinks ? link_text : Tag(:a)[:href => url](link_text)
end
Expand All @@ -2257,7 +2236,6 @@ is_in_tight_list(node::Node) = !isnothing(node.parent) && isa(node.parent.elemen

function domify(dctx::DCtx, node::Node, t::MarkdownAST.Table)
th_row, tbody_rows = Iterators.peel(MarkdownAST.tablerows(node))
# function mdconvert(t::Markdown.Table, parent; kwargs...)
@tags table tr th td
alignment_style = map(t.spec) do align
if align == :right
Expand All @@ -2280,7 +2258,7 @@ function domify(dctx::DCtx, node::Node, t::MarkdownAST.Table)
)
end

function domify(dctx::DCtx, node::Node, e::MarkdownAST.JuliaValue)
function domify(::DCtx, ::Node, e::MarkdownAST.JuliaValue)
@warn("""
Unexpected Julia interpolation in the Markdown. This probably means that you
have an unbalanced or un-escaped \$ in the text.
Expand All @@ -2294,7 +2272,7 @@ function domify(dctx::DCtx, node::Node, e::MarkdownAST.JuliaValue)
return string(e.ref)
end

function domify(dctx::DCtx, node::Node, f::MarkdownAST.FootnoteLink)
function domify(::DCtx, ::Node, f::MarkdownAST.FootnoteLink)
@tags sup a
sup[".footnote-reference"](a["#citeref-$(f.id)", :href => "#footnote-$(f.id)"]("[$(f.id)]"))
end
Expand Down Expand Up @@ -2529,28 +2507,28 @@ end
# If the nodes passed through CrossReferences as native MarkdownAST elements, then that
# means they're reasonable absolute URLs. Or, possibly, the URL is problematic, but we
# just ignore that here. That should have been caught earlier.
filehref(dctx::DCtx, node::Node, e::Union{MarkdownAST.Image, MarkdownAST.Link}) = e.destination
filehref(::DCtx, ::Node, e::Union{MarkdownAST.Image, MarkdownAST.Link}) = e.destination

function filehref(dctx::DCtx, node::Node, e::Documenter.PageLink)
function filehref(dctx::DCtx, ::Node, pagelink::Documenter.PageLink)
ctx, navnode = dctx.ctx, dctx.navnode
path = Documenter.pagekey(ctx.doc, e.page)
path = Documenter.pagekey(ctx.doc, pagelink.page)
path = pretty_url(ctx, relhref(get_url(ctx, navnode), get_url(ctx, path)))
# Add a fragment, if present
return isempty(e.fragment) ? path : "$path#$(e.fragment)"
return isempty(pagelink.fragment) ? path : "$path#$(pagelink.fragment)"
end

function filehref(dctx::DCtx, node::Node, e::Documenter.LocalLink)
function filehref(dctx::DCtx, ::Node, locallink::Documenter.LocalLink)
ctx, navnode = dctx.ctx, dctx.navnode
path = relhref(get_url(ctx, navnode), e.path)
path = relhref(get_url(ctx, navnode), locallink.path)
# Replace any backslashes in links, if building the docs on Windows
path = replace(path, '\\' => '/')
# Add a fragment, if present
return isempty(e.fragment) ? path : "$path#$(e.fragment)"
return isempty(locallink.fragment) ? path : "$path#$(locallink.fragment)"
end

function filehref(dctx::DCtx, node::Node, e::Documenter.LocalImage)
function filehref(dctx::DCtx, ::Node, localimage::Documenter.LocalImage)
ctx, navnode = dctx.ctx, dctx.navnode
path = relhref(get_url(ctx, navnode), e.path)
path = relhref(get_url(ctx, navnode), localimage.path)
# Replace any backslashes in links, if building the docs on Windows
return replace(path, '\\' => '/')
end
Expand Down

0 comments on commit c0e2223

Please sign in to comment.