-
Notifications
You must be signed in to change notification settings - Fork 28
/
panbook
executable file
·174 lines (160 loc) · 6.06 KB
/
panbook
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#!/bin/bash
# set -x
# 超全局变量
SCRIPTDIR=`cd $(dirname $0);pwd`
CWD=`pwd`
source $SCRIPTDIR/libs/helper.sh
# recon2 方案
# 1. 使用全局数组存储 pandoc 选项,pandoc var(-V), pandoc meta(-M),pandoc filter(--lua-filter)以及panbook需要的变量
# 1.1 通过--option=value形式传入的panbook不能识别的参数存储到 pandoc var数组中,扔给pandoc(需要处理repeat for multiple options的情况)
# 1.2 repeat处理方式为:传参时结尾加 __ , 如 --bibliography__=abc.bib 表示这是一个repeat参数
# 2. panbook选项及每个模块的patch可以修改,新增或删除这些全局数组的元素
# 3. 新增函数用于拼接参数,执行pandoc时调用
# 4. 设计扩展机制:style patch修改参数,执行每个扩展目录下的脚本
# 5. 重定义名词及目录
# 5.1: templates 专指pandoc模板(--templates选项),和 风格(styles) 区分
# 5.2: extensions 用于扩展功能,extension添加的全局变量应以 ext_ 开头。扩展.extensions中设置全局变量前应检查是否以及存在,并打印帮助信息(允许用户通过-G选项更改全局变量)
# 5.3: styles 风格,设计样式,用于定制某种模板,可以通过patch调用extension,修改全局变量,改变模板,增加lua filter等。(参数名 --style)
# 5.3.1: styles和templates要做区分,比如默认的latex模板,moderncv,elegantbook都可以调用这个模板,但是又需要不同的lua filter,文档类等
declare -A _G # panbook全局选项
declare -A _P # pandoc选项
declare -A _V # pandoc var (-V)
declare -A _M # pandoc meta (-M)
declare -A _F # lua filter (--lua-filter)
declare -A _F0 # 需要在crossref及citeproc前执行的lua filter
declare -A _MF # parse metadata.yml
# ${_G[header]} 变量说明:
# 由于pandoc-crossref需要使用metadata中的header-includes变量,命令行参数中不能包含 -H,需要使用lua filter将-H参数内容转换为metadata变量
# 参见 https://github.com/annProg/PanBook/issues/8
# -H 参数引入的tex文件,命名为 add-header-*.tex,pandoc执行前,cat add-header-*.tex > add-header.tex
_G=(
[func-pre]=func # 可被命令行调用的function前缀
[src]=src # 默认src目录名称(需要在获取参数后重置)
[workdir]=$CWD/src # 默认markdown源码目录(需要在获取参数后重置)
[imgdir]=$CWD/src/images # 默认image目录(需要在获取参数后重置)
[crs]=$SCRIPTDIR/crs/zh-CN.yaml # 默认crs配置文件(需要在获取参数后重置)
[ofile]=`echo $CWD |awk -F '/' '{print $NF}'` # 默认输出文件名
[build]=$CWD/build # 默认编译目录
[moduledir]=modules
[fontdir]=fonts
[extdir]=extensions # 扩展目录
[tpldir]=templates # pandoc模板目录
[styledir]=styles # styles目录
[stylecv]=styles/cv
[styleslide]=styles/slide
[stylebook]=styles/book
[stylethesis]=styles/thesis
[styleart]=styles/article
[scriptdir]=$SCRIPTDIR
[cwd]=$CWD
[convert]=convert
[debug]=false
[trace]=false
[frontmatter]=frontmatter.md # 前言部分单独放到一个文件中是考虑到前言应在目录前,通过 -B 参数引入,才能实现
[backmatter]=backmatter.md
[defaultbody]=chapter-*
[v]=""
[m]=""
[p]=""
[f]=""
[crossref]="-F pandoc-crossref"
[citeproc]="--citeproc"
[pandoc-param]=""
[t]=tex
[interaction]="-interaction=batchmode"
[xelatex]=""
[part]=false # 部分编译
[highlight]="" # 高亮样式
)
_G[build_id]=`echo $RANDOM$RANDOM$RANDOM` # 表示编译ID
_G[header]=$CWD/build/add-headers/${_G[build_id]}.tex # 默认header文件名 build_id支持并行编译
_P=(
[toc]=""
[csl]=$SCRIPTDIR/csl/chinese-gb7714-2005-numeric.csl # 默认cls文件路径(需要在获取参数后重置)
[bibliography]=$CWD/src/bibliography.bib # 默认bibliography路径(需要在获取参数后删除)
[metadata-file]=$CWD/src/metadata.yaml # 默认metadata.yaml(需要在获取参数后重置)
[pdf-engine]=xelatex
[number-sections]=""
)
_V=(
[indent]=true # indent M默认打开
)
_M=(
[link-citations]=true # make your citations hyperlinks to the corresponding bibliography entries
)
_F=()
# 存储帮助信息
declare -A _H
_H=()
# 引入函数和模块
source $SCRIPTDIR/libs/core.sh
source $SCRIPTDIR/libs/functions.sh
loadModules
if [ $# -ge 1 ];then
[ "$1"x == "--help"x -o "$1"x == "-h"x -o "$1"x == "help"x ] && printhelp
_G[function]=$1
shift
else
printhelp
fi
loadExtensions
for i in "$@"
do
key=$1
case $key in
-h|--help)
_help ${_G[function]} $2
exit 0;;
-l|--list)
_list ${_G[function]} $2
exit 0;;
--style=*)
_G[style]=${key#*=}
shift;;
--crs=*)
_G[crs]=${key#*=}
shift;;
-d|--debug)
_G[debug]=true
shift;;
--src=*)
_G[src]=${key#*=}
shift;;
--imgdir=*)
_G[imgdir]=${key#*=}
shift;;
--part=*)
_G[part]=${key#*=}
shift;;
--ci=*|--ci*)
_G[ci]=${key#*=}
useCI ${_G[ci]}
shift;;
--memory=*)
_G[memory]=${key#*=}
shift;;
# 限制内存使用 see https://github.com/jgm/pandoc/issues/3169
--trace)
_G[trace]=true
shift;;
-V)
setV "$2"
shift 2;;
-M)
setM "$2"
shift 2;;
-G)
setG $2
shift 2;;
*)
setP $key
shift;;
esac
done
[ "${_G[trace]}"x == "true"x ] && set -x
note "Welcome to PanBook!"
# 修正目录
fixDir
mkDir
_call ${_G[func-pre]}_${_G[function]}
printGlobal