From 44a74f4369f0924df2dcd39c96ce45f85f4f7d6e Mon Sep 17 00:00:00 2001 From: rahban Date: Mon, 31 Mar 2025 09:55:37 +0530 Subject: [PATCH 1/3] added SearchRecord custom functions for at-blocks --- src/html/HTMLWriter.jl | 55 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/html/HTMLWriter.jl b/src/html/HTMLWriter.jl index 8f17884332..dada6f66ab 100644 --- a/src/html/HTMLWriter.jl +++ b/src/html/HTMLWriter.jl @@ -713,6 +713,61 @@ function SearchRecord(ctx, navnode, node::Node, ::MarkdownAST.AbstractElement) return SearchRecord(ctx, navnode; text = mdflatten(node)) end + +# for @example blocks +function SearchRecord(ctx::HTMLContext, navnode::Documenter.NavNode, node::MarkdownAST.Node{Nothing}, element::Documenter.MultiOutput) + @info "MultiOutput SearchRecord method called!" + children_array = collect(node.children) + + if isempty(children_array) || length(children_array) < 2 + return SearchRecord(ctx, navnode; text = "") + end + + output_text = "" + for child in children_array[2:end] + if isa(child.element, Documenter.MultiOutputElement) && isa(child.element.element, Dict) + for mime in [MIME"text/plain"(), MIME"text/markdown"(), MIME"text/html"()] + if haskey(child.element.element, mime) + output_text *= string(child.element.element[mime]) * " " + break + end + end + else + output_text *= mdflatten(child) * " " + end + end + return SearchRecord(ctx, navnode; text = output_text) +end + +# for @repl blocks + +function SearchRecord(ctx::HTMLContext, navnode::Documenter.NavNode, node::MarkdownAST.Node{Nothing}, element::Documenter.MultiCodeBlock) + @info "MultiCodeBlock SearchRecord method called!" + children_array = collect(node.children) + + if isempty(children_array) || length(children_array) < 2 + return SearchRecord(ctx, navnode; text = "") + end + + output_text = "" + for i in 2:2:length(children_array) + if i <= length(children_array) + output_text *= mdflatten(children_array[i]) * " " + end + end + return SearchRecord(ctx, navnode; text = output_text) +end + +# for @eval blocks +function SearchRecord(ctx, navnode, node::Node, element::Documenter.EvalNode) + @info "EvalNode SearchRecord method called!" + if isnothing(element.result) + return SearchRecord(ctx, navnode; text = "") + else + return SearchRecord(ctx, navnode; text = mdflatten(element.result)) + end +end + function JSON.lower(rec::SearchRecord) # Replace any backslashes in links, if building the docs on Windows src = replace(rec.src, '\\' => '/') From 32e47b4a3bc0a0ebe96b2b61aad2a6b04ccde662 Mon Sep 17 00:00:00 2001 From: rahban Date: Thu, 3 Apr 2025 01:18:40 +0530 Subject: [PATCH 2/3] tried fixing it --- src/html/HTMLWriter.jl | 101 +++++++++++++++++++++++++++-------------- 1 file changed, 67 insertions(+), 34 deletions(-) diff --git a/src/html/HTMLWriter.jl b/src/html/HTMLWriter.jl index dada6f66ab..1bdcc4f7b4 100644 --- a/src/html/HTMLWriter.jl +++ b/src/html/HTMLWriter.jl @@ -714,17 +714,17 @@ function SearchRecord(ctx, navnode, node::Node, ::MarkdownAST.AbstractElement) end -# for @example blocks +# For @example blocks function SearchRecord(ctx::HTMLContext, navnode::Documenter.NavNode, node::MarkdownAST.Node{Nothing}, element::Documenter.MultiOutput) - @info "MultiOutput SearchRecord method called!" - children_array = collect(node.children) - - if isempty(children_array) || length(children_array) < 2 - return SearchRecord(ctx, navnode; text = "") - end - output_text = "" - for child in children_array[2:end] + + first_child = true + for child in node.children + if first_child + first_child = false + continue + end + if isa(child.element, Documenter.MultiOutputElement) && isa(child.element.element, Dict) for mime in [MIME"text/plain"(), MIME"text/markdown"(), MIME"text/html"()] if haskey(child.element.element, mime) @@ -739,28 +739,25 @@ function SearchRecord(ctx::HTMLContext, navnode::Documenter.NavNode, node::Markd return SearchRecord(ctx, navnode; text = output_text) end -# for @repl blocks - +# For @repl blocks function SearchRecord(ctx::HTMLContext, navnode::Documenter.NavNode, node::MarkdownAST.Node{Nothing}, element::Documenter.MultiCodeBlock) - @info "MultiCodeBlock SearchRecord method called!" - children_array = collect(node.children) - - if isempty(children_array) || length(children_array) < 2 - return SearchRecord(ctx, navnode; text = "") - end - + # Extract only output lines (even-numbered children) output_text = "" - for i in 2:2:length(children_array) - if i <= length(children_array) - output_text *= mdflatten(children_array[i]) * " " + + # Process each child, taking only even-numbered ones (outputs) + child_index = 0 + for child in node.children + child_index += 1 + if child_index % 2 == 0 # Even indices are outputs + output_text *= mdflatten(child) * " " end end return SearchRecord(ctx, navnode; text = output_text) end -# for @eval blocks +# For @eval blocks function SearchRecord(ctx, navnode, node::Node, element::Documenter.EvalNode) - @info "EvalNode SearchRecord method called!" + # For @eval blocks, we only want to index the result, not the source code if isnothing(element.result) return SearchRecord(ctx, navnode; text = "") else @@ -768,6 +765,39 @@ function SearchRecord(ctx, navnode, node::Node, element::Documenter.EvalNode) end end +function SearchRecord(ctx, navnode, node::Node, element::Documenter.MultiOutputElement) + if element.element isa Dict && haskey(element.element, :source) + return SearchRecord(ctx, navnode; text = "") + end + + return SearchRecord(ctx, navnode, node, element.element) +end + +""" +Filter function to prevent duplicate search entries. +""" +function should_index_for_search(navnode, node, element) + if element isa Documenter.MultiOutputElement && + element.element isa Dict && + haskey(element.element, :source) + return false + end + + if element isa Documenter.MultiCodeBlock && + node.parent !== nothing && + iseven(findfirst(child -> child === node, collect(node.parent.children))) + return false + end + + if element isa Documenter.EvalNode && + node.parent !== nothing && + node === first(node.parent.children) + return false + end + + return true +end + function JSON.lower(rec::SearchRecord) # Replace any backslashes in links, if building the docs on Windows src = replace(rec.src, '\\' => '/') @@ -1735,8 +1765,10 @@ end function domify(dctx::DCtx) ctx, navnode = dctx.ctx, dctx.navnode return map(getpage(ctx, navnode).mdast.children) do node - rec = SearchRecord(ctx, navnode, node, node.element) - push!(ctx.search_index, rec) + if should_index_for_search(navnode, node, node.element) + rec = SearchRecord(ctx, navnode, node, node.element) + push!(ctx.search_index, rec) + end domify(dctx, node, node.element) end end @@ -1828,15 +1860,16 @@ function domify(dctx::DCtx, mdast_node::Node, docsnode::Documenter.DocsNode) @tags a code article header span # push to search index - rec = SearchRecord( - ctx, navnode; - 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) - + if should_index_for_search(navnode, docsnode, docsnode.object) + rec = SearchRecord( + ctx, navnode, + 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) + end return article[".docstring"]( header( a[".docstring-article-toggle-button.fa-solid.fa-chevron-down", :href => "javascript:;", :title => "Collapse docstring"], From f7b357bcf851264b8246ef38a33a9f1d7f132d26 Mon Sep 17 00:00:00 2001 From: rahban Date: Tue, 20 May 2025 18:49:57 +0530 Subject: [PATCH 3/3] fixing the issue --- src/html/HTMLWriter.jl | 86 +++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/src/html/HTMLWriter.jl b/src/html/HTMLWriter.jl index 1bdcc4f7b4..dc8038a9e6 100644 --- a/src/html/HTMLWriter.jl +++ b/src/html/HTMLWriter.jl @@ -683,6 +683,21 @@ struct DCtx ) = new(dctx.ctx, navnode, droplinks, footnotes) end +function searchrecord(ctx, navnode, node::Node, element) + # default behavior + return SearchRecord(ctx, navnode, node, element) +end + +function searchrecord(ctx, navnode, node::Node, element::Documenter.MultiOutputElement) + # special case for at-blocks + if element.element isa Dict && haskey(element.element, :source) + return nothing + else + return SearchRecord(ctx, navnode, node, element) + end +end + + function SearchRecord(ctx::HTMLContext, navnode; fragment = "", title = nothing, category = "page", text = "") page_title = mdflatten_pagetitle(DCtx(ctx, navnode)) if title === nothing @@ -765,38 +780,10 @@ function SearchRecord(ctx, navnode, node::Node, element::Documenter.EvalNode) end end -function SearchRecord(ctx, navnode, node::Node, element::Documenter.MultiOutputElement) - if element.element isa Dict && haskey(element.element, :source) - return SearchRecord(ctx, navnode; text = "") - end - - return SearchRecord(ctx, navnode, node, element.element) -end +# This SearchRecord method was removed to eliminate duplicate index entries +# The functionality is now handled by the should_index_for_search method +# and the searchrecord method above. -""" -Filter function to prevent duplicate search entries. -""" -function should_index_for_search(navnode, node, element) - if element isa Documenter.MultiOutputElement && - element.element isa Dict && - haskey(element.element, :source) - return false - end - - if element isa Documenter.MultiCodeBlock && - node.parent !== nothing && - iseven(findfirst(child -> child === node, collect(node.parent.children))) - return false - end - - if element isa Documenter.EvalNode && - node.parent !== nothing && - node === first(node.parent.children) - return false - end - - return true -end function JSON.lower(rec::SearchRecord) # Replace any backslashes in links, if building the docs on Windows @@ -1762,12 +1749,26 @@ function domify(::DCtx, ::Node, element::MarkdownAST.AbstractElement) error("Unimplemented element: $(typeof(element))") end +# Return true if this node should be included in the search index +should_index_for_search(navnode, node, element) = true + +# Filter out source nodes in at-blocks to prevent duplicate search index entries +function should_index_for_search(navnode, node, element::Documenter.MultiOutputElement) + # Skip source nodes in at-blocks + if element.element isa Dict && haskey(element.element, :source) + return false + end + return true +end + function domify(dctx::DCtx) ctx, navnode = dctx.ctx, dctx.navnode return map(getpage(ctx, navnode).mdast.children) do node if should_index_for_search(navnode, node, node.element) - rec = SearchRecord(ctx, navnode, node, node.element) - push!(ctx.search_index, rec) + rec = searchrecord(ctx, navnode, node, node.element) + if rec !== nothing + push!(ctx.search_index, rec) + end end domify(dctx, node, node.element) end @@ -1860,16 +1861,15 @@ function domify(dctx::DCtx, mdast_node::Node, docsnode::Documenter.DocsNode) @tags a code article header span # push to search index - if should_index_for_search(navnode, docsnode, docsnode.object) - rec = SearchRecord( - ctx, navnode, - 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) - end + rec = SearchRecord( + ctx, navnode, + 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) + return article[".docstring"]( header( a[".docstring-article-toggle-button.fa-solid.fa-chevron-down", :href => "javascript:;", :title => "Collapse docstring"],