X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftext-interface.cc;h=940f42a07524eaacee7a35335fa45aeea91adb43;hb=ca7baa2950c23337825b1c5f6e22e8fd514cd648;hp=232d9c3824a80bd36420c7c84dd9c07efd654ed8;hpb=16e626a8524421eda692cb19be6d0ec5bff723b7;p=lilypond.git diff --git a/lily/text-interface.cc b/lily/text-interface.cc index 232d9c3824..940f42a075 100644 --- a/lily/text-interface.cc +++ b/lily/text-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2011 Han-Wen Nienhuys + Copyright (C) 1998--2012 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -33,22 +33,34 @@ #include "warn.hh" static void -replace_whitespace (string *str) +replace_special_characters (string &str, SCM props) { - vsize i = 0; - vsize n = str->size (); + SCM replacement_alist = ly_chain_assoc_get (ly_symbol2scm ("replacement-alist"), + props, + SCM_EOL); - while (i < n) + int max_length = 0; + for (SCM s = replacement_alist; scm_is_pair (s); s = scm_cdr (s)) { - char cur = (*str)[i]; - - // avoid the locale-dependent isspace - if (cur == '\n' || cur == '\t' || cur == '\v') - (*str)[i] = ' '; - - vsize char_len = utf8_char_len (cur); + max_length = max (max_length, scm_to_int + (scm_string_length (scm_caar (s)))); + } - i += char_len; + for (vsize i = 0; i < str.size (); i++) + { + /* Don't match in mid-UTF-8 */ + if ((str[i] & 0xc0) == 0x80) + continue; + for (vsize j = max_length + 1; j--;) + { + if (j > str.size () - i) + continue; + string dummy = str.substr (i, j); + SCM ligature = ly_assoc_get (ly_string2scm (dummy), + replacement_alist, SCM_BOOL_F); + if (scm_is_true (ligature)) + str.replace (i, j, robust_scm2string (ligature, "")); + } } } @@ -65,7 +77,7 @@ Text_interface::interpret_string (SCM layout_smob, Output_def *layout = unsmob_output_def (layout_smob); Font_metric *fm = select_encoded_font (layout, props); - replace_whitespace (&str); + replace_special_characters (str, props); /* We want to filter strings with a music font that pass through @@ -114,22 +126,22 @@ Text_interface::interpret_markup (SCM layout_smob, SCM props, SCM markup) { string name = ly_symbol2string (scm_procedure_name (func)); // TODO: Also print the arguments of the markup! - non_fatal_error (_f("Cyclic markup detected: %s", name)); - return Stencil().smobbed_copy (); + non_fatal_error (_f ("Cyclic markup detected: %s", name)); + return Stencil ().smobbed_copy (); } } /* Check for non-terminating markups, e.g. recursive calls with * changing arguments */ SCM opt_depth = ly_get_option (ly_symbol2scm ("max-markup-depth")); - size_t max_depth = robust_scm2int(opt_depth, 1024); + size_t max_depth = robust_scm2int (opt_depth, 1024); if (depth > max_depth) { string name = ly_symbol2string (scm_procedure_name (func)); // TODO: Also print the arguments of the markup! - non_fatal_error (_f("Markup depth exceeds maximal value of %d; " - "Markup: %s", max_depth, name.c_str ())); - return Stencil().smobbed_copy (); + non_fatal_error (_f ("Markup depth exceeds maximal value of %d; " + "Markup: %s", max_depth, name.c_str ())); + return Stencil ().smobbed_copy (); } encountered_markups.push_back (markup); @@ -188,6 +200,7 @@ ADD_INTERFACE (Text_interface, /* properties */ "baseline-skip " + "replacement-alist " "text " "word-space " "text-direction "