home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / jed098-4.zip / JED / LIB / HTML.SL < prev    next >
Text File  |  1997-02-01  |  12KB  |  488 lines

  1. %
  2. %  file : html.sl
  3. %
  4. %  Original Author : Raikanta Sahu, rsahu@mail.unm.edu
  5. %  Substantial additions by Jim Knoble.
  6.  
  7. %  Modified by John E. Davis for incorporation into JED.
  8.  
  9.  
  10. % 1 => html_mode wraps, like text_mode
  11. % 0 => html_mode doesn't wrap, like no_mode
  12.  
  13. define html_paragraph_separator ()
  14. {
  15.    bol_skip_white ();
  16.    eolp () or ffind_char ('>') or ffind_char ('<');
  17. }
  18.  
  19. % Movement function (JM)
  20. %!% skip forward past html tag
  21. define html_skip_tag()
  22. {
  23.    !if (fsearch_char ('>')) return;
  24.    go_right_1 ();
  25. }
  26.  
  27. %!% skip backward past html tag
  28. define html_bskip_tag()
  29. {
  30.    () = bsearch_char ('<');
  31. }
  32.  
  33. %!% mark the next html tag forward
  34. define html_mark_next_tag()
  35. {
  36.    variable taglng = 1;
  37.  
  38.    !if (fsearch_char ('>')) return;
  39.    go_right(taglng);
  40.    set_mark_cmd ();
  41.    go_left(taglng);
  42.    () = find_matching_delimiter (0);
  43. }
  44.  
  45. %!% mark the previous html tag
  46. define html_mark_prev_tag()
  47. {
  48.    !if (bsearch_char ('<')) return;
  49.    set_mark_cmd ();
  50.    () = find_matching_delimiter(0);
  51.    go_right_1 ();
  52.    exchange_point_and_mark();
  53. }
  54.  
  55.  
  56. %
  57. % First define some useful functions
  58. %
  59.  
  60. define html_insert_pair_around_region (lfttag, rgttag)
  61. {
  62.    % make sure mark is before point;
  63.    % 1 => push spot first
  64.    check_region(1);
  65.         
  66.    % put tags on appropriate sides of region,
  67.    % then return to where we were
  68.    exchange_point_and_mark();
  69.    insert(lfttag);
  70.    exchange_point_and_mark();
  71.    insert(rgttag);
  72.    pop_spot();
  73.    pop_mark_0 ();
  74. }
  75.  
  76. define html_insert_move (str)
  77. {
  78.    variable len;
  79.    variable beg, end;
  80.    
  81.    len = is_substr (str, "@");
  82.    !if (len) return;
  83.    len--;
  84.    if (markp ())
  85.      {
  86.     beg = substr (str, 1, len);
  87.     end = substr (str, len + 2, strlen (str));
  88.     html_insert_pair_around_region (beg, end);
  89.     return;
  90.      }
  91.    
  92.    push_spot ();
  93.    insert (str);
  94.    pop_spot ();
  95.    go_right (len);
  96.    del ();
  97. }
  98.  
  99. define html_simple_insert (str)
  100. {
  101.    html_insert_move (Sprintf ("<%s>@</%s>", str, str, 2));
  102. }
  103.  
  104. define html_insert_with_newline (str)
  105. {
  106.    html_insert_move (Sprintf ("<%s>\n@\n</%s>\n", str, str, 2));
  107. }
  108.  
  109. define html_template ()
  110. {
  111.    insert ("<!doctype html public \"-//ietf//dtd html 2.0//en\">\n");
  112.    html_insert_move ("<HTML>\n\n<HEAD>\n<TITLE>@</TITLE>\n</HEAD>\n\n<BODY>\n</BODY>\n\n</HTML>") ;
  113. }
  114.  
  115. define html_form ()
  116. {
  117.    html_insert_move ("<form action=\"\" method=\"\">\n@\n</form>");
  118. }
  119.  
  120. define html_input ()
  121. {
  122.    insert ("<input type=\"\" name=\"\" value=\"\">");
  123. }
  124.  
  125. define html_input_text ()
  126. {
  127.    insert ("<input type=\"text\" name=\"\" value=\"\">");
  128. }
  129.  
  130. define html_input_password ()
  131. {
  132.    insert ("<input type=\"password\" name=\"\" value=\"\">");
  133. }
  134.  
  135. define html_input_checkbox ()
  136. {
  137.    insert ("<input type=\"checkbox\" name=\"\" value=\"\">");
  138. }
  139.  
  140. define html_input_radio ()
  141. {
  142.    insert ("<input type=\"radio\" name=\"\" value=\"\">");
  143. }
  144.  
  145. define html_input_submit ()
  146. {
  147.    insert ("<input type=\"submit\" value=\"OK\">");
  148. }
  149.  
  150. define html_input_reset ()
  151. {
  152.    insert ("<input type=\"reset\"  value=\"Clear\">");
  153. }
  154.  
  155. define html_input_hidden ()
  156. {
  157.    insert ("<input type=\"hidden\" name=\"\" value=\"\">");
  158. }
  159.  
  160. define html_select ()
  161. {
  162.    html_insert_move ("<select name=\"@\" size=\"\">\n@\n</select>");
  163. }
  164.  
  165. define html_text_area ()
  166. {
  167.    html_insert_move ("<textarea name=\"@\"></textarea>");
  168. }
  169.  
  170. %
  171. %  Make comment
  172. %
  173. define html_comment ()
  174. {
  175.    html_insert_move ("<!-- @ -->");
  176. }
  177.  
  178. %
  179. % insert Horizontal rule  TJO
  180. %
  181. define html_horiz_rule ()
  182. {
  183.    insert("\n<HR>\n") ;
  184. }
  185.  
  186. define html_heading (c)
  187. {
  188.    html_insert_move (Sprintf ("<H%c>@</H%c>", c, c, 2));
  189. }
  190.  
  191. define html_insert_eol (str)
  192. {
  193.    eol ();
  194.    vinsert ("<%s>", str, 1);
  195. }
  196.  
  197. define html_insert_bol (str)
  198. {
  199.    bol ();
  200.    vinsert ("<%s>", str, 1);
  201. }
  202.  
  203. %
  204. % Make markers for an image
  205. %
  206. define html_image ()
  207. {
  208.    html_insert_move ("<IMG SRC=\"@\" ALT=\"\">");
  209. }
  210.  
  211. %
  212. % main entry point into the html mode
  213. % commands available to keystrokes in html mode
  214. %
  215.  
  216. define html_quoted_insert ()
  217. {
  218.    !if (input_pending (5)) flush ("`-");
  219.    switch (getkey ())
  220.      {
  221.       case '\r':
  222.     insert ("<br>\n");
  223.      }
  224.      {
  225.       case '&':
  226.     insert ("&");
  227.      }
  228.      {
  229.       case '>':
  230.     insert (">");
  231.      }
  232.      {
  233.       case '<':
  234.     insert ("<");
  235.      }
  236.      {
  237.     % default:  The other special characters should be added.
  238.     insert_char ();               
  239.      }
  240. }
  241.  
  242.  
  243. define html_read_key (hlp)
  244. {
  245.    variable key;
  246.    !if (input_pending (3)) flush (hlp);
  247.    tolower (getkey ());
  248. }
  249.  
  250. define html_keymap_a ()
  251. {
  252.    variable name = "<A NAME=\"@\"></A>";
  253.    variable href = "<A HREF=\"@\"></A>";
  254.    
  255.    switch (html_read_key ("Href  Name"))
  256.      { case 'h': href; }
  257.      { case 'a': href; }
  258.      { case 'n': name; }
  259.      {
  260.     pop (); beep (); return;
  261.      }
  262.    html_insert_move (());
  263. }
  264.  
  265. define html_keymap_d ()
  266. {
  267.    insert ("<dd>");
  268. }
  269.  
  270. define html_keymap_f ()
  271. {
  272.  
  273.    switch (html_read_key ("txtArea Chkbox Form Hidden Input Option Passw Radio Select Text Xreset Ysubmit"))
  274.      {case 'a': html_text_area (); }
  275.      {case 'c': html_input_checkbox (); }
  276.      {case 'f': html_form (); }
  277.      {case 'h': html_input_hidden (); }
  278.      {case 'i': html_input (); }
  279.      {case 'o': html_insert_bol("option"); }
  280.      {case 'p': html_input_password (); }
  281.      {case 'r': html_input_radio (); }
  282.      {case 's': html_select (); }
  283.      {case 't': html_input_text (); }
  284.      {case 'x': html_input_reset (); }
  285.      {case 'y': html_input_submit (); }
  286.      {
  287.     % default
  288.     pop ();
  289.     beep ();
  290.      }
  291. }
  292.  
  293. define html_keymap_h ()
  294. {
  295.    variable key;
  296.    switch (html_read_key ("h1  h2  h3  h4  h5  h6  templAte Doc  Head  Body  htmL  Title"))
  297.      { case 'd': html_insert_bol ("doc"); }
  298.      { case 'h': html_insert_with_newline ("head"); }
  299.      { case 'b': html_insert_with_newline ("body"); }
  300.      { case 'l': html_insert_with_newline ("html"); }
  301.      { case 't': html_insert_with_newline ("title"); }
  302.      { case 'a': html_template (); }
  303.      { % default:
  304.     key = ();
  305.     if ((key <= '6') and (key >= '1'))
  306.       html_heading (key);
  307.     else beep ();
  308.      }
  309. }
  310.  
  311. define html_keymap_i ()
  312. {
  313.    html_image ();
  314. }
  315.  
  316. define html_keymap_l ()
  317. {
  318.    switch (html_read_key ("Dir Li Menu Ordered Un-ordered"))
  319.      { case 'd': html_insert_with_newline ("dir"); }
  320.      { case 'i': html_insert_bol ("li"); }
  321.      { case 'l': html_insert_bol ("li"); }
  322.      { case 'm': html_insert_with_newline ("menu"); }
  323.      { case 'o': html_insert_with_newline ("ol"); }
  324.      { case 'u': html_insert_with_newline ("ul"); }
  325.      {
  326.     % default 
  327.     pop ();
  328.     beep ();
  329.      }
  330. }
  331.  
  332. define html_keymap_p ()
  333. {
  334.    switch (html_read_key ("Break Hrule Par blockQuote pRe"))
  335.      { case 'b': html_insert_eol ("br"); }
  336.      { case 'h': html_horiz_rule (); }
  337.      { case 'p': insert ("<p>\n"); }
  338.      { case 'q': html_insert_with_newline ("blockquote"); }
  339.      { case 'r': html_insert_with_newline ("pre"); }
  340.      {
  341.     pop();
  342.     beep ();
  343.      }
  344. }
  345.  
  346. define html_keymap_s ()
  347. {
  348.    switch (html_read_key ("Address Bold Cite Emph Ital Kbd cOde Samp Tt Uline Var"))
  349.      { case 'a': "address"; }
  350.      { case 'b': "b"; }
  351.      { case 'c': "cite"; }
  352.      { case 'e': "em"; }
  353.      { case 'i': "i"; }
  354.      { case 'k': "kbd"; }
  355.      { case 'o': "code"; }
  356.      { case 's': "samp"; }
  357.      { case 't': "tt"; }
  358.      { case 'u': "u"; }
  359.      { case 'v': "var"; }
  360.      {
  361.     pop ();    beep (); return;
  362.      }
  363.    html_simple_insert (());
  364. }
  365.  
  366.  
  367. define html_keymap ()
  368. {
  369.    switch (html_read_key ("Anchors  Dfnlists  Forms  Headings  Images  Lists  Pstyles  cStyles  ?help"))
  370.      { case 2: html_bskip_tag (); }               %  ^B
  371.      { case 6: html_skip_tag (); }               %  ^F
  372.      { case 14: html_mark_next_tag (); }   %  ^N
  373.      { case 14: html_mark_prev_tag (); }   %  ^P
  374.      { case 'c': html_comment (); }
  375.      { case 'a': html_keymap_a (); }
  376.      { case 'd': html_keymap_d (); }
  377.      { case 'f': html_keymap_f (); }
  378.      { case 'h': html_keymap_h (); }
  379.      { case 'i': html_keymap_i (); }
  380.      { case 'l': html_keymap_l (); }
  381.      { case 'p': html_keymap_p (); }
  382.      { case 's': html_keymap_s (); }
  383.      {
  384.     ungetkey (());
  385.     html_quoted_insert ();
  386.      }
  387.    flush ("");
  388. }
  389.  
  390. $1 = "html";
  391. !if (keymap_p ($1)) make_keymap ($1);
  392. undefinekey ("^C", $1);
  393. definekey("html_keymap",                             "^C", $1);
  394. undefinekey ("\e;", $1);
  395. definekey ("html_comment",   "\e;",  $1);
  396. definekey ("html_quoted_insert",   "`",  $1);
  397.  
  398.  
  399. create_syntax_table ($1);
  400. define_syntax ("<", ">", '(', $1);     %  make these guys blink match
  401. define_syntax ("<>", '<', $1);
  402. define_syntax ("<!", "->", '%', $1);
  403. define_syntax ("A-Za-z&", 'w', $1);
  404. define_syntax ('#', '#', $1);
  405.  
  406. #ifdef HAS_DFA_SYNTAX
  407. % The highlighting copes with comments, "ð" type things, and <argh> type
  408. % HTML tags. An unrecognised &..; construct or an incomplete <...> construct
  409. % is flagged in delimiter colour.
  410. enable_highlight_cache ("html.dfa", $1);
  411. define_highlight_rule ("<!.*-[ \t]*>", "Qcomment", $1);
  412. define_highlight_rule ("^([^\\-]|-+[^>])*-+[ \t]*>", "Qcomment", $1);
  413. define_highlight_rule ("<!.*", "comment", $1);
  414. define_highlight_rule ("<([^>\"]|\"[^\"]*\")*>", "keyword", $1);
  415. define_highlight_rule ("<([^>\"]|\"[^\"]*\")*(\"[^\"]*)?$", "delimiter", $1);
  416. define_highlight_rule ("&#[0-9]+;", "keyword1", $1);
  417. define_highlight_rule ("&[A-Za-z]+;", "Kdelimiter", $1);
  418. define_highlight_rule (".", "normal", $1);
  419. build_highlight_table ($1);
  420. #endif
  421.  
  422. () = define_keywords ($1, "><", 3);
  423. () = define_keywords ($1, "Ð&ð", 4);
  424. () = define_keywords ($1, strcat (
  425.                   "ÄËÏÖÜ",
  426.                   "äëï ö"üÿ"
  427.                   ), 
  428.               5);
  429.  
  430. () = define_keywords ($1, strcat (
  431.   "ÆÂÅÊÎÔÞÛâ",
  432.   "æåêîôßþû"
  433.                   ), 
  434.               6);
  435.  
  436. () = define_keywords ($1, strncat (
  437.   "ÁÀÃÇÉÈÍÌ",
  438.   "ÑÓÒØÕÚÙÝ",
  439.   "áàãçéèíì",
  440.   "ñóòøõúùý",
  441.                    4),
  442.               7);
  443.  
  444. %!% Prototype: Void html_mode ();
  445. %!% @html_mode@ is a mode designed for editing HTML files.  
  446. %!% If a region is defined (i.e., if a mark is set), many HTML
  447. %!% tags will insert around the region, e.g. '<B>' and '</B>'.
  448. %!% 
  449. %!% if the variable 'HTMLModeWraps' is set to 1, this mode will wrap
  450. %!% (like @text_mode@ does); otherwise, this mode won't wrap (like @no_mode@).
  451. %!% 
  452. %!% Keybindings begin with ^C and are grouped according to function:
  453. %!%     ^CA...  Anchors (<A>...</A>)
  454. %!%     ^CD...  Definition lists (<DL>...</DL>)
  455. %!%     ^CF...  Forms (<form>...</form>)
  456. %!%     ^CH...  Headings, document type, etc.
  457. %!%     ^CI...  Images
  458. %!%     ^CL...  Lists (<UL>...</UL>)
  459. %!%     ^CP...  Paragraph styles, etc. (<P>, <BR>, <HR>, <ADDRESS>, etc.)
  460. %!%     ^CS...  Character styles (<EM>, <STRONG>, <B>, <I>, etc.)
  461. %!% Additionally, some special movement commands and miscellaneous
  462. %!% characters are defined:
  463. %!%     ^C^B    skip to beginning of prior HTML tag
  464. %!%     ^C^F    skip to end of next HTML tag
  465. %!%     ^C^N    mark next HTML tag from '<' to '>'
  466. %!%     ^C^P    mark prior HTML tag from '<' to '>'
  467. %!%     ^C&     insert HTML text for '&'
  468. %!%     ^C>     insert HTML text for '>'
  469. %!%     ^C<     insert HMTL text for '<'
  470. %!%     ^CC     insert HTML comment (around region, if marked)
  471. %!% 
  472. %!% For a complete list of keybindings, use @describe_bindings@.
  473. %!% 
  474. %!% This function calls @html_mode_hook@ if it exists.
  475. define html_mode ()
  476. {
  477.    variable html = "html";
  478.  
  479.    set_mode(html, 1);
  480.    set_buffer_hook ("par_sep", "html_paragraph_separator");
  481.    use_syntax_table (html);
  482.    use_keymap (html);
  483.    runhooks ("html_mode_hook");
  484. }
  485.  
  486.  
  487.      
  488.