% Fragments for an implementation of text/plain; format=flowed % TODO: Handle typing and re-wrapping of quoted text properly. () = evalfile ("/home/roessler/jed/mail_mode.sl"); variable from_state=Assoc_Type[Int_Type]; static define flower_prev() { variable c; if (bolp()) c = ' '; else { go_left_1(); c = what_char(); go_right_1(); } return c; } static define flower_state() { if (assoc_key_exists (from_state, whatbuf())) return from_state[whatbuf()]; else return 0; } static define flower_set_state(a) { from_state[whatbuf()] = a; } define flower_stuff() { variable c = LAST_CHAR; switch (c) { case 'F': if (bolp()) flower_set_state(1); else flower_set_state(0); } { case 'r': if ((flower_prev() == 'F') and (flower_state() == 1)) flower_set_state (2); else flower_set_state (0); } { case 'o': if ((flower_prev() == 'r') and (flower_state() == 2)) flower_set_state (3); else flower_set_state (0); } { case 'm': if ((flower_prev() == 'o') and (flower_state() == 3)) flower_set_state (4); else flower_set_state (0); } { case ' ': if (((flower_prev() == 'm') and (flower_state() == 4)) or bolp()) flower_set_state (5); else flower_set_state (0); } { case '>': if (bolp()) flower_set_state (5); else flower_set_state (0); } insert_char (c); if (flower_state() == 5) { push_spot (); bol(); insert_char (' '); pop_spot (); flower_set_state (0); } } define flower_wrap () { push_spot(); if (up_1()) { eol(); insert_char (' '); } pop_spot(); } define flower_mode () { mail_mode(); local_setkey ("flower_stuff", "F"); local_setkey ("flower_stuff", "r"); local_setkey ("flower_stuff", "o"); local_setkey ("flower_stuff", "m"); local_setkey ("flower_stuff", " "); local_setkey ("flower_stuff", ">"); set_buffer_hook ("wrap_hook", "flower_wrap"); mail_is_flowed = 1; }