Skip to content

Commit e826b23

Browse files
committed
bump citationberg to fix page in number
1 parent a9d855b commit e826b23

File tree

7 files changed

+280
-22
lines changed

7 files changed

+280
-22
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ archive = ["ciborium"]
1717
csl-json = ["citationberg/json"]
1818

1919
[dependencies]
20-
citationberg = "0.5.0"
20+
citationberg = { git = "https://github.com/typst/citationberg.git", rev = "67db988c7155f17b2e0aff9aabcd9a00745e4c04" }
2121
indexmap = { version = "2.0.2", features = ["serde"] }
2222
numerals = "0.1.4"
2323
paste = "1.0.14"

src/csl/mod.rs

+17-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use std::num::{NonZeroI16, NonZeroUsize};
88
use std::{mem, vec};
99

1010
use citationberg::taxonomy::{
11-
DateVariable, Locator, NameVariable, NumberVariable, OtherTerm, PageVariable,
12-
StandardVariable, Term, Variable,
11+
DateVariable, Locator, NameVariable, NumberOrPageVariable, NumberVariable, OtherTerm,
12+
PageVariable, StandardVariable, Term, Variable,
1313
};
1414
use citationberg::{
1515
taxonomy as csl_taxonomy, Affixes, BaseLanguage, Citation, CitationFormat, Collapse,
@@ -23,6 +23,7 @@ use indexmap::IndexSet;
2323
use crate::csl::elem::{simplify_children, NonEmptyStack};
2424
use crate::csl::rendering::names::NameDisambiguationProperties;
2525
use crate::csl::rendering::RenderCsl;
26+
use crate::csl::taxonomy::NumberOrPageVariableResult;
2627
use crate::lang::CaseFolder;
2728
use crate::types::{ChunkKind, ChunkedString, Date, MaybeTyped, Person};
2829

@@ -2641,6 +2642,20 @@ impl<'a, T: EntryLike> Context<'a, T> {
26412642
self.instance.resolve_page_variable(variable)
26422643
}
26432644

2645+
fn resolve_number_or_page_variable(
2646+
&self,
2647+
variable: NumberOrPageVariable,
2648+
) -> Option<NumberOrPageVariableResult<'a>> {
2649+
match variable {
2650+
NumberOrPageVariable::Page(p) => {
2651+
self.resolve_page_variable(p).map(NumberOrPageVariableResult::Page)
2652+
}
2653+
NumberOrPageVariable::Number(n) => self
2654+
.resolve_number_variable(n)
2655+
.map(NumberOrPageVariableResult::Number),
2656+
}
2657+
}
2658+
26442659
/// Resolve a name variable.
26452660
///
26462661
/// Honors suppressions.

src/csl/rendering/mod.rs

+53-19
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use crate::lang::{Case, SentenceCase, TitleCase};
1919
use crate::types::{ChunkedString, Date, MaybeTyped, Numeric};
2020
use crate::PageRanges;
2121

22-
use super::taxonomy::EntryLike;
22+
use super::taxonomy::{EntryLike, NumberOrPageVariableResult};
2323
use super::{write_year, Context, ElemMeta, IbidState, SpecialForm, UsageInfo};
2424

2525
pub mod names;
@@ -278,11 +278,20 @@ impl RenderCsl for citationberg::Number {
278278
return;
279279
}
280280

