summaryrefslogtreecommitdiffstats
path: root/yql/essentials/utils/docs/page.cpp
blob: 516b8b2886e79a18c0705bd59893b0997451542e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "page.h"

#include <yql/essentials/utils/yql_panic.h>

#include <contrib/libs/re2/re2/re2.h>

namespace NYql::NDocs {

    TString ResolvedMarkdownText(TStringBuf relativePath, TString text, TStringBuf baseURL) {
        static const RE2 anchorRegex(R"re(\[([^\\\]]+)\]\((#[^\\)]+)\))re");
        static const RE2 linkRegex(R"re(\[([^\\\]]+)\]\(([A-Za-z0-9/_\-\.]+).md(#[^\\)]+)?\))re");

        TString base = TString(baseURL) + "/" + TString(relativePath);
        TString anchorRewrite = "[\\1](" + base + "\\2)";
        TString linkRewrite = "[\\1](" + base + "/../" + "\\2\\3)";

        TString error;
        YQL_ENSURE(
            anchorRegex.CheckRewriteString(anchorRewrite, &error),
            "Bad rewrite '" << anchorRewrite << "': " << error);
        YQL_ENSURE(
            linkRegex.CheckRewriteString(linkRewrite, &error),
            "Bad rewrite '" << linkRewrite << "': " << error);

        RE2::GlobalReplace(&text, anchorRegex, anchorRewrite);
        RE2::GlobalReplace(&text, linkRegex, linkRewrite);

        return text;
    }

    TMarkdownPage Resolved(TStringBuf relativePath, TMarkdownPage page, TStringBuf baseURL) {
        page.Text = ResolvedMarkdownText(relativePath, page.Text, baseURL);
        for (auto& [_, section] : page.SectionsByAnchor) {
            section.Body = ResolvedMarkdownText(relativePath, std::move(section.Body), baseURL);
        }
        return page;
    }

    TString ExtendedSyntaxRemoved(TString text) {
        static const RE2 regex(R"re( *{%[^\\]*?%} *\n?)re");
        RE2::GlobalReplace(&text, regex, "");
        return text;
    }

    TMarkdownPage ExtendedSyntaxRemoved(TMarkdownPage page) {
        page.Text = ExtendedSyntaxRemoved(page.Text);
        for (auto& [_, section] : page.SectionsByAnchor) {
            section.Body = ExtendedSyntaxRemoved(std::move(section.Body));
        }
        return page;
    }

    TPages ParsePages(TResourcesByRelativePath resources) {
        TPages pages;
        for (auto& [path, resource] : resources) {
            TMarkdownPage page = ParseMarkdownPage(std::move(resource));
            pages.emplace(std::move(path), std::move(page));
        }
        return pages;
    }

    TPages Resolved(TPages pages, TStringBuf baseURL) {
        for (auto& [relativeURL, page] : pages) {
            page = Resolved(relativeURL, std::move(page), baseURL);
        }
        return pages;
    }

    TPages ExtendedSyntaxRemoved(TPages pages) {
        for (auto& [_, page] : pages) {
            page = ExtendedSyntaxRemoved(std::move(page));
        }
        return pages;
    }

} // namespace NYql::NDocs