/+ ao_read_source_files.d - open markup files - if master file scan for addional files to import/insert +/ // module ao_read_source_files; template SiSUmarkupRaw() { private import std.exception, std.regex, std.stdio, std.utf, std.conv : to; private import ao_rgx; // ao_defaults.d mixin RgxInit; auto rgx = Rgx(); struct MarkupRaw { final char[][] sourceContent(in string fn_src) { auto raw = MarkupRawUnit(); auto sourcefile_content = raw.markupSourceContentRawLineArray(fn_src, rgx.src_pth); if (match(fn_src, rgx.src_fn_master)) { auto ins = Inserts(); sourcefile_content = ins.scan_master_doc_source_for_insert_filenames(sourcefile_content, fn_src); // auto ins = SiSUdocInserts.Inserts(); } return sourcefile_content; } } private struct MarkupRawUnit { private import std.file; final private string readInMarkupSource(in string fn_src) { enforce( exists(fn_src)!=0, "file not found" ); string source_txt_str; try { if (exists(fn_src)) { source_txt_str = readText(fn_src); } } catch (ErrnoException ex) { //// Handle errors // switch(ex.errno) { // case EPERM: // case EACCES: // // Permission denied // break; // case ENOENT: // // File does not exist // break; // default: // // Handle other errors // break; // } } catch (UTFException ex) { // Handle validation errors } catch (FileException ex) { // Handle errors } std.utf.validate(source_txt_str); return source_txt_str; } final private char[][] markupSourceLineArray(in string src_text) { char[][] source_line_arr = split(cast(char[]) src_text, rgx.line_delimiter); return source_line_arr; } final char[][] markupSourceContentRawLineArray(in string fn_src, Regex!(char) rgx_file ) { enforce( match(fn_src, rgx_file), "not a sisu markup filename" ); auto source_txt_str = readInMarkupSource(fn_src); auto source_line_arr = markupSourceLineArray(source_txt_str); return source_line_arr; } } struct Inserts { private import ao_defaults; // ao_defaults.d private import ao_ansi_colors; // ao_ansi_colors.d auto scan_subdoc_source( char[][] markup_sourcefile_insert_content, string fn_src ) { mixin SiSUrgxInitFlags; char[][] contents_insert; auto type1 = flags_type_init; mixin ScreenTxtColors; int tell_l(string color, in char[] line) { writeln(scr_txt_marker[color], line); return 0; } auto fn_pth_full = match(fn_src, rgx.src_pth); auto markup_src_file_path = fn_pth_full.captures[1]; foreach (line; markup_sourcefile_insert_content) { if (type1["curly_code"] == 1) { type1["header_make"] = 0; type1["header_metadata"] = 0; if (matchFirst(line, rgx.block_curly_code_close)) { type1["curly_code"] = 0; } contents_insert ~= line; } else if (matchFirst(line, rgx.block_curly_code_open)) { type1["curly_code"] = 1; type1["header_make"] = 0; type1["header_metadata"] = 0; contents_insert ~= line; } else if (type1["tic_code"] == 1) { type1["header_make"] = 0; type1["header_metadata"] = 0; if (matchFirst(line, rgx.block_tic_close)) { type1["tic_code"] = 0; } contents_insert ~= line; } else if (matchFirst(line, rgx.block_tic_code_open)) { type1["tic_code"] = 1; type1["header_make"] = 0; type1["header_metadata"] = 0; contents_insert ~= line; } else if ( (type1["header_make"] == 1) && matchFirst(line, rgx.header_sub) ) { type1["header_make"] = 1; type1["header_metadata"] = 0; // cont_dynamic_array ~= "% " ~ line; } else if ( (type1["header_metadata"] == 1) && matchFirst(line, rgx.header_sub) ) { type1["header_metadata"] = 1; type1["header_make"] = 0; // cont_dynamic_array ~= "% " ~ line; } else if (auto m = match(line, rgx.insert_src_fn_ssi_or_sst)) { type1["header_make"] = 0; type1["header_metadata"] = 0; auto insert_fn = m.captures[2]; auto insert_sub_pth = m.captures[1]; auto fn_src_insert = to!string(markup_src_file_path ~ insert_sub_pth ~ insert_fn); auto raw = MarkupRawUnit(); auto markup_sourcesubfile_insert_content = raw.markupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts); debug(insert) { // insert file tell_l("red", line); tell_l("red", fn_src_insert); tell_l("fuchsia", "ERROR"); writeln( " length contents insert array: ", markup_sourcesubfile_insert_content.length ); } auto ins = Inserts(); /+ 1. load file, 2. read lines; 3. scan lines, 4. if filename insert, and insert filename 5. repeat 1 6. else 7. add line to new array; +/ } else { type1["header_make"] = 0; type1["header_metadata"] = 0; contents_insert ~= line; } } // end src subdoc (inserts) loop return contents_insert; } auto scan_master_doc_source_for_insert_filenames( char[][] sourcefile_content, string fn_src ) { mixin SiSUrgxInitFlags; char[][] contents; auto type = flags_type_init; mixin ScreenTxtColors; int tell_l(string color, in char[] line) { writeln(scr_txt_marker[color], line); return 0; } auto fn_pth_full = match(fn_src, rgx.src_pth); auto markup_src_file_path = fn_pth_full.captures[1]; foreach (line; sourcefile_content) { if (type["curly_code"] == 1) { type["header_make"] = 0; type["header_metadata"] = 0; if (matchFirst(line, rgx.block_curly_code_close)) { type["curly_code"] = 0; } contents ~= line; } else if (matchFirst(line, rgx.block_curly_code_open)) { type["curly_code"] = 1; type["header_make"] = 0; type["header_metadata"] = 0; contents ~= line; } else if (type["tic_code"] == 1) { type["header_make"] = 0; type["header_metadata"] = 0; if (matchFirst(line, rgx.block_tic_close)) { type["tic_code"] = 0; } contents ~= line; } else if (matchFirst(line, rgx.block_tic_code_open)) { type["tic_code"] = 1; type["header_make"] = 0; type["header_metadata"] = 0; contents ~= line; } else if ( (type["header_make"] == 1) && matchFirst(line, rgx.header_sub) ) { contents ~= line; } else if ( (type["header_metadata"] == 1) && matchFirst(line, rgx.header_sub) ) { contents ~= line; } else if (matchFirst(line, rgx.header_make)) { type["header_make"] = 1; type["header_metadata"] = 0; contents ~= line; } else if (matchFirst(line, rgx.header_metadata)) { type["header_make"] = 0; type["header_metadata"] = 1; contents ~= line; } else if (auto m = match(line, rgx.insert_src_fn_ssi_or_sst)) { type["header_make"] = 0; type["header_metadata"] = 0; auto insert_fn = m.captures[2]; auto insert_sub_pth = m.captures[1]; auto fn_src_insert = to!string(markup_src_file_path ~ insert_sub_pth ~ insert_fn); auto raw = MarkupRawUnit(); auto markup_sourcefile_insert_content = raw.markupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts); debug(insert) { // insert file tell_l("red", line); tell_l("red", fn_src_insert); writeln( " length contents insert array: ", markup_sourcefile_insert_content.length ); } auto ins = Inserts(); auto contents_insert = ins.scan_subdoc_source( markup_sourcefile_insert_content, to!string(fn_src_insert) ); contents ~= contents_insert; /+ 1. load file, 2. read lines; 3. scan lines, 4. if filename insert, and insert filename 5. repeat 1 6. else 7. add line to new array; +/ } else { type["header_make"] = 0; type["header_metadata"] = 0; contents ~= line; } } // end src doc loop debug(insert) { // insert file writeln(__LINE__); writeln(contents.length); } return contents; } } }