-
-void
-setup_scanner() {
- const GScannerConfig scan_config = {
- (
- "\t\r\n"
- ) /* cset_skip_characters */,
- (
- G_CSET_a_2_z
- "_#"
- G_CSET_A_2_Z
- ) /* cset_identifier_first */,
- (
- G_CSET_a_2_z
- "_0123456789"
- G_CSET_A_2_Z
- G_CSET_LATINS
- G_CSET_LATINC
- ) /* cset_identifier_nth */,
- ( "" ) /* cpair_comment_single */,
-
- TRUE /* case_sensitive */,
-
- FALSE /* skip_comment_multi */,
- FALSE /* skip_comment_single */,
- FALSE /* scan_comment_multi */,
- TRUE /* scan_identifier */,
- TRUE /* scan_identifier_1char */,
- FALSE /* scan_identifier_NULL */,
- TRUE /* scan_symbols */,
- FALSE /* scan_binary */,
- FALSE /* scan_octal */,
- FALSE /* scan_float */,
- FALSE /* scan_hex */,
- FALSE /* scan_hex_dollar */,
- FALSE /* scan_string_sq */,
- FALSE /* scan_string_dq */,
- TRUE /* numbers_2_int */,
- FALSE /* int_2_float */,
- FALSE /* identifier_2_string */,
- FALSE /* char_2_token */,
- FALSE /* symbol_2_token */,
- TRUE /* scope_0_fallback */,
- FALSE,
- TRUE
- };
-
- uzbl.scan = g_scanner_new(&scan_config);
- while(symp->symbol_name) {
- g_scanner_scope_add_symbol(uzbl.scan, 0,
- symp->symbol_name,
- GINT_TO_POINTER(symp->symbol_token));
- symp++;
- }
-}
-
-gchar *
-expand_template(const char *template, gboolean escape_markup) {
- if(!template) return NULL;
-
- GTokenType token = G_TOKEN_NONE;
- GString *ret = g_string_new("");
- char *buf=NULL;
- int sym;
-
- g_scanner_input_text(uzbl.scan, template, strlen(template));
- while(!g_scanner_eof(uzbl.scan) && token != G_TOKEN_LAST) {
- token = g_scanner_get_next_token(uzbl.scan);
-
- if(token == G_TOKEN_SYMBOL) {
- sym = GPOINTER_TO_INT(g_scanner_cur_value(uzbl.scan).v_symbol);
- switch(sym) {
- case SYM_URI:
- if(escape_markup) {
- buf = uzbl.state.uri?
- g_markup_printf_escaped("%s", uzbl.state.uri):g_strdup("");
- g_string_append(ret, buf);
- g_free(buf);
- }
- else
- g_string_append(ret, uzbl.state.uri?
- uzbl.state.uri:g_strdup(""));
- break;
- case SYM_LOADPRGS:
- buf = itos(uzbl.gui.sbar.load_progress);
- g_string_append(ret, buf);
- g_free(buf);
- break;
- case SYM_LOADPRGSBAR:
- buf = build_progressbar_ascii(uzbl.gui.sbar.load_progress);
- g_string_append(ret, buf);
- g_free(buf);
- break;
- case SYM_TITLE:
- if(escape_markup) {
- buf = uzbl.gui.main_title?
- g_markup_printf_escaped("%s", uzbl.gui.main_title):g_strdup("");
- g_string_append(ret, buf);
- g_free(buf);
- }
- else
- g_string_append(ret, uzbl.gui.main_title?
- uzbl.gui.main_title:g_strdup(""));
- break;
- case SYM_SELECTED_URI:
- if(escape_markup) {
- buf = uzbl.state.selected_url?
- g_markup_printf_escaped("%s", uzbl.state.selected_url):g_strdup("");
- g_string_append(ret, buf);
- g_free(buf);
- }
- else
- g_string_append(ret, uzbl.state.selected_url?
- uzbl.state.selected_url:g_strdup(""));
- break;
- case SYM_NAME:
- buf = itos(uzbl.xwin);
- g_string_append(ret,
- uzbl.state.instance_name?uzbl.state.instance_name:buf);
- g_free(buf);
- break;
- case SYM_KEYCMD:
- if(escape_markup) {
- buf = uzbl.state.keycmd->str?
- g_markup_printf_escaped("%s", uzbl.state.keycmd->str):g_strdup("");
- g_string_append(ret, buf);
- g_free(buf);
- }
- else
- g_string_append(ret, uzbl.state.keycmd->str?
- uzbl.state.keycmd->str:g_strdup(""));
- break;
- case SYM_MODE:
- g_string_append(ret,
- uzbl.behave.insert_mode?
- uzbl.behave.insert_indicator:uzbl.behave.cmd_indicator);
- break;
- case SYM_MSG:
- g_string_append(ret,
- uzbl.gui.sbar.msg?uzbl.gui.sbar.msg:"");
- break;
- /* useragent syms */
- default:
- break;
- }
- }
- else if(token == G_TOKEN_INT) {
- buf = itos(g_scanner_cur_value(uzbl.scan).v_int);
- g_string_append(ret, buf);
- g_free(buf);
- }
- else if(token == G_TOKEN_IDENTIFIER) {
- g_string_append(ret, (gchar *)g_scanner_cur_value(uzbl.scan).v_identifier);
- }
- else if(token == G_TOKEN_CHAR) {
- g_string_append_c(ret, (gchar)g_scanner_cur_value(uzbl.scan).v_char);
- }
- }
-
- return g_string_free(ret, FALSE);
-}