aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/doc_reform/meta/metadoc_object_setter.d
blob: 29d527ba637a6da0c912d39c65c09d7252ae1241 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
/+
- Name: Spine, Doc Reform [a part of]
  - Description: documents, structuring, processing, publishing, search
    - static content generator

  - Author: Ralph Amissah
    [ralph.amissah@gmail.com]

  - Copyright: (C) 2015 - 2024 Ralph Amissah, All Rights Reserved.

  - License: AGPL 3 or later:

    Spine (SiSU), a framework for document structuring, publishing and
    search

    Copyright (C) Ralph Amissah

    This program is free software: you can redistribute it and/or modify it
    under the terms of the GNU AFERO General Public License as published by the
    Free Software Foundation, either version 3 of the License, or (at your
    option) any later version.

    This program is distributed in the hope that it will be useful, but WITHOUT
    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
    more details.

    You should have received a copy of the GNU General Public License along with
    this program. If not, see [https://www.gnu.org/licenses/].

    If you have Internet connection, the latest version of the AGPL should be
    available at these locations:
    [https://www.fsf.org/licensing/licenses/agpl.html]
    [https://www.gnu.org/licenses/agpl.html]

  - Spine (by Doc Reform, related to SiSU) uses standard:
    - docReform markup syntax
      - standard SiSU markup syntax with modified headers and minor modifications
    - docReform object numbering
      - standard SiSU object citation numbering & system

  - Homepages:
    [https://www.doc_reform.org]
    [https://www.sisudoc.org]

  - Git
    [https://git.sisudoc.org/projects/?p=software/spine.git;a=summary]

+/
/++
  object setter:
  setting of sisu objects for downstream processing
  metadoc_object_setter.d
+/
module doc_reform.meta.metadoc_object_setter;
template ObjectSetter() {
  /+ structs +/
  struct DocObj_TxtAttrib_ {
    int                    indent_base                         = 0;
    int                    indent_hang                         = 0;
    bool                   bullet                              = false;
    string                 language                            = "";
  }
  struct DocObj_Has_ {
    bool                   inline_links                        = false;
    bool                   inline_notes_reg                    = false;
    bool                   inline_notes_star                   = false;
    bool                   images                              = false;
    bool                   image_without_dimensions            = false;
  }
  struct DocObj_Table_ {
    int                    number_of_columns                   = 0;
    double[]               column_widths                       = [];
    string[]               column_aligns                       = [];
    bool                   heading                             = false;
    bool                   walls                               = false;
  }
  struct DocObj_CodeBlock_ {
    string                 syntax                              = "";
    bool                   linenumbers                         = false;
  }
  struct DocObj_Stow_ {
    string[]               link                               = [];
  }
  struct DocObj_Pointer_ {
    int                    doc_object                          = 0;
    int                    html_segnames                       = 0;
    int                    heading                             = 0;
  }
  struct DocObj_Tags_ {
    string[]               heading_ancestors_text              = [ "", "", "", "", "", "", "", "", ];
    string                 anchor_tag_html                     = "";
    string                 in_segment_html                     = "";
    string                 segment_anchor_tag_epub             = "";
    string                 html_segment_anchor_tag_is          = "";
    string                 epub_segment_anchor_tag_is          = "";
    string                 heading_lev_anchor_tag              = "";
    string                 segname_prev                        = "";
    string                 segname_next                        = "";
    string[]               lev4_subtoc                         = [];
    string[]               anchor_tags                         = [];
  }
  struct DocObj_MetaInfo_ {
    string                 is_of_part                           = ""; // frontmatter, body, backmatter
    string                 is_of_section                        = ""; // toc, body, glossary, biography, book index, blurb
    string                 is_of_type                           = ""; // para, block ?
    string                 is_a                                 = ""; // heading, para, table, code block, group, verse/poem ...
    alias                  of_part                              = is_of_part;
    alias                  of_section                           = is_of_section;
    alias                  is_of                                = is_of_type;
    string                 attrib                               = "";
    string                 lang                                 = ""; // blocks: group, block, quote; not codeblock;
    string                 syntax                               = ""; // codeblock only
    /+ o_n +/
    int                    o_n_substantive                      = 0;
    int                    o_n_non_substantive                  = 0;
    int                    o_n_glossary                         = 0;
    int                    o_n_bibliography                     = 0;
    int                    o_n_book_index                       = 0;
    int                    o_n_blurb                            = 0;
    @safe  string object_number_substantive() const @property {
      return (o_n_substantive == 0) ? "" : o_n_substantive.to!string;
    }
    @safe string object_number_non_substantive() const @property {
      return (o_n_non_substantive == 0) ? "" : o_n_non_substantive.to!string;
    }
    @safe string object_number_glossary() const @property {
      return (o_n_glossary == 0) ? "" : o_n_glossary.to!string;
    }
    @safe string object_number_bibliography() const @property {
      return (o_n_bibliography == 0) ? "" : o_n_bibliography.to!string;
    }
    @safe string object_number_book_index() const @property {
      return (o_n_book_index == 0) ? "" : o_n_book_index.to!string;
    }
    @safe string object_number_blurb() const @property {
      return (o_n_blurb == 0) ? "" : o_n_blurb.to!string;
    }
    @safe string marked_up_level() const @property {
      string _out;
      switch (heading_lev_markup) {
      case 0  : _out = "A"; break;
      case 1  : _out = "B"; break;
      case 2  : _out = "C"; break;
      case 3  : _out = "D"; break;
      case 4  : _out = "1"; break;
      case 5  : _out = "2"; break;
      case 6  : _out = "3"; break;
      case 7  : _out = "4"; break;
      default : _out = "";  break; // "9";
      }
      return _out;
    }
    @safe string object_number() const @property {
      return (ocn == 0) ? "" : ocn.to!string;
    }
    bool                   object_number_off                    = false;
    bool                   visible_object_number                = false;
    int                    object_number_type                   = 0; // { ocn, non, bkidx }
    /+ node +/
    string[string][string] node;
    int                    ocn                                  = 0;
    string                 identifier                           = "";
    int                    o_n_type                             = 0;
    int                    heading_lev_markup                   = 9;
    int                    heading_lev_collapsed                = 9;
    bool                   dummy_heading                        = false;
    int[]                  markedup_ancestors                   = [ 0, 0, 0, 0, 0, 0, 0, 0,];
    int[]                  collapsed_ancestors                  = [ 0, 0, 0, 0, 0, 0, 0, 0,];
    int[]                  dom_structure_markedup_tags_status   = [ 0, 0, 0, 0, 0, 0, 0, 0,];
    int[]                  dom_structure_collapsed_tags_status  = [ 0, 0, 0, 0, 0, 0, 0, 0,];
    int                    parent_lev_markup                    = 0;
    int                    parent_ocn                           = 0;
    int                    last_descendant_ocn                  = 0;
  }
  struct ObjGenericComposite {
    string                 text                                = "";
    DocObj_MetaInfo_       metainfo;
    DocObj_TxtAttrib_      attrib;
    DocObj_Tags_           tags;
    DocObj_Has_            has;
    DocObj_Table_          table;
    DocObj_CodeBlock_      code_block;
    DocObj_Stow_           stow;
    DocObj_Pointer_        ptr;
  }
  struct _theDoc {
    ObjGenericComposite[] toc;
    ObjGenericComposite[] head;
    ObjGenericComposite[] body;
    ObjGenericComposite[] bibliography;
    ObjGenericComposite[] glossary;
    ObjGenericComposite[] bookindex;
    ObjGenericComposite[] blurb;
    ObjGenericComposite[] endnotes;
  }
  struct TheObjects {
    ObjGenericComposite[] oca;
  }
  ObjGenericComposite comp_obj_, comp_obj_location, comp_obj_poem_ocn, comp_obj_comment;
  ObjGenericComposite[] the_document_toc_section, the_document_head_section, the_document_body_section, the_document_endnotes_section, the_document_bibliography_section, the_document_bookindex_section, the_document_glossary_section, the_document_blurb_section, the_document_xml_dom_tail_section;
  struct OCNset {
    int digit;
    int object_number;
    bool off;
    string identifier;
    int bkidx;
    int type;
  }
  struct ST_endnotes {
    ObjGenericComposite[] endnotes;
    OCNset                ocn;
  }
  struct ST_bookindex {
    ObjGenericComposite[] bookindex;
    OCNset                ocn;
  }
  struct ST_biblio_section {
    ObjGenericComposite[]  bibliography_section;
    string[string][string] tag_assoc;
  }
  struct ST_ancestors {
    ObjGenericComposite[] the_document_body_section;
    ObjGenericComposite[] the_document_endnotes_section;
    ObjGenericComposite[] the_document_glossary_section;
    ObjGenericComposite[] the_document_bibliography_section;
    ObjGenericComposite[] the_document_bookindex_section;
    ObjGenericComposite[] the_document_blurb_section;
  }
  struct ST_segnames {
    string[][string]      segnames;
    int                   html_segnames_ptr_cntr;
    int                   html_segnames_ptr;
  }
  struct  ST_txtPlusHasFootnotes {
    string           obj_txt;
    bool             has_notes_reg;
    bool             has_notes_star;
    bool             has_notes_plus;
  }
  struct ST_txtPlusHasFootnotesUrlsImages {
    string           obj_txt;
    bool             has_notes_reg;
    bool             has_notes_star;
    bool             has_notes_plus;
    bool             has_urls;
    bool             has_images_without_dimensions;
  }
  struct ST_txtAndAnchorTagPlusHasFootnotesUrlsImages {
    string           obj_txt;
    string           anchor_tag;
    bool             has_notes_reg;
    bool             has_notes_star;
    bool             has_notes_plus;
    bool             has_links; // use same name
    bool             has_images_without_dimensions;
  }
  struct ST_the_section {
    ObjGenericComposite[]  comp_section_obj; // array: the heading has 2 members inserted, paras just 1
    uint[string]           pith;
    string[string][string] tag_assoc;        // only for headings: html & epub
  }
  // book index variables
  string book_idx_tmp;
  string[][string][string] bookindex_unordered_hashes;
  // node
  struct ST_txt_by_line_common_reset {
    int[string]     line_occur;
    string[string]  this_object;
    uint[string]    pith;
  }
  struct ST_txt_by_line_block_start {
    uint[string]    pith;
    uint[string]    dochas;
    string[string]  object_number_poem;
  }
  struct ST_txt_by_line_block_generic {
    uint[string]    pith;
    string[string]  this_object;
  }
  struct ST_txt_by_line_block_poem {
    int             cntr;
    uint[string]    pith;
    string[string]  this_object;
  }
  struct ST_txt_by_line_block_biblio {
    uint[string]    pith;
    int             bib_entry;
    string          biblio_entry_str_json;
    string[]        biblio_arr_json;
  }
  struct ST_flow_book_index {
    string[string]  this_object;
    uint[string]    pith;
    string          book_idx_tmp;
  }
  struct ST_flow_heading_found {
    string[string]       heading_match_str;
    Regex!(char)[string] heading_match_rgx;
    uint[string]         pith;
  }
  struct ST_flow_heading_make_set {
    char[]          line;
    uint[string]    pith;
    string[string]  this_object;
  }
  struct ST_flow_para_match {
    uint[string]    pith;
    string[string]  this_object;
    string          this_object_key;
    int[string]     indent;
    bool            bullet;
    int[string]     line_occur;
  }
  struct ST_flow_table_array_munge {
    ObjGenericComposite table_object;
    string[][]          table_array;
  }
  struct ST_flow_table_of_contents_gather_headings {
    ObjGenericComposite[] the_document_toc_section;
    string[][string]      lev4_subtoc;
  }
  struct ST_flow_bibliography {
    JSONValue[] biblio_sorted;
    JSONValue[] bib_arr_json;
    string[]    biblio_unsorted_incomplete;
  }
  struct ST_flow_table_closed_make_special_notation_table {
    string[string]        this_object;
    ObjGenericComposite[] the_document_body_section;
    OCNset                obj_cite_digits;
    ObjGenericComposite   comp_obj_;
    int                   cntr;
    uint[string]          pith;
  }
  struct ST_flow_block_flag_line_empty {
    string[string]           this_object;
    ObjGenericComposite[]    the_document_body_section;
    string[][string][string] bookindex_unordered_hashes;
    OCNset                   obj_cite_digits;
    ObjGenericComposite      comp_obj_;
    int                      cntr;
    uint[string]             pith;
  }
  struct ST_flow_table_substantive_munge {
    ObjGenericComposite  table_object;
    string               table_substantive;
  }
  struct _loopMarkupSrcByLineStruct {
    ObjGenericComposite[] toc;
    ObjGenericComposite[] body;
    ObjGenericComposite[] glossary;
    ObjGenericComposite[] blurb;
    string[string]        object_notes;
    string[][string]      segnames;
  }
  enum DocStructMarkupHeading {
    h_sect_A,
    h_sect_B,
    h_sect_C,
    h_sect_D,
    h_text_1,
    h_text_2,
    h_text_3,
    h_text_4,
    h_text_5, // extra level, drop
    content_non_header
  } // header section A-D; header text 1-4
  enum Status { off, on, }
  enum OCNtype { ocn, non, bkidx, }
  enum DomTags { none, open, close, close_and_open, open_still, }
  enum Substitute { match, markup, }
  @safe static auto eN() {
    struct _e {
      enum bi {
        off,
        on,
      }
      enum ocn {
        off,
        on,
        closing,
        bkidx,
        reset,
      }
      enum sect {
        unset,
        head,
        toc,
        substantive,
        bibliography,
        glossary,
        book_index,
        blurb,
      }
      enum txt_is {
        off,
        para,
        heading,
      }
      enum blk_is {
        off,
        code,
        poem,
        block,
        group,
        table,
        quote,
      }
      enum blk_state {
        off,
        on,
        closing,
      }
      enum blk_delim {
        off,
        curly,
        tic,
        curly_special,
        tic_special,
      }
    }
    return _e();
  }
}