Skip to content

Commit 1d7ab83

Browse files
Merge pull request #99 from Entrolution/fix/align-numbering-style-with-spec
Align NumberingStyle with spec resetTrigger and style changes
2 parents 888be7e + ceda294 commit 1d7ab83

3 files changed

Lines changed: 46 additions & 7 deletions

File tree

cdx-core/src/extensions/academic.rs

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -985,6 +985,44 @@ impl TheoremRef {
985985
// Numbering Configuration
986986
// ============================================================================
987987

988+
/// When to reset counters. Uses heading level identifiers
989+
/// corresponding to the core heading block's level attribute.
990+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
991+
#[serde(rename_all = "camelCase")]
992+
pub enum ResetTrigger {
993+
/// Reset at heading level 1.
994+
Heading1,
995+
/// Reset at heading level 2.
996+
Heading2,
997+
/// Reset at heading level 3.
998+
Heading3,
999+
/// Reset at heading level 4.
1000+
Heading4,
1001+
/// Reset at heading level 5.
1002+
Heading5,
1003+
/// Reset at heading level 6.
1004+
Heading6,
1005+
/// Never reset.
1006+
None,
1007+
}
1008+
1009+
/// Numbering style pattern.
1010+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
1011+
pub enum NumberingStylePattern {
1012+
/// Sequential numbering (e.g., 1, 2, 3).
1013+
#[serde(rename = "number")]
1014+
Number,
1015+
/// Chapter-scoped numbering (e.g., 2.1, 2.2).
1016+
#[serde(rename = "chapter.number")]
1017+
ChapterNumber,
1018+
/// Section-scoped numbering (e.g., 3.1, 3.2).
1019+
#[serde(rename = "section.number")]
1020+
SectionNumber,
1021+
/// Chapter-and-section-scoped numbering (e.g., 2.3.1).
1022+
#[serde(rename = "chapter.section.number")]
1023+
ChapterSectionNumber,
1024+
}
1025+
9881026
/// Numbering configuration for academic content.
9891027
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
9901028
#[serde(rename_all = "camelCase")]
@@ -1014,12 +1052,13 @@ pub struct NumberingConfig {
10141052
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
10151053
#[serde(rename_all = "camelCase")]
10161054
pub struct NumberingStyle {
1017-
/// Format string (e.g., "{chapter}.{number}").
1018-
pub format: String,
1055+
/// Numbering style pattern.
1056+
#[serde(default, skip_serializing_if = "Option::is_none", alias = "format")]
1057+
pub style: Option<NumberingStylePattern>,
10191058

1020-
/// Whether to reset numbering per chapter.
1021-
#[serde(default)]
1022-
pub reset_per_chapter: bool,
1059+
/// When to reset counters.
1060+
#[serde(default, skip_serializing_if = "Option::is_none")]
1061+
pub reset_on: Option<ResetTrigger>,
10231062

10241063
/// Starting number.
10251064
#[serde(default = "default_start")]

docs/extension-guide.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ Structured content types for academic writing:
248248
- **Exercises** (`Exercise`, `ExerciseSet`): With difficulty levels and optional hints/solutions.
249249
- **Algorithms** (`Algorithm`): Pseudocode with parameters.
250250
- **Abstracts** (`Abstract`): Structured abstracts with sections (Background, Objectives, Methods, Results, Conclusions).
251-
- **Numbering** (`NumberingConfig`): Configurable numbering schemes (Sequential, BySection, ByChapter).
251+
- **Numbering** (`NumberingConfig`): Configurable numbering with style patterns (`number`, `chapter.number`, `section.number`, `chapter.section.number`) and heading-level reset triggers.
252252

253253
### Legal
254254

0 commit comments

Comments
 (0)