diff --git a/Userland/Libraries/LibManual/Node.h b/Userland/Libraries/LibManual/Node.h index 52f4dfbb09..fd45fe8302 100644 --- a/Userland/Libraries/LibManual/Node.h +++ b/Userland/Libraries/LibManual/Node.h @@ -26,6 +26,7 @@ public: virtual bool is_open() const { return false; } virtual ErrorOr path() const = 0; virtual PageNode const* document() const = 0; + virtual unsigned section_number() const = 0; // Backend for the command-line argument format that Help and man accept. Handles: // [/path/to/documentation.md] (no second argument) diff --git a/Userland/Libraries/LibManual/PageNode.cpp b/Userland/Libraries/LibManual/PageNode.cpp index 7dcc918c08..f329ee7d39 100644 --- a/Userland/Libraries/LibManual/PageNode.cpp +++ b/Userland/Libraries/LibManual/PageNode.cpp @@ -27,6 +27,11 @@ ErrorOr PageNode::path() const return TRY(String::formatted("{}/{}.md", TRY(m_section->path()), m_page)); } +unsigned PageNode::section_number() const +{ + return m_section->section_number(); +} + ErrorOr> PageNode::help_index_page() { static NonnullRefPtr const help_index_page = TRY(try_make_ref_counted(sections[7 - 1], TRY("Help-index"_string))); diff --git a/Userland/Libraries/LibManual/PageNode.h b/Userland/Libraries/LibManual/PageNode.h index 3f9c1589a5..8f2db597c3 100644 --- a/Userland/Libraries/LibManual/PageNode.h +++ b/Userland/Libraries/LibManual/PageNode.h @@ -28,6 +28,7 @@ public: virtual ErrorOr name() const override { return m_page; }; virtual bool is_page() const override { return true; } virtual PageNode const* document() const override { return this; }; + virtual unsigned section_number() const override; virtual ErrorOr path() const override; diff --git a/Userland/Libraries/LibManual/SectionNode.h b/Userland/Libraries/LibManual/SectionNode.h index a349d7821e..99b9df0895 100644 --- a/Userland/Libraries/LibManual/SectionNode.h +++ b/Userland/Libraries/LibManual/SectionNode.h @@ -32,6 +32,7 @@ public: virtual Node const* parent() const override { return nullptr; } virtual ErrorOr name() const override; String const& section_name() const { return m_section; } + virtual unsigned section_number() const override { return m_section.to_number().value_or(0); } virtual ErrorOr path() const override; virtual PageNode const* document() const override { return nullptr; } diff --git a/Userland/Libraries/LibManual/SubsectionNode.h b/Userland/Libraries/LibManual/SubsectionNode.h index 4ab6fda183..c25dd8213b 100644 --- a/Userland/Libraries/LibManual/SubsectionNode.h +++ b/Userland/Libraries/LibManual/SubsectionNode.h @@ -21,6 +21,7 @@ public: virtual ErrorOr path() const override; virtual ErrorOr name() const override; virtual PageNode const* document() const override; + virtual unsigned section_number() const override { return m_parent->section_number(); } protected: NonnullRefPtr m_parent; diff --git a/Userland/Utilities/man.cpp b/Userland/Utilities/man.cpp index b3e76b04f3..072f20dd8a 100644 --- a/Userland/Utilities/man.cpp +++ b/Userland/Utilities/man.cpp @@ -80,12 +80,12 @@ ErrorOr serenity_main(Main::Arguments arguments) auto page = TRY(Manual::Node::try_create_from_query(query_parameters)); auto page_name = TRY(page->name()); - auto const* section = static_cast(page->parent()); + auto section_number = TRY(String::number(page->section_number())); if (pager.is_empty()) pager = TRY(String::formatted("less -P 'Manual Page {}({}) line %l?e (END):.'", TRY(page_name.replace("'"sv, "'\\''"sv, ReplaceMode::FirstOnly)), - TRY(section->section_name().replace("'"sv, "'\\''"sv, ReplaceMode::FirstOnly)))); + section_number)); pid_t pager_pid = TRY(pipe_to_pager(pager)); auto file = TRY(Core::File::open(TRY(page->path()), Core::File::OpenMode::Read)); @@ -97,8 +97,8 @@ ErrorOr serenity_main(Main::Arguments arguments) auto const title = TRY("SerenityOS manual"_string); - int spaces = max(view_width / 2 - page_name.code_points().length() - section->section_name().code_points().length() - title.code_points().length() / 2 - 4, 0); - outln("{}({}){}{}", page_name, section->section_name(), String::repeated(' ', spaces), title); + int spaces = max(view_width / 2 - page_name.code_points().length() - section_number.code_points().length() - title.code_points().length() / 2 - 4, 0); + outln("{}({}){}{}", page_name, section_number, String::repeated(' ', spaces), title); auto document = Markdown::Document::parse(buffer); VERIFY(document);