Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 63 additions & 50 deletions src/thesis.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -340,33 +352,34 @@ 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('<w:tcPr><w:tcMar><w:left w:w="0" w:type="dxa" /><w:right w:w="0" w:type="dxa" /></w:tcMar><w:tcW w:w="%q" w:type="pct" /></w:tcPr><w:p><w:pPr><w:pStyle w:val="%s" /></w:pPr><w:r><w:t xml:space="preserve">%s</w:t></w:r></w:p>', widthpcts[2], string.gsub(styles[1], "%s", ""),tablesep))
}), textcell(value.content, widthpcts[3]) }))
label = ""
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" }),
Expand All @@ -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,
}

Expand Down Expand Up @@ -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
Expand Down