summaryrefslogtreecommitdiffstats
path: root/yql/essentials/utils/docs/page.cpp
blob: f0b1671a9dd4fbc4c6084be46bf9d62969d5e8e4 (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