open MatitaGtkMisc
open MatitaMisc
+exception Found of int
+
let gui_instance = ref None
class type browserWin =
MatitaLog.error (MatitaExcPp.to_string exn)
else raise exn);
(* script *)
- let _ = source_buffer#connect#changed (fun _ -> next_ligatures <- []) in
+ ignore (source_buffer#connect#mark_set (fun _ _ -> next_ligatures <- []));
let _ =
match GSourceView.source_language_from_file BuildTimeConf.lang_file with
| None ->
source_buffer#delete ~start:iter ~stop:(iter#copy#backward_chars len);
source_buffer#insert ~iter:(source_buffer#get_iter_at_mark `INSERT) s
in
+ let get_ligature word =
+ let len = String.length word in
+ let aux_tex () =
+ try
+ for i = len - 1 downto 0 do
+ if HExtlib.is_alpha word.[i] then ()
+ else
+ (if word.[i] = '\\' then raise (Found i) else raise (Found ~-1))
+ done;
+ None
+ with Found i ->
+ if i = ~-1 then None else Some (String.sub word i (len - i))
+ in
+ let aux_ligature () =
+ try
+ for i = len - 1 downto 0 do
+ if CicNotationLexer.is_ligature_char word.[i] then ()
+ else raise (Found (i+1))
+ done;
+ raise (Found 0)
+ with
+ | Found i ->
+ (try
+ Some (String.sub word i (len - i))
+ with Invalid_argument _ -> None)
+ in
+ match aux_tex () with
+ | Some macro -> macro
+ | None -> (match aux_ligature () with Some l -> l | None -> word)
+ in
(match next_ligatures with
| [] -> (* find ligatures and fill next_ligatures, then try again *)
- let last_word = iter#get_slice ~stop:iter#copy#backward_word_start in
- let len = String.length last_word in
- let i = ref (len - 1) in
- while !i >= 0 && CicNotationLexer.is_ligature_char last_word.[!i] do
- decr i
- done;
- let ligature = String.sub last_word (!i + 1) (len - (!i + 1)) in
+ let last_word =
+ iter#get_slice
+ ~stop:(iter#copy#backward_find_char Glib.Unichar.isspace)
+ in
+ let ligature = get_ligature last_word in
(match CicNotationLexer.lookup_ligatures ligature with
| [] -> ()
| hd :: tl ->