code wiki / (root) / nx_cite.nx

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}