aboutsummaryrefslogtreecommitdiff
path: root/markdown2pdf
blob: 9470ae8e8f91547856f7418447bbf70eaaba8cf3 (plain)
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/bin/sh -e

latexprogram=pdflatex
if (echo "$@" | grep -q xetex); then
   latexprogram=xelatex
fi

REQUIRED=$latexprogram
SYNOPSIS="converts markdown-formatted text to PDF, using pdflatex."

THIS=${0##*/}

NEWLINE='
'

err ()  { echo "$*"   | fold -s -w ${COLUMNS:-110} >&2; }
errn () { printf "$*" | fold -s -w ${COLUMNS:-110} >&2; }

usage () {
    err "$1 - $2" # short description
    err "Options:"
    pandoc -h | sed -ne '/--strict\|--preserve-tabs\|--tab-stop\|--parse-raw\|--toc\|--xetex\|--number-sections\|--include-in-header\|--include-before-body\|--include-after-body\|--custom-header\|--output\|--template\|--variable\|--help\|--version/p' >&2
}

# Portable which(1).
pathfind () {
    oldifs="$IFS"; IFS=':'
    for _p in $PATH; do
        if [ -x "$_p/$*" ] && [ -f "$_p/$*" ]; then
            IFS="$oldifs"
            return 0
        fi
    done
    IFS="$oldifs"
    return 1
}

for p in pandoc $REQUIRED; do
    pathfind $p || {
        err "You need '$p' to use this program!"
        exit 1
    }
done

if (echo "$@" | grep -q -- "--help\|-h"); then
    usage "$THIS" "$SYNOPSIS"
    exit 0
fi

CONF=$(pandoc --dump-args "$@") || exit $?
OUTPUT=$(echo "$CONF" | sed -ne '1p')
ARGS=$(echo "$CONF" | sed -e '1d')

# As a security measure refuse to proceed if mktemp is not available.
pathfind mktemp || { err "Couldn't find 'mktemp'; aborting."; exit 1;  }

# Avoid issues with /tmp directory on Windows/Cygwin 
cygwin=
cygwin=$(uname | sed -ne '/^CYGWIN/p')
if [ -n "$cygwin" ]; then
    TMPDIR=.
    export TMPDIR
fi

THIS_TEMPDIR=
THIS_TEMPDIR="$(mktemp -d -t $THIS.XXXXXXXX)" || exit 1
readonly THIS_TEMPDIR

trap 'exitcode=$?
      [ -z "$THIS_TEMPDIR" ] || rm -rf "$THIS_TEMPDIR"
      exit $exitcode' 0 1 2 3 13 15

texname=output
logfile=$THIS_TEMPDIR/log

pandoc -s -r markdown -w latex "$@" -o $THIS_TEMPDIR/$texname.tex

if [ "$OUTPUT" = "-" ]; then
    firstinfile="$(echo $ARGS | sed -ne '1p')"
    firstinfilebase="${firstinfile%.*}"
    destname="${firstinfilebase:-stdin}.pdf"
else
    destname="$OUTPUT"
fi

(
    origdir=$(pwd)
    cd $THIS_TEMPDIR
    TEXINPUTS=$origdir:$TEXINPUTS:
    export TEXINPUTS
    finished=no
    runs=0
    while [ $finished = "no" ]; do
      $latexprogram -interaction=batchmode $texname.tex >/dev/null || {
        errcode=$?
        err "${THIS}: $latexprogram failed with error code $errcode"
        [ -f $texname.log ] && {
          err "${THIS}: error context:"
          sed -ne '/^!/,/^[[:space:]]*$/p' \
            -ne '/^[Ll]a[Tt]e[Xx] [Ww]arning/,/^[[:space:]]*$/p' \
            -ne '/^[Ee]rror/,/^[[:space:]]*$/p' $texname.log >&2
          if grep -q "File \`ucs.sty' not found" $texname.log; then
            err "${THIS}: Please install the 'unicode' package from CTAN:"
            err "  http://www.ctan.org/tex-archive/macros/latex/contrib/unicode/"
          fi
          if grep -q "File \`ulem.sty' not found" $texname.log; then
            err "${THIS}: Please install the 'ulem' package from CTAN:"
            err "  http://www.ctan.org/tex-archive/macros/latex/contrib/misc/ulem.sty"
          fi
        }
        exit $errcode
      }
      if [ $runs -lt 3 ] && 
      ((grep -q "Warning: There were undefined references." $texname.log) ||
       (echo "$@" | grep -q -- "--toc\|--table-of-contents")); then
        runs=$(($runs + 1))
        if grep -q "LaTeX Warning:.*[Cc]itation" $texname.log; then
          bibtex $texname 2>&1 >bibtex.err
          if [ $runs -gt 2 ]; then
            if grep -q "error message" bibtex.err ||
            grep -q "Warning" bibtex.err; then
              cat bibtex.err >&2
            fi
          fi
        fi
      elif [ $runs -gt 1 ]; then   # always run at least twice for pdf bookmarks
        finished=yes
      else
        runs=$(($runs + 1))
      fi
    done
) || exit $?

mv -f $THIS_TEMPDIR/$texname.pdf "$destname"

err "Created $destname"