#+TITLE: sdp defaults misc #+AUTHOR: Ralph Amissah #+EMAIL: [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]] #+DESCRIPTION: documents - structuring, publishing in multiple formats & search #+KEYWORDS #+LANGUAGE: en #+STARTUP: indent content #+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc #+OPTIONS: author:nil email:nil creator:nil timestamp:nil #+PROPERTY: header-args :padline no :exports code :noweb yes #+EXPORT_SELECT_TAGS: export #+EXPORT_EXCLUDE_TAGS: noexport #+FILETAGS: :sdp:rel:meta: #+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n) [[./sdp.org][sdp]] [[./][org/]] * 0. meta defaults :module:sdp:meta_defaults: ** 0. module template #+name: tangle_defaults #+BEGIN_SRC d :tangle ../src/sdp/meta/defaults.d /++ default settings +/ module sdp.meta.defaults; template SiSUregisters() { <> <> } <> <> <> <> <> #+END_SRC ** imports #+name: meta_defaults_imports #+BEGIN_SRC d import std.algorithm, std.array, std.container, std.exception, std.file, std.getopt, std.json, std.path, std.process, std.range, std.regex, std.stdio, std.string, std.traits, std.typecons, std.uni, std.utf, std.conv : to; #+END_SRC ** struct ConfComposite #+name: meta_defaults_template_registers #+BEGIN_SRC d struct ConfCompositeMake { string bold = ""; string breaks = ""; string cover_image = ""; string css = ""; string emphasis = ""; string footer = ""; string headings = ""; string home_button_image = ""; string home_button_text = ""; string italics = ""; string num_top = ""; string num_depth = ""; string substitute = ""; string texpdf_font = ""; } struct ConfCompositeMakeStr { string bold = ""; string breaks = ""; string cover_image = ""; string css = ""; string emphasis = ""; string footer = ""; string headings = ""; string home_button_image = ""; string home_button_text = ""; string italics = ""; string num_top = ""; string num_depth = ""; string substitute = ""; string texpdf_font = ""; } struct ConfCompositeSiteLocal { string webserv_url_root = ""; string webserv_path = ""; string webserv_images = ""; string webserv_cgi = ""; string webserv_cgi_host = ""; string webserv_cgi_host_path = ""; string webserv_cgi_port = ""; string webserv_cgi_user = ""; string webserv_cgi_file_links = ""; string processing_path = ""; string processing_dir = ""; string processing_concord_max = ""; string flag_act0 = ""; string flag_act1 = ""; string flag_act2 = ""; string flag_act3 = ""; string flag_act4 = ""; string flag_act5 = ""; string flag_act6 = ""; string flag_act7 = ""; string flag_act8 = ""; string flag_act9 = ""; string default_papersize = ""; string default_text_wrap = ""; string default_emphasis = ""; string default_language = ""; string default_digest = ""; string permission_share_source = ""; string search_flag = ""; string search_action = ""; string search_db = ""; string search_title = ""; } struct MetaComposite { string classify_dewey = ""; string classify_keywords = ""; string classify_loc = ""; string classify_subject = ""; string classify_topic_register = ""; string creator_author = ""; string creator_author_email = ""; string creator_illustrator = ""; string creator_translator = ""; string date_added_to_site = ""; string date_available = ""; string date_created = ""; string date_issued = ""; string date_modified = ""; string date_published = ""; string date_valid = ""; string identifier_isbn = ""; string identifier_oclc = ""; string identifier_pg = ""; string language_document = ""; string language_document_char = ""; string links = ""; string notes_abstract = ""; string notes_description = ""; string original_language = ""; string original_language_char = ""; string original_publisher = ""; string original_source = ""; string original_title = ""; string publisher = ""; string rights_copyright = ""; string rights_copyright_audio = ""; string rights_copyright_cover = ""; string rights_copyright_illustrations = ""; string rights_copyright_photographs = ""; string rights_copyright_text = ""; string rights_copyright_translation = ""; string rights_copyright_video = ""; string rights_license = ""; string title_edition = ""; string title_full = ""; string title_language = ""; string title_main = ""; string title_note = ""; string title_short = ""; string title_sub = ""; string title_subtitle = ""; } struct ConfComposite { MetaComposite meta; ConfCompositeMake make; ConfCompositeSiteLocal conf; } struct ConfCompositePlus { MetaComposite meta; ConfCompositeMake make; ConfCompositeMakeStr make_str; ConfCompositeSiteLocal conf; } #+END_SRC ** extractSDLangTabOrAttrib #+name: meta_defaults_template_registers #+BEGIN_SRC d string extractSDLangTabOrAttrib(S)(S conf_sdlang, string maintab, string atab) { string _conf_composite_string = ""; if (maintab in conf_sdlang.maybe.tags) { auto _maintag = conf_sdlang.getTag(maintab); if ((atab in _maintag.maybe.tags) && (_maintag.getTagValues(atab).length > 0)) { debug(configsdlang) { writeln(__LINE__, ": make:", atab, ": ", _maintag.getTagValues(atab)[0]); } if (_maintag.getTagValues(atab).length == 1) { writeln((_maintag.getTagValues(atab)[0]).to!string); _conf_composite_string = (_maintag.getTagValues(atab)[0]).to!string; } else if (_maintag.getTagValues(atab).length > 1) { string _tmp = ""; foreach (st; _maintag.getTagValues(atab)) { writeln(st.to!string, ";"); _tmp ~= st.to!string ~ ";"; } _conf_composite_string = _tmp; } } else if ((atab in _maintag.maybe.attributes) && (_maintag.maybe.attributes[atab][0].value.length > 0)) { debug(configsdlang) { writeln(__LINE__, ": make:", atab, ": ", conf_sdlang.tags[maintag][0].attributes[atab][0].value); } _conf_composite_string = (_maintag.attributes[atab][0].value).to!string; } } return _conf_composite_string; } #+END_SRC ** metadata associative array indexes :header: #+name: meta_defaults_template_registers #+BEGIN_SRC d static auto ptr_head_main = [ "classify", "creator", "date", "identifier", "links", "make", "original", "notes", "rights", "title" ]; static auto ptr_head_sub_classify = [ "dewey", "keywords", "loc", "subject", "topic_register" ]; static auto ptr_head_sub_creator = [ "author", "author_email", "cover", "illustrator", "translator" ]; static auto ptr_head_sub_date = [ "added_to_site", "available", "created", "issued", "modified", "published", "valid" ]; static auto ptr_head_sub_identifier = [ "isbn", "oclc", "pg" ]; /+ make +/ static auto ptr_head_sub_make = [ "cover_image", "home_button_image", "home_button_text", "footer", "headings", "num_top", "num_depth", "breaks", "substitute", "bold", "italics", "emphasis", "texpdf_font", "css" ]; static auto ptr_head_sub_notes = [ "abstract", "description" ]; static auto ptr_head_sub_original = [ "language", "source", "title" ]; static auto ptr_head_sub_publisher = [ "name" ]; static auto ptr_head_sub_rights = [ "copyright", "cover", "illustrations", "license" ]; static auto ptr_head_sub_title = [ "edition", "full", "language", "main", "note", "sub" ]; auto config_jsonstr = `{ }`; #+END_SRC *** notes headers #+name: meta_defaults_template #+BEGIN_SRC d /+ /+ unify internal representation of header info for native & sdlang document headers represent either using struct, hashes or possibly json sdp internal representation should be identical for native & sdlang variants +/ header. ├── make // make instructions │   ├── bold │   ├── breaks │   ├── cover_image │   ├── css │   ├── emphasis │   ├── footer │   ├── headings │   ├── home_button_image │   ├── home_button_text │   ├── italics │   ├── num_top │   ├── substitute │   └── texpdf_font └── meta // metadata    ├── author // move author to creator:author    ├── classify    │   ├── dewey    │   ├── keyword    │   ├── loc    │   ├── subject    │   └── topic_register    ├── creator    │   ├── author │ │ ├── [ [first_name: x0, last_name: y0], [first_name: x1, last_name: y1] ] │ │ └── [ full_name0, full_name1 ]    │   ├── author_email    │   ├── illustrator    │   └── translator    ├── date    │   ├── added_to_site    │   ├── available    │   ├── created    │   ├── issued    │   ├── modified    │   ├── published    │   └── valid    ├── identifier    │   ├── isbn    │   ├── oclc    │   └── pg    ├── links    ├── notes    │   ├── abstract    │   └── description    ├── original    │   ├── language    │   ├── source    │   └── title    ├── publisher    │   └── name    ├── rights    │   ├── copyright    │   ├── cover    │   ├── illustrations    │   └── license    └── title // move title: to title:main    ├── edition    ├── [ full (main + sub) ]    ├── language    ├── main    ├── note    ├── sub    └── subtitle // move title:subtitle to title:sub 61 leaves +/ #+END_SRC ** template: flags regex initialize :regex_flags: #+name: meta_defaults_template_init_flags #+BEGIN_SRC d template SiSUrgxInitFlags() { /+ regex flags +/ static int[string] flags_type_init() { int[string] flags_type_init = [ "make_headings" : 0, "header_make" : 0, "header_meta" : 0, "heading" : 0, "biblio_section" : 0, "glossary_section" : 0, "blurb_section" : 0, "para" : 0, "blocks" : 0, // 0..2 generic "code" : 0, // 0..2 "poem" : 0, // 0..2 "table" : 0, // 0..2 "group" : 0, // 0..2 "block" : 0, // 0..2 "quote" : 0, // 0..2 "verse_new" : 0, "curly_code" : 0, "curly_poem" : 0, "curly_group" : 0, "curly_block" : 0, "curly_quote" : 0, "curly_table" : 0, "curly_table_special_markup" : 0, "tic_code" : 0, "tic_poem" : 0, "tic_group" : 0, "tic_block" : 0, "tic_quote" : 0, "tic_table" : 0, "ocn_status" : 0, // 0 obj_cite_number; 1 no obj_cite_number; 2 no obj_cite_number & dummy headings "ocn_status_off_for_multiple_objects" : 0, // 0 obj_cite_number; 1 no obj_cite_number; 2 no obj_cite_number & dummy headings "book_index" : 0, ]; return flags_type_init; } } #+END_SRC #+name: meta_defaults_template_node #+BEGIN_SRC d template SiSUnode() { static string[string] node_metadata_heading_str() { auto _node = [ "is" : "", "ocn" : "", "marked_up_lev" : "", "segment_anchor_tag" : "", "attrib" : "", ]; return _node; } static int[string] node_metadata_heading_int() { auto _node = [ "ocn" : 0, // decide whether to use or keep? "ptr_doc_object" : 0, "ptr_html_segnames" : 0, "ptr_heading" : 0, "heading_lev_markup" : 9, "heading_lev_collapsed" : 9, "parent_ocn" : 0, "parent_lev_markup" : 9, ]; return _node; } static string[string] node_metadata_para_str() { auto _node = [ "is" : "", "ocn" : "", "attrib" : "", ]; return _node; } static int[string] node_metadata_para_int() { auto _node = [ "ocn" : 0, "indent_base" : 0, "indent_hang" : 0, "bullet" : 0, // bool (0|1) ]; return _node; } } #+END_SRC ** template: bibliography :biblio: #+name: meta_defaults_template_biblio #+BEGIN_SRC d template SiSUbiblio() { // required: deemed_author (author || editor); year; fulltitle; struct BibJsnStr { static auto biblio_entry_tags_jsonstr() { string x = `{ "is" : "", "sortby_deemed_author_year_title" : "", "deemed_author" : "", "author_raw" : "", "author" : "", "author_arr" : [ "" ], "editor_raw" : "", "editor" : "", "editor_arr" : [ "" ], "title" : "", "subtitle" : "", "fulltitle" : "", "language" : "", "trans" : "", "src" : "", "journal" : "", "in" : "", "volume" : "", "edition" : "", "year" : "", "place" : "", "publisher" : "", "url" : "", "pages" : "", "note" : "", "short_name" : "", "id" : "" }`; // is: book, article, magazine, newspaper, blog, other return x; } } } #+END_SRC * 1. output defaults :module:sdp:defaults: ** 0. module template #+name: tangle_defaults #+BEGIN_SRC d :tangle ../src/sdp/output/defaults.d /++ default settings +/ module sdp.output.defaults; <> <> <> #+END_SRC ** imports #+name: defaults_imports #+BEGIN_SRC d import std.algorithm, std.array, std.container, std.exception, std.file, std.getopt, std.json, std.path, std.process, std.range, std.regex, std.stdio, std.string, std.traits, std.typecons, std.uni, std.utf, std.conv : to; #+END_SRC * 2. defaults shared by meta & output (generic) ** template: internal markup :markup: #+name: defaults_template_markup #+BEGIN_SRC d template InternalMarkup() { static struct InlineMarkup { auto en_a_o = "【"; auto en_a_c = "】"; auto en_b_o = "〖"; auto en_b_c = "〗"; auto lnk_o = "┥"; auto lnk_c = "┝"; auto url_o = "┤"; auto url_c = "├"; auto mark_internal_site_lnk = "¤"; auto nbsp = "░"; auto br_line = "┘"; auto br_nl = "┙"; auto br_paragraph = "┚"; auto br_obj = "break_obj"; auto br_page_line = "┼"; auto br_page = "┿"; auto br_page_new = "╂"; auto tc_s = "┊"; auto tc_o = "┏"; auto tc_c = "┚"; auto tc_p = "┆"; auto mono = "■"; static string indent_by_spaces_provided(int indent, string _indent_spaces ="░░") { _indent_spaces = replicate(_indent_spaces, indent); return _indent_spaces; } static string repeat_character_by_number_provided(C,N)(C _character ="-", N number=10) { _character = replicate(_character, number); return _character; } } } #+END_SRC ** template language codes #+name: defaults_template_language_codes #+BEGIN_SRC d template SiSUlanguageCodes() { /+ language codes +/ struct Lang { static string[string][string] codes() { auto _lang_codes = [ "am": [ "c": "am", "n": "Amharic", "t": "Amharic", "xlp": "amharic" ], "bg": [ "c": "bg", "n": "Bulgarian", "t": "Български (Bəlgarski)", "xlp": "bulgarian" ], "bn": [ "c": "bn", "n": "Bengali", "t": "Bengali", "xlp": "bengali" ], "br": [ "c": "br", "n": "Breton", "t": "Breton", "xlp": "breton" ], "ca": [ "c": "ca", "n": "Catalan", "t": "catalan", "xlp": "catalan" ], "cs": [ "c": "cs", "n": "Czech", "t": "česky", "xlp": "czech" ], "cy": [ "c": "cy", "n": "Welsh", "t": "Welsh", "xlp": "welsh" ], "da": [ "c": "da", "n": "Danish", "t": "dansk", "xlp": "danish" ], "de": [ "c": "de", "n": "German", "t": "Deutsch", "xlp": "german" ], "el": [ "c": "el", "n": "Greek", "t": "Ελληνικά (Ellinika)", "xlp": "greek" ], "en": [ "c": "en", "n": "English", "t": "English", "xlp": "english" ], "eo": [ "c": "eo", "n": "Esperanto", "t": "Esperanto", "xlp": "esperanto" ], "es": [ "c": "es", "n": "Spanish", "t": "español", "xlp": "spanish" ], "et": [ "c": "et", "n": "Estonian", "t": "Estonian", "xlp": "estonian" ], "eu": [ "c": "eu", "n": "Basque", "t": "basque", "xlp": "basque" ], "fi": [ "c": "fi", "n": "Finnish", "t": "suomi", "xlp": "finnish" ], "fr": [ "c": "fr", "n": "French", "t": "français", "xlp": "french" ], "ga": [ "c": "ga", "n": "Irish", "t": "Irish", "xlp": "irish" ], "gl": [ "c": "gl", "n": "Galician", "t": "Galician", "xlp": "galician" ], "he": [ "c": "he", "n": "Hebrew", "t": "Hebrew", "xlp": "hebrew" ], "hi": [ "c": "hi", "n": "Hindi", "t": "Hindi", "xlp": "hindi" ], "hr": [ "c": "hr", "n": "Croatian", "t": "Croatian", "xlp": "croatian" ], "hy": [ "c": "hy", "n": "Armenian", "t": "Armenian", "xlp": "armenian" ], "ia": [ "c": "ia", "n": "Interlingua", "t": "Interlingua", "xlp": "interlingua" ], "is": [ "c": "is", "n": "Icelandic", "t": "Icelandic", "xlp": "icelandic" ], "it": [ "c": "it", "n": "Italian", "t": "Italiano", "xlp": "italian" ], "ja": [ "c": "ja", "n": "Japanese", "t": "日本語 (Nihongo)", "xlp": "japanese" ], "ko": [ "c": "ko", "n": "Korean", "t": "Korean", "xlp": "korean" ], "la": [ "c": "la", "n": "Latin", "t": "Latin", "xlp": "latin" ], "lo": [ "c": "lo", "n": "Lao", "t": "Lao", "xlp": "lao" ], "lt": [ "c": "lt", "n": "Lithuanian", "t": "Lithuanian", "xlp": "lithuanian" ], "lv": [ "c": "lv", "n": "Latvian", "t": "Latvian", "xlp": "latvian" ], "ml": [ "c": "ml", "n": "Malayalam", "t": "Malayalam", "xlp": "malayalam" ], "mr": [ "c": "mr", "n": "Marathi", "t": "Marathi", "xlp": "marathi" ], "nl": [ "c": "nl", "n": "Dutch", "t": "Nederlands", "xlp": "dutch" ], "no": [ "c": "no", "n": "Norwegian", "t": "norsk", "xlp": "norsk" ], "nn": [ "c": "nn", "n": "Norwegian Nynorsk", "t": "nynorsk", "xlp": "nynorsk" ], "oc": [ "c": "oc", "n": "Occitan", "t": "Occitan", "xlp": "occitan" ], "pl": [ "c": "pl", "n": "Polish", "t": "polski", "xlp": "polish" ], "pt": [ "c": "pt", "n": "Portuguese", "t": "Português", "xlp": "portuges" ], "pt_BR": [ "c": "pt_BR", "n": "Portuguese Brazil", "t": "Brazilian Português", "xlp": "brazilian" ], "ro": [ "c": "ro", "n": "Romanian", "t": "română", "xlp": "romanian" ], "ru": [ "c": "ru", "n": "Russian", "t": "Русский (Russkij)", "xlp": "russian" ], "sa": [ "c": "sa", "n": "Sanskrit", "t": "Sanskrit", "xlp": "sanskrit" ], "se": [ "c": "se", "n": "Sami", "t": "Samin", "xlp": "samin" ], "sk": [ "c": "sk", "n": "Slovak", "t": "slovensky", "xlp": "slovak" ], "sl": [ "c": "sl", "n": "Slovenian", "t": "Slovenian", "xlp": "slovenian" ], "sq": [ "c": "sq", "n": "Albanian", "t": "Albanian", "xlp": "albanian" ], "sr": [ "c": "sr", "n": "Serbian", "t": "Serbian", "xlp": "serbian" ], "sv": [ "c": "sv", "n": "Swedish", "t": "svenska", "xlp": "swedish" ], "ta": [ "c": "ta", "n": "Tamil", "t": "Tamil", "xlp": "tamil" ], "te": [ "c": "te", "n": "Telugu", "t": "Telugu", "xlp": "telugu" ], "th": [ "c": "th", "n": "Thai", "t": "Thai", "xlp": "thai" ], "tk": [ "c": "tk", "n": "Turkmen", "t": "Turkmen", "xlp": "turkmen" ], "tr": [ "c": "tr", "n": "Turkish", "t": "Türkçe", "xlp": "turkish" ], "uk": [ "c": "uk", "n": "Ukranian", "t": "українська (ukrajins\"ka)", "xlp": "ukrainian" ], "ur": [ "c": "ur", "n": "Urdu", "t": "Urdu", "xlp": "urdu" ], "us": [ "c": "en", "n": "English (American)","t": "English", "xlp": "english" ], "vi": [ "c": "vi", "n": "Vietnamese", "t": "Vietnamese", "xlp": "vietnamese" ], "zh": [ "c": "zh", "n": "Chinese", "t": "中文", "xlp": "chinese" ], "en": [ "c": "en", "n": "English", "t": "English", "xlp": "english" ], "xx": [ "c": "xx", "n": "Default", "t": "English", "xlp": "english" ], ]; return _lang_codes; } static string[] code_arr_ptr() { auto _lang_codes = ["am", "bg", "bn", "br", "ca", "cs", "cy", "da", "de", "el", "en", "eo", "es", "et", "eu", "fi", "fr", "ga", "gl", "he", "hi", "hr", "hy", "ia", "is", "it", "ja", "ko", "la", "lo", "lt", "lv", "ml", "mr", "nl", "no", "nn", "oc", "pl", "pt", "pt_BR", "ro", "ru", "sa", "se", "sk", "sl", "sq", "sr", "sv", "ta", "te", "th", "tk", "tr", "uk", "ur", "us", "vi", "zh", "en", "xx",]; return _lang_codes; } static string[] code_arr() { auto _lang_codes = ["am", "bg", "bn", "br", "ca", "cs", "cy", "da", "de", "el", "en", "eo", "es", "et", "eu", "fi", "fr", "ga", "gl", "he", "hi", "hr", "hy", "ia", "is", "it", "ja", "ko", "la", "lo", "lt", "lv", "ml", "mr", "nl", "no", "nn", "oc", "pl", "pt", "pt_BR", "ro", "ru", "sa", "se", "sk", "sl", "sq", "sr", "sv", "ta", "te", "th", "tk", "tr", "uk", "ur", "vi", "zh"]; return _lang_codes; } static auto codes_() { return "(" ~ join(code_arr,"|") ~ ")"; } static auto codes_regex() { return regex(codes_); } } } #+END_SRC * __END__ ** +set colors for terminal+ (unused) :colors:terminal: #+name: meta_ansi_colors #+BEGIN_SRC d static string[string] scr_txt_color = [ "off" : "\033[0m", "white" : "\033[37m", "white_bold" : "\033[1m", "marker" : "\033[42m", "bold" : "\033[1m", "underline" : "\033[4m", "invert" : "\033[7m", "darkgrey_hi" : "\033[100m", "grey_hi" : "\033[47m", "pink_hi" : "\033[105m", "fuchsia_hi" : "\033[45m", "red_hi" : "\033[41m", "orange_hi" : "\033[101m", "yellow_hi" : "\033[103m", "brown_hi" : "\033[43m", "lightgreen_hi" : "\033[102m", "green_hi" : "\033[42m", "cyan_hi" : "\033[106m", "blue_hi" : "\033[104m", "navy_hi" : "\033[44m", "grey" : "\033[90m", "pink" : "\033[95m", "fuchsia" : "\033[35m", "ruby" : "\033[31m", "red" : "\033[91m", "orange" : "\033[91m", "yellow" : "\033[93m", "brown" : "\033[33m", "green" : "\033[92m", "darkgreen" : "\033[32m", "cyan" : "\033[36m", "blue" : "\033[94m", "navy" : "\033[34m", "black" : "\033[30m" ]; static string[string] scr_txt_marker = [ "white" : "\033[37m*\033[0m ", "bold" : "\033[1m*\033[0m ", "invert" : "\033[7m*\033[0m ", "darkgrey_hi" : "\033[100m*\033[0m ", "grey_hi" : "\033[47m*\033[0m ", "pink_hi" : "\033[105m*\033[0m ", "fuchsia_hi" : "\033[45m*\033[0m ", "red_hi" : "\033[41m*\033[0m ", "orange_hi" : "\033[101m*\033[0m ", "yellow_hi" : "\033[103m*\033[0m ", "brown_hi" : "\033[43m*\033[0m ", "lightgreen_hi" : "\033[102m*\033[0m ", "green_hi" : "\033[42m*\033[0m ", "cyan_hi" : "\033[106m*\033[0m ", "blue_hi" : "\033[104m*\033[0m ", "navy_hi" : "\033[44m*\033[0m ", "grey" : "\033[90m*\033[0m ", "pink" : "\033[95m*\033[0m ", "fuchsia" : "\033[35m*\033[0m ", "ruby" : "\033[31m*\033[0m ", "red" : "\033[91m*\033[0m ", "orange" : "\033[91m*\033[0m ", "yellow" : "\033[93m*\033[0m ", "brown" : "\033[33m*\033[0m ", "green" : "\033[92m*\033[0m ", "darkgreen" : "\033[32m*\033[0m ", "cyan" : "\033[36m*\033[0m ", "blue" : "\033[94m*\033[0m ", "navy" : "\033[34m*\033[0m ", "black" : "\033[30m*\033[0m " ]; #+END_SRC