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