CSL-style citation and bibliography rendering for MoonBit
git clone https://github.com/yujieMamba/mooncite.git
cd mooncite
moon version --all
moonc -v
moon fmt --check
moon check --target wasm-gc --deny-warn
moon build --target wasm-gc --deny-warn
moon test --target wasm-gc --deny-warn
moon run examples/beginners --target wasm-gc
moon run examples/numeric --target wasm-gc
moon run examples/document --target wasm-gcmoon add yujieMamba/mooncite@0.1.2import {
"yujieMamba/mooncite",
}let item = @mooncite.Item::new("intro")
.set_string("title", "A MoonBit introduction")
.set_name("author", [
@mooncite.CslName::new("Doe", given="Jane Mary"),
@mooncite.CslName::new("Smith", given="John"),
])
.set_date("issued", @mooncite.CslDate::new(2025))
let p = @mooncite.Processor::from_style(STYLE).unwrap()
println(p.render_citation([item], [@mooncite.Cite::new("intro")]).unwrap())
println(p.render_bibliography([item]).unwrap())
println(p.render_bibliography_html([item]).unwrap())(Doe and Smith 2025)
Doe, J. M. and J. Smith. (2025). A MoonBit introduction.
Doe, J. M. and J. Smith. (2025). <i>A MoonBit introduction</i>.<citation collapse="citation-number">
<sort><key variable="citation-number"/></sort>
<layout prefix="[" suffix="]" delimiter=", ">
<group delimiter=", ">
<text variable="citation-number"/>
<group delimiter=" ">
<label variable="locator" form="short"/>
<text variable="locator"/>
</group>
</group>
</layout>
</citation>[1–3, 5, 7–9]
[1, 2, pp. 12-14, 3]
1. Paper 1
2. Paper 2
3. Paper 3
...
9. Paper 9moon run cmd/main --target wasm-gc
moon run examples/beginners --target wasm-gc
moon run examples/numeric --target wasm-gc
moon run examples/text-extract --target wasm-gc
moon run examples/document --target wasm-gcnpm ci --prefix tools/reference --ignore-scripts
npm test --prefix tools/referencelet document = processor.render_document(items, [
[@mooncite.Cite::new("a")],
[@mooncite.Cite::new("z")],
[@mooncite.Cite::new("a")],
]).unwrap()| 文件 | 职责 |
|---|---|
| xml.mbt、style.mbt | XML/样式解析、选项继承、宏验证 |
| model.mbt、item_json.mbt | 文献与引用数据模型、CSL-JSON |
| names_render.mbt、render.mbt | 姓名及节点渲染、文本/HTML |
| citation.mbt、ordering.mbt、disambiguation.mbt、document.mbt | 引用簇、范围折叠、排序编号、年后缀与无状态整篇输出 |
| compatibility.mbt | 有限样式契约与不支持能力诊断 |
| locale.mbt、advanced.mbt、features.mbt | 术语及扩展辅助 API |
| render_regression_test.mbt、reference_test.mbt | 回归测试与共享对照用例 |
pub struct Affix {
prefix : String
suffix : String
delimiter : String
text_case : String
font_style : String
font_weight : String
vertical_align : String
}pub enum Condition {
Variable(String)
Type(String)
Numeric(String)
IsUncertain(String)
IsPlural(String)
Position(String)
}pub struct DatePart {
name : String
form : String
prefix : String
suffix : String
range_delimiter : String
text_case : String
}pub(all) struct Item {
id : String
title : String
container_title : String
publisher : String
publisher_place : String
volume : String
issue : String
page : String
edition : String
url : String
doi : String
item_type : String
abstract_text : String
names : Map[String, Array[CslName]]
dates : Map[String, CslDate]
strings : Map[String, String]
numbers : Map[String, Int]
booleans : Map[String, Bool]
} derive(Debug)pub struct NameNode {
variable : String
form : String
and_word : String
delimiter : String
initialize_with : String
initialize : Bool
name_as_sort_order : String
delimiter_precedes_last : String
et_al_min : Int
et_al_use_first : Int
label_variable : String
options : Map[String, String]
name_affix : Affix
label : XmlElem?
substitute : Array[Node]
}pub struct NumberNode {
variable : String
form : String
prefix : String
suffix : String
delimiter : String
text_case : String
}pub struct SortKey {
variable : String
macro_name : String
names_min : Int
names_use_first : Int
sort_order : String
}pub struct Style {
title : String
version : String
default_locale : String
macros : Map[String, Array[Node]]
citation : Layout?
bibliography : Layout?
citation_sort : Array[SortKey]
bibliography_sort : Array[SortKey]
citation_disambiguate : Bool
citation_collapse : String
citation_delimiter : String
after_collapse_delimiter : String?
name_options : Map[String, String]
citation_name_options : Map[String, String]
bibliography_name_options : Map[String, String]
locale : Locale
}pub struct TextNode {
variable : String
value : String
macro_name : String
term : String
form : String
}fn normalize_page_range(value : String) -> StringInstall
Download zipCSL-style citation and bibliography rendering for MoonBit