diff --git a/src/thesis.lua b/src/thesis.lua index 5527dc0..fc72741 100644 --- a/src/thesis.lua +++ b/src/thesis.lua @@ -106,39 +106,51 @@ function pandoc.ColSpec(width, alignment) return { alignment or pandoc.AlignDefault, width } end +-- Compatibility functions for Pandoc 3.x function pandoc.TableAttr(identifier, classes, attributes) return { identifier or "", classes or {}, attributes or {} } end -function pandoc.TableCell(contents, row_span, col_span, alignment, attr) - return { - attr = attr or pandoc.TableAttr(), - alignment = alignment or pandoc.AlignDefault, - contents = contents, - col_span = col_span or 1, - row_span = row_span or 1, - } +-- Use native Pandoc functions if available, otherwise use compatibility versions +if not pandoc.TableCell then + function pandoc.TableCell(contents, row_span, col_span, alignment, attr) + return { + attr = attr or pandoc.TableAttr(), + alignment = alignment or pandoc.AlignDefault, + contents = contents, + col_span = col_span or 1, + row_span = row_span or 1, + } + end end -function pandoc.TableRow(cells, attr) - return { attr or pandoc.TableAttr(), cells } +if not pandoc.TableRow then + function pandoc.TableRow(cells, attr) + return { attr or pandoc.TableAttr(), cells } + end end -function pandoc.TableHead(rows, attr) - return { attr or pandoc.TableAttr(), rows } +if not pandoc.TableHead then + function pandoc.TableHead(rows, attr) + return { attr or pandoc.TableAttr(), rows or {} } + end end -function pandoc.TableBody(body, row_head_columns, head, attr) - return { - attr = attr or pandoc.TableAttr(), - body = body, - head = head or {}, - row_head_columns = row_head_columns or 0, - } +if not pandoc.TableBody then + function pandoc.TableBody(attr, row_head_columns, head, body) + return { + attr = attr or pandoc.TableAttr(), + body = body or {}, + head = head or {}, + row_head_columns = row_head_columns or 0, + } + end end -function pandoc.TableFoot(rows, attr) - return { attr or pandoc.TableAttr(), rows or {} } +if not pandoc.TableFoot then + function pandoc.TableFoot(rows, attr) + return { attr or pandoc.TableAttr(), rows or {} } + end end @@ -175,10 +187,10 @@ function inlinestoattr(inlines) for key, value in s:gmatch("([^%s%{%}]+)=([^%s%{%}]+)") do attributes[key] = value end for key, value in s:gmatch('([^%s%{%}]+)="([^%{%}]+)"') do attributes[key] = value end - inlines:erase(i) - for i = i-1, 1, -1 do - if inlines[i].tag == "Space" then - inlines:remove() + inlines:remove(i) + for j = i-1, 1, -1 do + if inlines[j].tag == "Space" then + inlines:remove(j) else break end @@ -340,7 +352,8 @@ if configuration:includes("cover") then local rows = pandoc.List{} for _, list in ipairs(tablepairs) do local label, text = table.unpack(list) - for _, value in ipairs(metavalues[text.."-cover"] or { pandoc.Para(metavalues[text]) }) do + local content = metavalues[text.."-cover"] or (metavalues[text] and { pandoc.Para(metavalues[text]) }) or { pandoc.Para({pandoc.Str("")}) } + for _, value in ipairs(content) do rows:insert(pandoc.TableRow({ labelcell(label, styles[1], widthpcts[1]), pandoc.TableCell({ pandoc.RawBlock("openxml", string.format('%s', widthpcts[2], string.gsub(styles[1], "%s", ""),tablesep)) }), textcell(value.content, widthpcts[3]) })) @@ -348,25 +361,25 @@ if configuration:includes("cover") then end end return pandoc.Div(pandoc.Table( - pandoc.CaptionLong({}), + {}, pandoc.List(widthpcts):map(function (x) return pandoc.ColSpec(x / 100) end), - pandoc.TableHead({}), - { pandoc.TableBody(rows) }, - pandoc.TableFoot({}) + pandoc.TableHead({}, {}), + { pandoc.TableBody({}, 0, {}, rows) }, + pandoc.TableFoot({}, {}) ), { ["custom-style"]=styles[2] }) end local cover = pandoc.List{ pandoc.Para(pandoc.Str("")), - pandoc.Div(pandoc.Para(pandoc.Image({}, metavalues["cover-image"], "", { width=187 })), { ["custom-style"]="Captioned Figure" }), + pandoc.Div(pandoc.Para(pandoc.Image({}, metavalues["cover-image"] or "", "", { width=187 })), { ["custom-style"]="Captioned Figure" }), pandoc.Div({ pandoc.Para({ pandoc.Str("研 究 生 毕 业 论 文") }), pandoc.Para({ pandoc.Str("(申请硕士学位)") }), }, { ["custom-style"]="Title" }), pandoc.Para(table.rep(pandoc.LineBreak(), 3)), message({ { "论文题目", "title" }, { "作者姓名", "author" }, { "学科、专业名称", "specialization" }, { "研究方向", "major" }, { "指导老师", "mentor" } }, "", { 23, 5, 60 }, { "Front Cover Label", "Front Cover Text" }), - pandoc.Div(pandoc.Para(table.rep(pandoc.LineBreak(), 5 - #metavalues["title-cover"])), { ["custom-style"]="Front Cover Text" }), - pandoc.Div({ pandoc.Para({ pandoc.Span(metavalues["date"]), raws.page }) }, { ["custom-style"]="Date" }), + pandoc.Div(pandoc.Para(table.rep(pandoc.LineBreak(), 5 - #(metavalues["title-cover"] or {}))), { ["custom-style"]="Front Cover Text" }), + pandoc.Div({ pandoc.Para({ pandoc.Span(metavalues["date"] or {}), raws.page }) }, { ["custom-style"]="Date" }), pandoc.Para(table.rep(pandoc.LineBreak(), 26)), message({ { "学号", "number" }, { "论文答辩日期", "date" }, { "指导教师", "msg-sign" } }, ":", { 23, 5, 72 }, { "Inside Front Cover Label", "Inside Front Cover Text" }), @@ -376,31 +389,31 @@ if configuration:includes("cover") then pandoc.Para({ pandoc.Str("南京大学研究生毕业论文中文摘要首页用纸") }), }, { ["custom-style"]="Abstract Title" }), pandoc.Div({ - pandoc.Para({ pandoc.Span(pandoc.Str("毕业论文题目:"), { ["custom-style"]="Abstract Char" }), pandoc.Str(" "), pandoc.Span(metavalues["title"]), pandoc.Str("\t") }), + pandoc.Para({ pandoc.Span(pandoc.Str("毕业论文题目:"), { ["custom-style"]="Abstract Char" }), pandoc.Str(" "), pandoc.Span(metavalues["title"] or {}), pandoc.Str("\t") }), pandoc.Para({ - pandoc.Str(" "), pandoc.Span(metavalues["specialization"]), pandoc.Str(" "), pandoc.Span(pandoc.Str("专业"), { ["custom-style"]="Abstract Char" }), - pandoc.Str(" "), pandoc.Span(metavalues["grade"]), pandoc.Str(" "), pandoc.Span(pandoc.Str("级硕士生姓名:"), { ["custom-style"]="Abstract Char" }), - pandoc.Str(" "), pandoc.Span(metavalues["author"]), pandoc.Str("\t"), + pandoc.Str(" "), pandoc.Span(metavalues["specialization"] or {}), pandoc.Str(" "), pandoc.Span(pandoc.Str("专业"), { ["custom-style"]="Abstract Char" }), + pandoc.Str(" "), pandoc.Span(metavalues["grade"] or {}), pandoc.Str(" "), pandoc.Span(pandoc.Str("级硕士生姓名:"), { ["custom-style"]="Abstract Char" }), + pandoc.Str(" "), pandoc.Span(metavalues["author"] or {}), pandoc.Str("\t"), }), - pandoc.Para({ pandoc.Span(pandoc.Str("指导教师(姓名、职称):"), { ["custom-style"]="Abstract Char" }), pandoc.Str(" "), pandoc.Span(metavalues["mentor"]), pandoc.Str("\t") }), + pandoc.Para({ pandoc.Span(pandoc.Str("指导教师(姓名、职称):"), { ["custom-style"]="Abstract Char" }), pandoc.Str(" "), pandoc.Span(metavalues["mentor"] or {}), pandoc.Str("\t") }), pandoc.Para(pandoc.Span(pandoc.Str("摘要:"), { ["custom-style"]="Abstract Char" })), }, { ["custom-style"]="Abstract Underline Message" }), - pandoc.Div(metavalues["abstract"], { ["custom-style"]="Abstract" }), - pandoc.Div(pandoc.Para({ pandoc.Str("关键词:"), pandoc.Span(metavalues["keywords"]) }), { ["custom-style"]="Keywords" }), + pandoc.Div(metavalues["abstract"] or {}, { ["custom-style"]="Abstract" }), + pandoc.Div(pandoc.Para({ pandoc.Str("关键词:"), pandoc.Span(metavalues["keywords"] or {}) }), { ["custom-style"]="Keywords" }), raws.section1, pandoc.Div({ pandoc.Para({ pandoc.Str("南京大学研究生毕业论文英文摘要首页用纸") }), }, { ["custom-style"]="Abstract Title" }), pandoc.Div({ - pandoc.Para({ pandoc.Str("THESIS: "), pandoc.Span(metavalues["title-en"]) }), - pandoc.Para({ pandoc.Str("SPECIALIZATION: "), pandoc.Span(metavalues["specialization-en"]) }), - pandoc.Para({ pandoc.Str("POSTGRADUATE: "), pandoc.Span(metavalues["author-en"]) }), - pandoc.Para({ pandoc.Str("MENTOR: "), pandoc.Span(metavalues["mentor-en"]) }), + pandoc.Para({ pandoc.Str("THESIS: "), pandoc.Span(metavalues["title-en"] or {}) }), + pandoc.Para({ pandoc.Str("SPECIALIZATION: "), pandoc.Span(metavalues["specialization-en"] or {}) }), + pandoc.Para({ pandoc.Str("POSTGRADUATE: "), pandoc.Span(metavalues["author-en"] or {}) }), + pandoc.Para({ pandoc.Str("MENTOR: "), pandoc.Span(metavalues["mentor-en"] or {}) }), pandoc.Para(pandoc.Str("ABSTRACT: ")), }, { ["custom-style"]="Abstract Message" }), - pandoc.Div(metavalues["abstract-en"], { ["custom-style"]="Abstract" }), - pandoc.Div(pandoc.Para({ pandoc.Str("KEYWORDS: "), pandoc.Span(metavalues["keywords-en"]) }), { ["custom-style"]="Keywords" }), + pandoc.Div(metavalues["abstract-en"] or {}, { ["custom-style"]="Abstract" }), + pandoc.Div(pandoc.Para({ pandoc.Str("KEYWORDS: "), pandoc.Span(metavalues["keywords-en"] or {}) }), { ["custom-style"]="Keywords" }), raws.section2, } @@ -465,14 +478,14 @@ if configuration:includes("numbering") then eqno = pandoc.Span(eqno, { id=attr.identifier }) end return { pandoc.Table( - pandoc.CaptionLong({}), + {}, { pandoc.ColSpec(widths[1], pandoc.AlignLeft), pandoc.ColSpec(widths[2], pandoc.AlignRight) }, - pandoc.TableHead({}), - { pandoc.TableBody({ pandoc.TableRow({ + pandoc.TableHead({}, {}), + { pandoc.TableBody({}, 0, {}, { pandoc.TableRow({ pandoc.TableCell({ tcpr[1], pandoc.Div(elem, { ["custom-style"]="Equation" }) }), pandoc.TableCell({ tcpr[2], pandoc.Div(pandoc.Para(eqno), { ["custom-style"]="Equation Caption" }) }), }) }) }, - pandoc.TableFoot({}) + pandoc.TableFoot({}, {}) ) } elseif elem.content[1].tag == "Image" and not elem.content[2] then