static const char * color_of(char *s, int arg) { const char *result = ""; char *t; int quoted = 0; int save; s = skip_blanks(s); t = skip_ident(s); if ((save = *t) != 0) *t = 0; if (is_class(s)) { if (FltOptions('c')) { result = keyword_attr(s); if (result == 0) result = class_attr(s); if (result == 0) result = Ident2_attr; } else { result = Ident2_attr; } } else if (arg && (*s != 0)) { char *base = s; if (!FltOptions('c')) result = Action_attr; while (*s != 0) { if (quoted) { if (*s == QUOTE) quoted = 0; } else if (*s == QUOTE) { quoted = 1; result = Literal_attr; } else if ((s == base) && color_code(s, &result)) { break; } s++; } } if (save) *t = (char) save; return result; }
//------------------------------------------------------------------ void code_colorer::start_element(const element& e) { if(e.name_len()) { if(m_coloring_element == 0) { if(m_cfg.keyword_exists(keyword_code, e.name(), e.name_len()) || str_cmp(e.name(), e.name_len(), keyword_code) == 0 || str_cmp(e.name(), e.name_len(), keyword_m) == 0) { m_coloring_element = &e; color_code(e); } else { m_result.add_element_header(e); } } } }
static int is_color(const char *s) { const char *t = 0; return color_code(s, &t); }
/*-------------------------------------------------------------------*/ void loop() { random_walk(); broadcast(); color_code(); }
//------------------------------------------------------------------ void code_colorer::color_code(const element& e) { m_language.assign(e.name(), e.name_len()); m_block_comments = m_cfg.strlist(string_type(e.name(), e.name_len()), keyword_block_comments_suffix); m_line_comments = m_cfg.strlist(string_type(e.name(), e.name_len()), keyword_line_comments_suffix); m_string_quotation = m_cfg.strlist(string_type(e.name(), e.name_len()), keyword_strings_suffix); m_string_mask = m_cfg.strlist(string_type(e.name(), e.name_len()), keyword_string_mask_suffix); m_operators = m_cfg.strlist(string_type(e.name(), e.name_len()), keyword_operators_suffix); replace_strlist_keysym(m_block_comments); replace_strlist_keysym(m_line_comments); replace_strlist_keysym(m_string_quotation); replace_strlist_keysym(m_string_mask); replace_strlist_keysym(m_operators); m_identifier_charset.clear(); add_to_identifier_charset(keyword_kw1_suffix); add_to_identifier_charset(keyword_kw2_suffix); add_to_identifier_charset(keyword_kw3_suffix); add_to_identifier_charset(keyword_kw4_suffix); m_operator_charset.clear(); unsigned i; for(i = 0; i < m_operators.size(); ++i) { const string_type& str = m_operators[i]; for(unsigned j = 0; j < str.length(); j++) { char_type c = str[j]; if(!is_alnum(c)) { m_operator_charset.insert(replace_keysym(c)); } } } content_storage code; element_serializer ser(code, e, false, false); code.replace_text_keysym(); m_result.add(backslash); if(str_cmp(m_language, keyword_m) == 0) { m_result.add(keyword_m.name, keyword_m.len); m_result.add(open_brace); m_result.add(code.text()); m_result.add(close_brace); } else if(str_cmp(m_language, keyword_code) == 0) { m_result.add(keyword_code.name, keyword_code.len); if(e.attr_len()) { m_result.add(open_bracket); m_result.add(e.attr(), e.attr_len()); m_result.add(close_bracket); } m_result.add(open_brace); m_result.add(code.text()); m_result.add(close_brace); } else { m_result.add(keyword_code.name, keyword_code.len); if(e.attr_len()) { m_result.add(open_bracket); m_result.add(e.attr(), e.attr_len()); m_result.add(close_bracket); } m_result.add(open_brace); color_code(code.text()); m_result.add(close_brace); } }