about summary refs log tree commit diff
path: root/maintainers/scripts/db-to-md.sh
blob: aa2a2775b6deac10a31620f20f592951797fc031 (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
77
78
79
80
81
82
83
84
85
86
87
88
#! /usr/bin/env nix-shell
#! nix-shell -I nixpkgs=. -i bash -p pandoc

# This script is temporarily needed while we transition the manual to
# CommonMark. It converts DocBook files into our CommonMark flavour.

debug=
files=()

while [ "$#" -gt 0 ]; do
    i="$1"; shift 1
    case "$i" in
      --debug)
        debug=1
        ;;
      *)
        files+=("$i")
        ;;
    esac
done

echo "WARNING: This is an experimental script and might not preserve all formatting." > /dev/stderr
echo "Please report any issues you discover." > /dev/stderr

outExtension="md"
if [[ $debug ]]; then
    outExtension="json"
fi

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

# NOTE: Keep in sync with Nixpkgs manual (/doc/Makefile).
# TODO: Remove raw-attribute when we can get rid of DocBook altogether.
pandoc_commonmark_enabled_extensions=+attributes+fenced_divs+footnotes+bracketed_spans+definition_lists+pipe_tables+raw_attribute
targetLang="commonmark${pandoc_commonmark_enabled_extensions}+smart"
if [[ $debug ]]; then
    targetLang=json
fi
pandoc_flags=(
    # Not needed:
    # - diagram-generator.lua (we do not support that in NixOS manual to limit dependencies)
    # - media extraction (was only required for diagram generator)
    # - myst-reader/roles.lua (only relevant for MyST → DocBook)
    # - link-manpages.lua (links should only be added to display output)
    # - docbook-writer/rst-roles.lua (only relevant for → DocBook)
    # - docbook-writer/labelless-link-is-xref.lua (only relevant for → DocBook)
    "--lua-filter=$DIR/../../doc/build-aux/pandoc-filters/docbook-reader/citerefentry-to-rst-role.lua"
    "--lua-filter=$DIR/../../doc/build-aux/pandoc-filters/myst-writer/roles.lua"
    "--lua-filter=$DIR/doc/unknown-code-language.lua"
    -f docbook
    -t "$targetLang"
    --tab-stop=2
    --wrap=none
)

for file in "${files[@]}"; do
    if [[ ! -f "$file" ]]; then
        echo "db-to-md.sh: $file does not exist" > /dev/stderr
        exit 1
    else
    rootElement=$(xmllint --xpath 'name(//*)' "$file")

    if [[ $rootElement = chapter ]]; then
        extension=".chapter.$outExtension"
    elif [[ $rootElement = section ]]; then
        extension=".section.$outExtension"
    else
        echo "db-to-md.sh: $file contains an unsupported root element $rootElement" > /dev/stderr
        exit 1
    fi

    outFile="${file%".section.xml"}"
    outFile="${outFile%".chapter.xml"}"
    outFile="${outFile%".xml"}$extension"
    temp1=$(mktemp)
    $DIR/doc/escape-code-markup.py "$file" "$temp1"
    if [[ $debug ]]; then
        echo "Converted $file to $temp1" > /dev/stderr
    fi
    temp2=$(mktemp)
    $DIR/doc/replace-xrefs-by-empty-links.py "$temp1" "$temp2"
    if [[ $debug ]]; then
        echo "Converted $temp1 to $temp2" > /dev/stderr
    fi
    pandoc "$temp2" -o "$outFile" "${pandoc_flags[@]}"
    echo "Converted $file to $outFile" > /dev/stderr
  fi
done