281-
let value = ctx.resolve_number_variable(self.variable);
281+
let value = ctx.resolve_number_or_page_variable(self.variable);
282282
if ctx.instance.sorting {
283-
if let Some(NumberVariableResult::Regular(MaybeTyped::Typed(n))) = value {
284-
n.fmt_value(ctx, true).unwrap();
285-
return;
283+
match value {
284+
Some(NumberOrPageVariableResult::Number(
285+
NumberVariableResult::Regular(MaybeTyped::Typed(n)),
286+
)) => {
287+
n.fmt_value(ctx, true).unwrap();
288+
return;
289+
}
290+
Some(NumberOrPageVariableResult::Page(MaybeTyped::Typed(p))) => {
291+
write!(ctx, "{p}").unwrap();
292+
return;
293+
}
294+
_ => {}
286295
}
287296
}
288297

@@ -292,18 +301,32 @@ impl RenderCsl for citationberg::Number {
292301
let gender = ctx.gender(self.variable.into());
293302

294303
match value {
295-
Some(NumberVariableResult::Regular(MaybeTyped::Typed(num)))
296-
if num.will_transform() =>
297-
{
304+
Some(NumberOrPageVariableResult::Number(NumberVariableResult::Regular(
305+
MaybeTyped::Typed(num),
306+
))) if num.will_transform() => {
298307
render_typed_num(num.as_ref(), self.form, gender, ctx);
299308
}
300-
Some(NumberVariableResult::Regular(MaybeTyped::Typed(num))) => {
301-
write!(ctx, "{}", num).unwrap()
309+
310+
Some(NumberOrPageVariableResult::Number(NumberVariableResult::Regular(
311+
MaybeTyped::Typed(num),
312+
))) => write!(ctx, "{}", num).unwrap(),
313+
314+
Some(NumberOrPageVariableResult::Number(NumberVariableResult::Regular(
315+
MaybeTyped::String(s),
316+
))) => ctx.push_str(&s),
317+
318+
Some(NumberOrPageVariableResult::Number(
319+
NumberVariableResult::Transparent(n),
320+
)) => ctx.push_transparent(n),
321+
322+
Some(NumberOrPageVariableResult::Page(MaybeTyped::Typed(p))) => {
323+
render_page_range(&p, ctx)
302324
}
303-
Some(NumberVariableResult::Regular(MaybeTyped::String(s))) => {
325+
326+
Some(NumberOrPageVariableResult::Page(MaybeTyped::String(s))) => {
304327
ctx.push_str(&s)
305328
}
306-
Some(NumberVariableResult::Transparent(n)) => ctx.push_transparent(n),
329+
307330
None => {}
308331
}
309332

@@ -312,25 +335,36 @@ impl RenderCsl for citationberg::Number {
312335
ctx.commit_elem(
313336
depth,
314337
self.display,
315-
(self.variable == NumberVariable::CitationNumber)
316-
.then_some(ElemMeta::CitationNumber)
317-
.or(Some(ElemMeta::Number)),
338+
Some(
339+
if self.variable
340+
== NumberOrPageVariable::Number(NumberVariable::CitationNumber)
341+
{
342+
ElemMeta::CitationNumber
343+
} else {
344+
ElemMeta::Number
345+
},
346+
),
318347
);
319348
}
320349

321350
fn will_render<T: EntryLike>(&self, ctx: &mut Context<T>, var: Variable) -> bool {
322351
match ctx.instance.kind {
323-
Some(SpecialForm::VarOnly(Variable::Number(n))) if self.variable != n => {
352+
Some(SpecialForm::VarOnly(Variable::Number(n)))
353+
if self.variable != NumberOrPageVariable::Number(n) =>
354+
{
324355
return false
325356
}
326357
Some(SpecialForm::OnlyFirstDate | SpecialForm::OnlyYearSuffix) => {
327-
return self.variable == NumberVariable::Locator
358+
return matches!(
359+
self.variable,
360+
NumberOrPageVariable::Number(NumberVariable::Locator)
361+
)
328362
}
329363
Some(SpecialForm::VarOnly(_)) => return false,
330364
_ => {}
331365
}
332366

333-
var == Variable::Number(self.variable)
367+
var == Variable::from(self.variable)
334368
}
335369

336370
fn will_have_info<T: EntryLike>(&self, ctx: &mut Context<T>) -> (bool, UsageInfo) {
@@ -339,7 +373,7 @@ impl RenderCsl for citationberg::Number {
339373
// silent lookup, otherwise we need to perform a regular lookup.
340374
let suppressing = ctx.writing.suppress_queried_variables;
341375
ctx.writing.stop_suppressing_queried_variables();
342-
let lookup_result = ctx.resolve_number_variable(self.variable);
376+
let lookup_result = ctx.resolve_number_or_page_variable(self.variable);
343377

344378
if suppressing {
345379
ctx.writing.start_suppressing_queried_variables();

src/csl/taxonomy.rs

+5
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,11 @@ pub(super) enum NumberVariableResult<'a> {
111111

112112
pub(super) type PageVariableResult = MaybeTyped<PageRanges>;
113113

114+
pub(super) enum NumberOrPageVariableResult<'a> {
115+
Number(NumberVariableResult<'a>),
116+
Page(PageVariableResult),
117+
}
118+
114119
impl<'a> NumberVariableResult<'a> {
115120
pub(super) fn from_regular(regular: MaybeTyped<Cow<'a, Numeric>>) -> Self {
116121
Self::Regular(regular)

tests/local/page_NumberPage.txt

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
>>===== MODE =====>>
2+
citation
3+
<<===== MODE =====<<
4+
5+
6+
7+
>>===== RESULT =====>>
8+
22–45
9+
<<===== RESULT =====<<
10+
11+
12+
>>===== CSL =====>>
13+
<style
14+
xmlns="http://purl.org/net/xbiblio/csl"
15+
class="note"
16+
version="1.0">
17+
<info>
18+
<id />
19+
<title />
20+
<updated>2009-08-10T04:49:00+09:00</updated>
21+
</info>
22+
<citation>
23+
<layout>
24+
<number variable="page"/>
25+
</layout>
26+
</citation>
27+
</style>
28+
<<===== CSL =====<<
29+
30+
31+
>>===== INPUT =====>>
32+
[
33+
{
34+
"id": "ITEM-1",
35+
"page": "22-45",
36+
"title": "His Anonymous Life",
37+
"type": "book"
38+
}
39+
]
40+
<<===== INPUT =====<<
41+
42+
43+
>>===== VERSION =====>>
44+
1.0
45+
<<===== VERSION =====<<
+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
>>===== MODE =====>>
2+
citation
3+
<<===== MODE =====<<
4+
5+
6+
7+
>>===== RESULT =====>>
8+
22–45; 3; 33; 450, 60–30 & 8; 46; 5
9+
<<===== RESULT =====<<
10+
11+
12+
>>===== CSL =====>>
13+
<style
14+
xmlns="http://purl.org/net/xbiblio/csl"
15+
class="note"
16+
version="1.0">
17+
<info>
18+
<id />
19+
<title />
20+
<updated>2009-08-10T04:49:00+09:00</updated>
21+
</info>
22+
<macro name="page-num">
23+
<number variable="page"/>
24+
</macro>
25+
<citation>
26+
<sort>
27+
<key macro="page-num" />
28+
</sort>
29+
<layout delimiter="; ">
30+
<number variable="page"/>
31+
</layout>
32+
</citation>
33+
</style>
34+
<<===== CSL =====<<
35+
36+
37+
>>===== INPUT =====>>
38+
[
39+
{
40+
"id": "ITEM-1",
41+
"page": "3",
42+
"title": "A",
43+
"type": "book"
44+
},
45+
{
46+
"id": "ITEM-2",
47+
"page": "5",
48+
"title": "B",
49+
"type": "book"
50+
},
51+
{
52+
"id": "ITEM-3",
53+
"page": "22-45",
54+
"title": "C",
55+
"type": "book"
56+
},
57+
{
58+
"id": "ITEM-4",
59+
"page": "33",
60+
"title": "D",
61+
"type": "book"
62+
},
63+
{
64+
"id": "ITEM-5",
65+
"page": "46",
66+
"title": "E",
67+
"type": "book"
68+
},
69+
{
70+
"id": "ITEM-6",
71+
"page": "450, 60-30 & 8",
72+
"title": "F",
73+
"type": "book"
74+
}
75+
]
76+
<<===== INPUT =====<<
77+
78+
79+
>>===== VERSION =====>>
80+
1.0
81+
<<===== VERSION =====<<

tests/local/page_NumberPageSort.txt

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
>>===== MODE =====>>
2+
citation
3+
<<===== MODE =====<<
4+
5+
6+
7+
>>===== RESULT =====>>
8+
3; 5; 33; 46; 450, 60–30 & 8; 22–45
9+
<<===== RESULT =====<<
10+
11+
12+
>>===== CSL =====>>
13+
<style
14+
xmlns="http://purl.org/net/xbiblio/csl"
15+
class="note"
16+
version="1.0">
17+
<info>
18+
<id />
19+
<title />
20+
<updated>2009-08-10T04:49:00+09:00</updated>
21+
</info>
22+
<citation>
23+
<sort>
24+
<key variable="page" />
25+
</sort>
26+
<layout delimiter="; ">
27+
<number variable="page"/>
28+
</layout>
29+
</citation>
30+
</style>
31+
<<===== CSL =====<<
32+
33+
34+
>>===== INPUT =====>>
35+
[
36+
{
37+
"id": "ITEM-1",
38+
"page": "3",
39+
"title": "A",
40+
"type": "book"
41+
},
42+
{
43+
"id": "ITEM-2",
44+
"page": "5",
45+
"title": "B",
46+
"type": "book"
47+
},
48+
{
49+
"id": "ITEM-3",
50+
"page": "22-45",
51+
"title": "C",
52+
"type": "book"
53+
},
54+
{
55+
"id": "ITEM-4",
56+
"page": "33",
57+
"title": "D",
58+
"type": "book"
59+
},
60+
{
61+
"id": "ITEM-5",
62+
"page": "46",
63+
"title": "E",
64+
"type": "book"
65+
},
66+
{
67+
"id": "ITEM-6",
68+
"page": "450, 60-30 & 8",
69+
"title": "F",
70+
"type": "book"
71+
}
72+
]
73+
<<===== INPUT =====<<
74+
75+
76+
>>===== VERSION =====>>
77+
1.0
78+
<<===== VERSION =====<<

0 commit comments

Comments
 (0)