nx_cite.nx source
↩ module page · 136 lines · 6328 B
1// nx_cite.nx -- WRITING arc, rung W-CITE-1: the CITATION manager (papers cluster).
2// Operator intent: "write research papers". nx_paper_gen already compiles cited
3// papers from measured work; this organ formats a REFERENCE record into the four
4// styles a human author needs: APA 7 / MLA 9 / Chicago (notes-biblio) / IEEE.
5//
6// The reference is a key:value record (operator/lane DATA, the seam) parsed by
7// REUSING nx_scenario's field parser (DRY). v1 scope = a single-author JOURNAL
8// ARTICLE with PRE-SPLIT author name (author_last + author_first) so name parsing
9// is unambiguous. HONEST LIMITS (later rungs): multi-author lists, books/web,
10// and per-style title-case normalization -- this organ does STRUCTURE (order,
11// punctuation, italic markers), not orthography (titles are emitted verbatim).
12//
13// author_last / author_first / year / title / journal / volume / issue / pages
14//
15// Pure integer, NO syscalls. license_tier: ORIGINAL
16// module: nishi-core.write.cite
17// depends: nishi-core.write.scenario
18// capability: WRITE_CITATION
19import "nx_scenario.nx"
20
21const CITE_APA: i64 = 0
22const CITE_MLA: i64 = 1
23const CITE_CHICAGO: i64 = 2
24const CITE_IEEE: i64 = 3
25
26// append the author's first initial + '.' (e.g. "J.")
27func ct_app_initial(buf: *u8, n: i64, out: *u8, p: i64, cap: i64) -> i64 {
28 let off: i64 = sc_find_field(buf, n, "author_first\x00" as *u8)
29 var q: i64 = p
30 if off >= 0 {
31 let len: i64 = sc_value_len(buf, n, off)
32 if len > 0 { if q < cap - 1 { out[q] = buf[off]; q = q + 1 } }
33 }
34 if q < cap - 1 { out[q] = 46 as u8; q = q + 1 } // '.'
35 return q
36}
37
38// APA 7: Last, F. (Year). Title. Journal, Vol(Issue), pages.
39func ct_apa(buf: *u8, n: i64, out: *u8, cap: i64) -> i64 {
40 var p: i64 = 0
41 p = sc_app_field(buf, n, "author_last\x00" as *u8, out, p, cap)
42 p = sc_app_lit(out, p, cap, ", \x00" as *u8)
43 p = ct_app_initial(buf, n, out, p, cap)
44 p = sc_app_lit(out, p, cap, " (\x00" as *u8)
45 p = sc_app_field(buf, n, "year\x00" as *u8, out, p, cap)
46 p = sc_app_lit(out, p, cap, "). \x00" as *u8)
47 p = sc_app_field(buf, n, "title\x00" as *u8, out, p, cap)
48 p = sc_app_lit(out, p, cap, ". \x00" as *u8)
49 p = sc_app_field(buf, n, "journal\x00" as *u8, out, p, cap)
50 p = sc_app_lit(out, p, cap, ", \x00" as *u8)
51 p = sc_app_field(buf, n, "volume\x00" as *u8, out, p, cap)
52 p = sc_app_lit(out, p, cap, "(\x00" as *u8)
53 p = sc_app_field(buf, n, "issue\x00" as *u8, out, p, cap)
54 p = sc_app_lit(out, p, cap, "), \x00" as *u8)
55 p = sc_app_field(buf, n, "pages\x00" as *u8, out, p, cap)
56 p = sc_app_lit(out, p, cap, ".\x00" as *u8)
57 out[p] = 0 as u8
58 return p
59}
60
61// MLA 9: Last, First. "Title." Journal, vol. V, no. I, Year, pp. pages.
62func ct_mla(buf: *u8, n: i64, out: *u8, cap: i64) -> i64 {
63 var p: i64 = 0
64 p = sc_app_field(buf, n, "author_last\x00" as *u8, out, p, cap)
65 p = sc_app_lit(out, p, cap, ", \x00" as *u8)
66 p = sc_app_field(buf, n, "author_first\x00" as *u8, out, p, cap)
67 p = sc_app_lit(out, p, cap, ". \x22\x00" as *u8)
68 p = sc_app_field(buf, n, "title\x00" as *u8, out, p, cap)
69 p = sc_app_lit(out, p, cap, ".\x22 \x00" as *u8)
70 p = sc_app_field(buf, n, "journal\x00" as *u8, out, p, cap)
71 p = sc_app_lit(out, p, cap, ", vol. \x00" as *u8)
72 p = sc_app_field(buf, n, "volume\x00" as *u8, out, p, cap)
73 p = sc_app_lit(out, p, cap, ", no. \x00" as *u8)
74 p = sc_app_field(buf, n, "issue\x00" as *u8, out, p, cap)
75 p = sc_app_lit(out, p, cap, ", \x00" as *u8)
76 p = sc_app_field(buf, n, "year\x00" as *u8, out, p, cap)
77 p = sc_app_lit(out, p, cap, ", pp. \x00" as *u8)
78 p = sc_app_field(buf, n, "pages\x00" as *u8, out, p, cap)
79 p = sc_app_lit(out, p, cap, ".\x00" as *u8)
80 out[p] = 0 as u8
81 return p
82}
83
84// Chicago (notes-biblio): Last, First. "Title." Journal V, no. I (Year): pages.
85func ct_chicago(buf: *u8, n: i64, out: *u8, cap: i64) -> i64 {
86 var p: i64 = 0
87 p = sc_app_field(buf, n, "author_last\x00" as *u8, out, p, cap)
88 p = sc_app_lit(out, p, cap, ", \x00" as *u8)
89 p = sc_app_field(buf, n, "author_first\x00" as *u8, out, p, cap)
90 p = sc_app_lit(out, p, cap, ". \x22\x00" as *u8)
91 p = sc_app_field(buf, n, "title\x00" as *u8, out, p, cap)
92 p = sc_app_lit(out, p, cap, ".\x22 \x00" as *u8)
93 p = sc_app_field(buf, n, "journal\x00" as *u8, out, p, cap)
94 p = sc_app_lit(out, p, cap, " \x00" as *u8)
95 p = sc_app_field(buf, n, "volume\x00" as *u8, out, p, cap)
96 p = sc_app_lit(out, p, cap, ", no. \x00" as *u8)
97 p = sc_app_field(buf, n, "issue\x00" as *u8, out, p, cap)
98 p = sc_app_lit(out, p, cap, " (\x00" as *u8)
99 p = sc_app_field(buf, n, "year\x00" as *u8, out, p, cap)
100 p = sc_app_lit(out, p, cap, "): \x00" as *u8)
101 p = sc_app_field(buf, n, "pages\x00" as *u8, out, p, cap)
102 p = sc_app_lit(out, p, cap, ".\x00" as *u8)
103 out[p] = 0 as u8
104 return p
105}
106
107// IEEE: F. Last, "Title," Journal, vol. V, no. I, pp. pages, Year.
108func ct_ieee(buf: *u8, n: i64, out: *u8, cap: i64) -> i64 {
109 var p: i64 = 0
110 p = ct_app_initial(buf, n, out, p, cap)
111 p = sc_app_lit(out, p, cap, " \x00" as *u8)
112 p = sc_app_field(buf, n, "author_last\x00" as *u8, out, p, cap)
113 p = sc_app_lit(out, p, cap, ", \x22\x00" as *u8)
114 p = sc_app_field(buf, n, "title\x00" as *u8, out, p, cap)
115 p = sc_app_lit(out, p, cap, ",\x22 \x00" as *u8)
116 p = sc_app_field(buf, n, "journal\x00" as *u8, out, p, cap)
117 p = sc_app_lit(out, p, cap, ", vol. \x00" as *u8)
118 p = sc_app_field(buf, n, "volume\x00" as *u8, out, p, cap)
119 p = sc_app_lit(out, p, cap, ", no. \x00" as *u8)
120 p = sc_app_field(buf, n, "issue\x00" as *u8, out, p, cap)
121 p = sc_app_lit(out, p, cap, ", pp. \x00" as *u8)
122 p = sc_app_field(buf, n, "pages\x00" as *u8, out, p, cap)
123 p = sc_app_lit(out, p, cap, ", \x00" as *u8)
124 p = sc_app_field(buf, n, "year\x00" as *u8, out, p, cap)
125 p = sc_app_lit(out, p, cap, ".\x00" as *u8)
126 out[p] = 0 as u8
127 return p
128}
129
130// dispatch by style
131func ct_format(buf: *u8, n: i64, style: i64, out: *u8, cap: i64) -> i64 {
132 if style == CITE_APA { return ct_apa(buf, n, out, cap) }
133 if style == CITE_MLA { return ct_mla(buf, n, out, cap) }
134 if style == CITE_CHICAGO { return ct_chicago(buf, n, out, cap) }
135 return ct_ieee(buf, n, out, cap)
136}