/* convert _underlined_, /italics/, and *bold* words (and phrases) to use real underlining or bolding */ char *expand_emphasis(WI_ITEM_REC *item, const char *text) { GString *str; char *ret; int pos; int emphasis_italics; g_return_val_if_fail(text != NULL, NULL); emphasis_italics = settings_get_bool("emphasis_italics"); str = g_string_new(text); for (pos = 0; pos < str->len; pos++) { char type, *bgn, *end; bgn = str->str + pos; if (*bgn == '*') type = 2; /* bold */ else if (*bgn == '/' && emphasis_italics) type = 29; /* italics */ else if (*bgn == '_') type = 31; /* underlined */ else continue; /* check that the beginning marker starts a word, and that the matching end marker ends a word */ if ((pos > 0 && bgn[-1] != ' ') || !ishighalnum(bgn[1])) continue; if ((end = strchr(bgn+1, *bgn)) == NULL) continue; if (!ishighalnum(end[-1]) || ishighalnum(end[1]) || end[1] == type || end[1] == '*' || end[1] == '_' || /* special case for italics to not emphasise common paths by skipping /.../.X */ (type == 29 && i_ispunct(end[1]) && ishighalnum(end[2]))) continue; if (IS_CHANNEL(item)) { /* check that this isn't a _nick_, we don't want to use emphasis on them. */ int found; char c; char *end2; /* check if _foo_ is a nick */ c = end[1]; end[1] = '\0'; found = nicklist_find(CHANNEL(item), bgn) != NULL; end[1] = c; if (found) continue; /* check if the whole 'word' (e.g. "_foo_^") is a nick in "_foo_^ ", end will be the second _, end2 the ^ */ end2 = end; while (isnickchar(end2[1])) end2++; c = end2[1]; end2[1] = '\0'; found = nicklist_find(CHANNEL(item), bgn) != NULL; end2[1] = c; if (found) continue; } /* allow only *word* emphasis, not *multiple words* */ if (!settings_get_bool("emphasis_multiword")) { char *c; for (c = bgn+1; c != end; c++) { if (!ishighalnum(*c)) break; } if (c != end) continue; } if (settings_get_bool("emphasis_replace")) { *bgn = *end = type; pos += (end-bgn); } else { g_string_insert_c(str, pos, type); pos += (end - bgn) + 2; g_string_insert_c(str, pos++, type); } } ret = str->str; g_string_free(str, FALSE); return ret; }
/* convert _underlined_ and *bold* words (and phrases) to use real underlining or bolding */ char *expand_emphasis(WI_ITEM_REC *item, const char *text) { GString *str; char *ret; int pos; g_return_val_if_fail(text != NULL, NULL); str = g_string_new(text); for (pos = 0; pos < str->len; pos++) { char type, *bgn, *end; bgn = str->str + pos; if (*bgn == '*') type = 2; /* bold */ else if (*bgn == '_') type = 31; /* underlined */ else continue; /* check that the beginning marker starts a word, and that the matching end marker ends a word */ if ((pos > 0 && !i_isspace(bgn[-1])) || !ishighalnum(bgn[1])) continue; if ((end = strchr(bgn+1, *bgn)) == NULL) continue; if (!ishighalnum(end[-1]) || ishighalnum(end[1]) || end[1] == type || end[1] == '*' || end[1] == '_') continue; if (IS_CHANNEL(item)) { /* check that this isn't a _nick_, we don't want to use emphasis on them. */ int found; char c; c = end[1]; end[1] = '\0'; found = nicklist_find(CHANNEL(item), bgn) != NULL; end[1] = c; if (found) continue; } /* allow only *word* emphasis, not *multiple words* */ if (!settings_get_bool("emphasis_multiword")) { char *c; for (c = bgn+1; c != end; c++) { if (!ishighalnum(*c)) break; } if (c != end) continue; } if (settings_get_bool("emphasis_replace")) { *bgn = *end = type; pos += (end-bgn); } else { g_string_insert_c(str, pos, type); pos += (end - bgn) + 2; g_string_insert_c(str, pos++, type); } } ret = str->str; g_string_free(str, FALSE); return ret; }