% File: docbook.sl -*- SLang -*- % % Author: Guido Gonzato, % % Version: 1.0.0. % % Description: this mode is designed to facilitate the editing of % Docbook SGML files. It supports a large subset of Docbook % 3.1, as described in the LDP Author Guide % and % "Docbook: The Definive Guide" % Complete enough for writing Linux HOWTOs, manuals, and much % more... % For Jed 0.99.13+. % % Installation: if opening a document with .sgml extension doesn't toggle % docbook mode on, then insert these lines in your .jedrc: % % autoload ("docbook_mode", "docbook"); % add_mode_for_extension ("docbook", "sgml"); % % Last updated: 24 May 2001 WRAP_INDENTS = 1; % you really want this custom_variable ("SGML_INDENT", 2); custom_variable ("Sgml_Compile_PS_Cmd", "db2ps"); custom_variable ("Sgml_Compile_Pdf_Cmd", "db2pdf"); custom_variable ("Sgml_Compile_Html_Cmd", "db2html"); custom_variable ("Sgml_View_PS_Cmd", "gv"); custom_variable ("Sgml_View_Pdf_Cmd", "gv"); custom_variable ("Sgml_View_Html_Cmd", "netscape"); static variable NO_PUSH_SPOT = 0; static variable PUSH_SPOT = 1; static variable NO_POP_SPOT = 0; static variable POP_SPOT = 1; % buffer-local variables variable DOC_TYPE = "DOC_TYPE"; % "a" = article, "b" = book variable SECT_TYPE = "SECT_TYPE"; % "#" = sect#, "s" = section % ----- % !if (is_defined ("tex_ldots")) % read tex_insert_quote () = evalfile ("texcom"); static define sgml_insert_pair_around_region (left, right) { check_region (1); exchange_point_and_mark (); insert (left); exchange_point_and_mark (); insert (right); pop_spot (); pop_mark_0 (); } define sgml_skip_tag () % ^C^F { go_right_1 (); () = fsearch_char ('<'); } define sgml_bskip_tag () % ^C^B { () = bsearch_char ('<'); } static define sgml_insert_tags (tag1, tag2, do_push_spot, do_pop_spot) { % if a region is defined, insert the tags around it if (markp () ) { sgml_insert_pair_around_region (tag1, tag2); return; } insert (tag1); if (do_push_spot) push_spot (); insert (tag2); if (do_pop_spot) pop_spot (); } define sgml_insert_tag (tag, do_push_spot, do_pop_spot) { variable tag1, tag2; tag1 = sprintf ("<%s>", tag); tag2 = sprintf ("", tag); sgml_insert_tags (tag1, tag2, do_push_spot, do_pop_spot); } static define sgml_insert_tag_with_newline (tag, do_push_spot, do_pop_spot) { variable tag1, tag2; tag1 = sprintf ("<%s>", tag); tag2 = sprintf ("\n", tag); sgml_insert_tags (tag1, tag2, do_push_spot, do_pop_spot); } static define sgml_paragraph_separator () { variable cs = CASE_SEARCH; bol_skip_white (); CASE_SEARCH = 0; eolp () or ffind ("") or ffind (""); CASE_SEARCH = cs; } % let's start % Section stuff define sgml_para (do_push_spot) % ^CP { variable col = what_column () - 1; if (markp () ) { sgml_insert_pair_around_region ("\n", "\n"); return; } insert ("\n"); insert_spaces (col + SGML_INDENT); if (do_push_spot) push_spot (); insert ("\n"); insert_spaces (col); insert (""); } define sgml_title (tag, do_push_spot) { sgml_insert_tag_with_newline (tag, do_push_spot, NO_POP_SPOT); } static define sgml_section_skel (what_tag, do_push_spot) { variable col = what_column () - 1; vinsert ("<%s>\n", what_tag); insert_spaces (col); sgml_title ("title", do_push_spot); insert ("\n"); insert_spaces (col); sgml_para (NO_PUSH_SPOT); insert ("\n\n"); insert_spaces (col); vinsert ("", what_tag); if (do_push_spot) pop_spot (); } define sgml_chapter (do_push_spot) { sgml_section_skel ("chapter", do_push_spot); } define sgml_sidebar (do_push_spot) { sgml_section_skel ("sidebar", do_push_spot); } define sgml_appendix (do_push_spot) { sgml_section_skel ("appendix", do_push_spot); } define sgml_epigraph () { variable col = what_column () - 1; insert ("\n"); insert_spaces (col + SGML_INDENT); insert (""); push_spot (); insert ("\n"); insert_spaces (col + SGML_INDENT); sgml_para (NO_PUSH_SPOT); insert ("\n"); insert_spaces (col); insert ("\n"); pop_spot (); } define sgml_section () % ^CS { variable col = what_column () - 1; if ("#" == get_blocal_var (SECT_TYPE)) { beep (); error ("`section' not allowed in this environment!"); % !!! what about
and in Book doctype? return (); } set_blocal_var ("s", SECT_TYPE); sgml_section_skel ("section", PUSH_SPOT); } define sgml_simple_section () { sgml_section_skel ("simplesect", PUSH_SPOT); } define sgml_sect (do_push_spot, level_str) % ^CN { variable level_int; variable ok = 0; if ( ("s" == get_blocal_var (SECT_TYPE) ) and ("a" == get_blocal_var (DOC_TYPE) ) ) { beep (); error ("`sect' not allowed in this environment!"); return (); } set_blocal_var ("#", SECT_TYPE); !if (strcmp ("0", level_str) ) while (0 == ok) { level_str = read_mini ("Section level (1..5)?", Null_String, "1"); level_int = level_str [0] - '0'; if ( (level_int > 0) and (level_int < 6) ) ok = 1; !if (ok) { beep (); message ("Wrong value! Only 1..5 allowed. "); } } insert (sprintf ("\n"); sgml_title ("title", NO_PUSH_SPOT); insert ("\n"); sgml_para (NO_PUSH_SPOT); insert (sprintf ("\n\n\n", level_str)); if (do_push_spot) pop_spot (); } define sgml_formalpara () { sgml_section_skel ("formalpara", PUSH_SPOT); } % Header stuff define sgml_revision () { variable col = what_column () - 1; insert ("\n"); insert_spaces (col + SGML_INDENT); insert (""); push_spot (); % pop_spot () later insert ("\n"); insert_spaces (col + SGML_INDENT); sgml_insert_tag_with_newline ("date", NO_PUSH_SPOT, NO_POP_SPOT); insert_spaces (col + SGML_INDENT); sgml_insert_tag_with_newline ("authorinitial", NO_PUSH_SPOT, NO_POP_SPOT); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col); insert ("\n"); } define sgml_revision_history () { variable col = what_column () - 1; insert ("\n"); insert_spaces (col + SGML_INDENT); sgml_revision (); % the spot is pushed insert_spaces (col); insert (""); pop_spot (); } % Author stuff static define sgml_firstname (do_push_spot, do_pop_spot) { sgml_insert_tag_with_newline ("firstname", do_push_spot, do_pop_spot); } static define sgml_surname (do_push_spot, do_pop_spot) { sgml_insert_tag_with_newline ("surname", do_push_spot, do_pop_spot); } static define sgml_othername (do_push_spot, do_pop_spot) { sgml_insert_tag_with_newline ("othername", do_push_spot, do_pop_spot); } static define sgml_affiliation (do_push_spot, do_pop_spot) { variable col = what_column () - 1; insert ("\n"); insert_spaces (col + SGML_INDENT); sgml_insert_tag_with_newline ("shortaffil", do_push_spot, do_pop_spot); insert_spaces (col + SGML_INDENT); sgml_insert_tag_with_newline ("jobtitle", do_push_spot, do_pop_spot); insert_spaces (col + SGML_INDENT); sgml_insert_tag_with_newline ("orgname", do_push_spot, do_pop_spot); insert_spaces (col + SGML_INDENT); sgml_insert_tag_with_newline ("orgdiv", do_push_spot, do_pop_spot); insert_spaces (col); insert ("\n"); } static define sgml_honorific (do_push_spot, do_pop_spot) { sgml_insert_tag_with_newline ("honorific", do_push_spot, do_pop_spot); } define sgml_author (do_push_spot, do_pop_spot) { variable col = what_column () - 1; insert ("\n"); if (do_push_spot) push_spot (); insert_spaces (col + SGML_INDENT); sgml_honorific (do_push_spot, NO_POP_SPOT); insert_spaces (col + SGML_INDENT); sgml_firstname (do_push_spot, NO_POP_SPOT); insert_spaces (col + SGML_INDENT); sgml_othername (do_push_spot, NO_POP_SPOT); insert_spaces (col + SGML_INDENT); sgml_surname (do_push_spot, NO_POP_SPOT); insert_spaces (col + SGML_INDENT); sgml_affiliation (do_push_spot, NO_POP_SPOT); insert_spaces (col); insert ("\n"); if (do_pop_spot) pop_spot (); } define sgml_template () { variable col, ok, type, is_article = 0; col = what_column () - 1; ok = 0; while (0 == ok) { type = read_mini ("Document type (Article, Book)?", Null_String, "a"); if ( (type [0] == 'a') or (type [0] == 'b') ) ok = 1; !if (ok) { beep (); message ("Wrong! 'a' or 'b'! "); } } if (type [0] == 'a') { set_blocal_var ("a", DOC_TYPE); type = "article"; is_article = 1; } else { set_blocal_var ("b", DOC_TYPE); type = "book"; } vinsert ("", type); if (is_article) vinsert ("\n\n<%s lang=\"en\">\n<%s>\n\n", type, "artheader"); else vinsert ("\n\n<%s lang=\"en\">\n<%s>\n\n", type, "bookinfo"); insert_spaces (col + SGML_INDENT); sgml_title ("title", PUSH_SPOT); insert_spaces (col + SGML_INDENT); sgml_insert_tag_with_newline ("subtitle", NO_PUSH_SPOT, NO_POP_SPOT); insert_spaces (col + SGML_INDENT); sgml_author (NO_PUSH_SPOT, NO_POP_SPOT); insert_spaces (col + SGML_INDENT); insert ("
\n"); insert_spaces (col + 2 * SGML_INDENT); sgml_insert_tag_with_newline ("email", NO_PUSH_SPOT, NO_POP_SPOT); insert_spaces (col + SGML_INDENT); insert ("
\n"); insert_spaces (col + SGML_INDENT); sgml_insert_tag_with_newline ("pubdate", NO_PUSH_SPOT, NO_POP_SPOT); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col + 2 * SGML_INDENT); sgml_para (NO_PUSH_SPOT); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); if (is_article) { vinsert ("\n\n\n", "artheader"); insert ("\n"); } else { vinsert ("\n\n\n\n", "bookinfo"); insert ("\n\n\n"); sgml_para (NO_PUSH_SPOT); insert ("\n\n\n"); sgml_chapter (NO_PUSH_SPOT); } vinsert ("\n\n\n", type); pop_spot (); } define sgml_copyright () { variable col = what_column () - 1; insert_spaces (col); insert ("\n"); insert_spaces (col + SGML_INDENT); insert (""); push_spot (); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col); insert ("\n"); pop_spot (); } % character styles define sgml_directory () { insert (""); push_spot (); insert (""); pop_spot (); } % keys define sgml_keycombo (do_push_spot) { insert (""); if (do_push_spot) push_spot (); insert (""); if (do_push_spot) pop_spot (); } % gui/menus define sgml_menuchoice () { variable col = what_column () - 1; insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col + 2 * SGML_INDENT); sgml_keycombo (NO_PUSH_SPOT); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col + SGML_INDENT); insert (""); push_spot (); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col); insert ("\n"); pop_spot (); } % computer-related define sgml_arg_plain (do_push_spot, do_pop_spot) { sgml_insert_tag ("arg", do_push_spot, do_pop_spot); } define sgml_arg (do_push_spot, do_pop_spot) { variable ch, rep, choice, tag1, tag2, sep1, sep2; choice = ""; rep = ""; sep1 = " "; sep2 = " "; flush ("Choice: Req Plain (Enter=nothing) "); ch = tolower (getkey ()); switch (ch) {case 'r': choice = "choice=req"; } {case 'p': choice = "req=plain"; } flush ("Rep: Repeat (Enter=nothing) "); ch = tolower (getkey ()); switch (ch) {case 'r': rep = "rep=repeat"; } !if (strlen(choice)) sep1= ""; !if (strlen(rep)) sep2= ""; tag1 = sprintf ("", sep1, choice, sep2, rep ); tag2 = ""; sgml_insert_tags (tag1, tag2, do_push_spot, do_pop_spot); } static define sgml_replaceable (do_push_spot, do_pop_spot) { sgml_insert_tag ("replaceable", do_push_spot, do_pop_spot); } define sgml_group () { variable col = what_column () - 1; insert ("\n"); insert_spaces (col + SGML_INDENT); sgml_arg (PUSH_SPOT, NO_POP_SPOT); insert ("\n"); insert_spaces (col); insert ("\n"); pop_spot (); } define sgml_cmdsynopsis () { variable col = what_column () - 1; insert ("\n"); insert_spaces (col + SGML_INDENT); insert (""); push_spot (); insert ("\n"); insert_spaces (col + SGML_INDENT); sgml_arg (NO_PUSH_SPOT); insert ("\n"); insert_spaces (col); insert ("\n"); pop_spot (); } % environments, sort of define sgml_blockquote () { variable col = what_column () - 1; insert ("
\n"); insert_spaces (col); insert (""); push_spot (); insert ("\n"); insert_spaces (col + SGML_INDENT); sgml_para (NO_PUSH_SPOT); insert ("\n"); insert_spaces (col); insert ("
"); pop_spot (); } define sgml_env (what) { variable col = what_column () - 1; vinsert ("<%s>\n", what); insert_spaces (col); !if (strcmp ("example", what)) { sgml_title ("title", PUSH_SPOT); insert_spaces (col + SGML_INDENT); sgml_para (NO_PUSH_SPOT); insert ("\n"); } else { insert_spaces (col + SGML_INDENT); sgml_para (PUSH_SPOT); insert ("\n"); } insert_spaces (col); vinsert ("\n", what); pop_spot (); } % links define sgml_id () { insert ("id=\""); push_spot (); insert ("\""); } define sgml_anchor () { insert (""); pop_spot (); } define sgml_url () { insert (""); pop_spot (); } define sgml_xref () { insert (""); pop_spot (); } % lists define sgml_listitem (do_push_spot) { variable col = what_column () - 1; insert ("\n"); insert_spaces (col + SGML_INDENT); sgml_para (do_push_spot); insert ("\n"); insert_spaces (col); insert (""); } define sgml_itemized_list () { variable col = what_column () - 1; insert ("\n"); insert_spaces (col + SGML_INDENT); sgml_listitem (PUSH_SPOT); insert ("\n"); insert_spaces (col); insert ("\n"); pop_spot (); } define sgml_ordered_list () { variable col = what_column () - 1; insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col + 2 * SGML_INDENT); insert ("\n"); insert_spaces (col + 2 * SGML_INDENT); push_spot (); insert ("\n"); insert_spaces (col + 2 * SGML_INDENT); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); insert ("\n"); pop_spot (); } define sgml_varlistentry () { variable col = what_column () - 1; insert ("\n"); insert_spaces (col + SGML_INDENT); insert (""); push_spot (); % we'll do pop_spot () later insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col + 2 * SGML_INDENT); sgml_para (NO_PUSH_SPOT); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col); insert ("\n"); } define sgml_variable_list () { variable col = what_column () - 1; insert ("\n"); insert_spaces (col + SGML_INDENT); sgml_varlistentry (); insert ("\n"); pop_spot (); } define sgml_seglistitem (do_push_spot) { variable col = what_column () - 1; insert ("\n"); insert_spaces (col + SGML_INDENT); insert (""); if (do_push_spot) push_spot (); insert ("\n"); insert_spaces (col); insert (""); } define sgml_segmented_list () { variable col = what_column () - 1; insert ("\n"); insert_spaces (col + SGML_INDENT); sgml_title ("title", push_spot); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col + SGML_INDENT); sgml_seglistitem (NO_PUSH_SPOT); insert ("\n"); insert_spaces (col); insert ("\n"); pop_spot (); } define sgml_step (do_push_spot) { variable col = what_column () - 1; insert ("\n"); insert_spaces (col + SGML_INDENT); sgml_para (do_push_spot); insert ("\n"); insert_spaces (col); insert (""); if (1 == do_push_spot) pop_spot (); } define sgml_procedure () { variable col = what_column () - 1; insert ("\n"); insert_spaces (col + SGML_INDENT); sgml_title ("title", PUSH_SPOT); insert_spaces (col + SGML_INDENT); sgml_step (NO_PUSH_SPOT); insert ("\n"); insert_spaces (col); insert ("\n"); pop_spot (); } % tables define sgml_table_row (table_col_int, do_push_spot) { variable i, col = what_column () - 1; insert ("\n"); for (i = 0; i < table_col_int; i++) { insert_spaces (col + SGML_INDENT); insert (""); if ( (do_push_spot) and (0 == i) ) push_spot (); insert ("\n"); } insert_spaces (col); insert (""); } define sgml_align () { variable ch, align; flush ("Align (Center cHar Justify Left Right)? "); ch = tolower (getkey ()); switch (ch) {case 'c': align = "center"; } {case 'h': align = "char"; } {case 'j': align = "justify"; } {case 'l': align = "left"; } {case 'r': align = "right"; } vinsert ("align=\"%s\"", align); } % static static variable table_columns = 4; define sgml_table (informal_table) { variable col = what_column () - 1; variable i, ch, frame, type_of_table, table_col_str, ok; if (informal_table) type_of_table = "informaltable"; else type_of_table = "table"; flush ("Frame (All, Bottom, None, Sides, Top, tOpbot)? "); ch = tolower (getkey ()); switch (ch) {case 'a': frame = "all"; } {case 'b': frame = "bottom"; } {case 'n': frame = "none"; } {case 's': frame = "sides"; } {case 't': frame = "top"; } {case 'o': frame = "topbot"; } ok = 0; while (0 == ok) { table_col_str = read_mini ("Columns?", Null_String, "4"); table_columns = table_col_str [0] - '0'; if ( (table_columns > 1) and (table_columns < 10) ) ok = 1; !if (ok) { beep (); message ("Wrong value! "); } } vinsert ("<%s frame=\"%s\">\n", type_of_table, frame); !if (informal_table) sgml_title ("title", PUSH_SPOT); else push_spot (); insert_spaces (col + SGML_INDENT); insert (sprintf ("\n\n", table_col_str)); for (i = 0; i < table_columns; i++) { insert_spaces (col + SGML_INDENT); vinsert ("\n", string (i+1) ); } !if (informal_table) { insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col + SGML_INDENT); sgml_table_row (table_columns, NO_PUSH_SPOT); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); for (i = 0; i < table_columns; i++) { insert_spaces (col + 2 * SGML_INDENT); insert ("\n"); } insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); } insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); for (i = 0; i < table_columns; i++) { insert_spaces (col + 2 * SGML_INDENT); insert ("\n"); } insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col); vinsert ("\n", type_of_table); pop_spot (); } % figures define sgml_figure () { variable i, col = what_column () - 1; insert ("
\n"); insert_spaces (col + SGML_INDENT); insert (""); push_spot (); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); for (i = 0; i < 2; i++) { insert_spaces (col + 2 * SGML_INDENT); insert ("\n"); insert_spaces (col + 3 * SGML_INDENT); insert ("\n"); insert_spaces (col + 2 * SGML_INDENT); insert ("\n"); } insert_spaces (col + 2 * SGML_INDENT); insert ("\n"); insert_spaces (col + 3 * SGML_INDENT); insert ("\n"); insert_spaces (col + 2 * SGML_INDENT); insert ("\n"); insert_spaces (col + SGML_INDENT); insert ("\n"); insert_spaces (col); insert ("
\n"); pop_spot (); } define insert_sgml_screen () { % this function is redundant, but I can't find a way to pass % Width="80" through menu_append_item sgml_insert_tags ("\n", "\n", PUSH_SPOT, NO_POP_SPOT); } define sgml_convert_to_ps () { variable mrk, cmd; mrk = create_user_mark; cmd = sprintf ("%s %s", Sgml_Compile_PS_Cmd, mrk.buffer_name); cmd = read_mini ("Convert command:", Null_String, cmd); compile (cmd); } define sgml_convert_to_pdf () { variable mrk, cmd; mrk = create_user_mark; cmd = sprintf ("%s %s", Sgml_Compile_Pdf_Cmd, mrk.buffer_name); cmd = read_mini ("Convert command:", Null_String, cmd); compile (cmd); } define sgml_convert_to_html () { variable mrk, cmd; mrk = create_user_mark; cmd = sprintf ("%s %s", Sgml_Compile_Html_Cmd, mrk.buffer_name); cmd = read_mini ("Convert command:", Null_String, cmd); compile (cmd); } define sgml_view (type) { variable mrk, cmd, tmp; mrk = create_user_mark; tmp = mrk.buffer_name; (tmp, ) = strreplace (tmp, "sgml", type, -1); switch (type) { case "ps": cmd = sprintf ("%s %s &", Sgml_View_PS_Cmd, tmp); } { case "pdf": cmd = sprintf ("%s %s &", Sgml_View_Pdf_Cmd, tmp); } { case "html": cmd = sprintf ("%s %s &", Sgml_View_Html_Cmd, tmp); } cmd = read_mini ("View with:", Null_String, cmd); #ifdef UNIX () = system (cmd); #else () = run_shell_cmd (cmd); #endif } % let's finish % defining keywords is not necessary, since all the highlighting is % done by the second and third define_syntax (). Rough, but fairly nice. $1 = "docbook"; create_syntax_table ($1); define_syntax ("\"([{<", "\")]}>", '(', $1); define_syntax ('<', '\\', $1); define_syntax ('&', '\\', $1); define_syntax ("0-9A-Za-z>/!", 'w', $1); define_syntax ("<>", '<', $1); define_syntax ("", '%', $1); % copied from html mode. #ifdef HAS_DFA_SYNTAX % The highlighting copes with comments, "ð" type things, and type % HTML tags. An unrecognised &..; construct or an incomplete <...> construct % is flagged in delimiter colour. %%% DFA_CACHE_BEGIN %%% static define setup_dfa_callback (name) { dfa_enable_highlight_cache ("docbook.dfa", name); dfa_define_highlight_rule ("", "Qcomment", name); dfa_define_highlight_rule ("^([^\\-]|-+[^>])*-+[ \t]*>", "Qcomment", name); dfa_define_highlight_rule ("\"]|\"[^\"]*\")*>", "keyword", name); dfa_define_highlight_rule ("<([^>\"]|\"[^\"]*\")*(\"[^\"]*)?$", "delimiter", name); dfa_define_highlight_rule ("&#[0-9]+;", "keyword1", name); dfa_define_highlight_rule ("&[A-Za-z]+;", "Kdelimiter", name); dfa_define_highlight_rule (".", "normal", name); dfa_build_highlight_table (name); } dfa_set_init_callback (&setup_dfa_callback, "docbook"); %%% DFA_CACHE_END %%% #endif static define init_menu (menu) { % header menu_append_popup (menu, "&Header"); variable m = sprintf ("%s.&Header", menu); menu_append_item (m, "<&ackno>", "sgml_insert_tag (\"ackno\", 1, 1)"); menu_append_item (m, "", "sgml_author (1, 1)"); menu_append_item (m, "<©right>", "sgml_copyright ()"); menu_append_item (m, "", "sgml_revision_history ()"); menu_append_item (m, "<&revision>", "sgml_revision (); pop_spot ()"); menu_append_item (m, "&Template", "sgml_template ()"); % sections menu_append_popup (menu, "&Section"); m = sprintf ("%s.&Section", menu); menu_append_item (m, "<&appendix>", "sgml_appendix (1)"); menu_append_item (m, "<&chapter>", "sgml_chapter (1)"); menu_append_item (m, "<&epigraph>", "sgml_epigraph ()"); menu_append_item (m, "<&formalpara>", "sgml_formalpara ()"); menu_append_item (m, "", "sgml_simple_section ()"); menu_append_item (m, "&numbered section", "sgml_sect (1, \"0\")"); menu_append_item (m, "<§ion>", "sgml_section ()"); menu_append_item (m, "", "sgml_sidebar (1)"); menu_append_item (m, "<&title>", "sgml_title (\"title\", 1); pop_spot ()"); menu_append_item (m, "", "sgml_title (\"subtitle\", 1); pop_spot ()"); % character menu_append_popup (menu, "&Character"); m = sprintf ("%s.&Character", menu); menu_append_item (m, "<&acronym>", "sgml_insert_tag (\"acronym\", 1, 1)"); menu_append_item (m, "<&citation>", "sgml_insert_tag (\"citation\", 1, 1)"); menu_append_item (m, "<&emphasis>", "sgml_insert_tag (\"emphasis\", 1, 1)"); menu_append_item (m, "<&firstterm>", "sgml_insert_tag (\"firstterm\", 1, 1)"); menu_append_item (m, "", "sgml_insert_tag (\"footnote\", 1, 1)"); menu_append_item (m, "<&superscript>", "sgml_insert_tag (\"superscript\", 1, 1)"); menu_append_item (m, "", "sgml_insert_tag (\"subscript\", 1, 1)"); % computer menu_append_popup (menu, "C&omputer"); m = sprintf ("%s.C&omputer", menu); menu_append_item (m, "<&application>", "sgml_insert_tag (\"application\", 1, 1)"); menu_append_item (m, "", "sgml_insert_tag (\"mousebutton\", 1, 1)"); menu_append_item (m, "<&command>", "sgml_insert_tag (\"command\", 1, 1)"); menu_append_item (m, "&directory", "sgml_directory ()"); menu_append_item (m, "<&envar>", "sgml_insert_tag (\"envar\", 1, 1)"); menu_append_item (m, "<&filename>", "sgml_insert_tag (\"filename\", 1, 1)"); menu_append_item (m, "", "sgml_insert_tag (\"function\", 1, 1)"); menu_append_item (m, "", "sgml_insert_tag (\"programlisting\", 1, 1)"); menu_append_item (m, "", "sgml_insert_tag (\"computeroutput\", 1, 1)"); menu_append_item (m, "", "sgml_insert_tag (\"constant\", 1, 1)"); menu_append_item (m, "<&prompt>", "sgml_insert_tag (\"prompt\", 1, 1)"); menu_append_item (m, "<&screen>", "insert_sgml_screen ()"); menu_append_item (m, "<&userinput>", "sgml_insert_tag (\"userinput\", 1, 1)"); menu_append_item (m, "<&varname>", "sgml_insert_tag (\"varname\", 1, 1)"); % computer: popups menu_append_popup (m, "&Menu"); menu_append_popup (m, "&Keys"); menu_append_popup (m, "CmdS&ynopsis"); % computer/menu m = sprintf ("%s.C&omputer.&Menu", menu); menu_append_item (m, "<&accel>", "sgml_insert_tag (\"accel\", 1, 1)"); menu_append_item (m, "", "sgml_menuchoice ()"); menu_append_item (m, "<&guimenu>", "sgml_insert_tag (\"guimenu\", 1, 1)"); menu_append_item (m, "", "sgml_insert_tag (\"guimenuitem\", 1, 1)"); % computer/keys m = sprintf ("%s.C&omputer.&Keys", menu); menu_append_item (m, "", "sgml_insert_tag (\"keycap\", 1, 1)"); menu_append_item (m, "", "sgml_insert_tag (\"keysym\", 1, 1)"); menu_append_item (m, "", "sgml_insert_tag (\"keycode\", 1, 1)"); menu_append_item (m, "", "sgml_keycombo (1)"); % computer/cmdsynopsis m = sprintf ("%s.C&omputer.CmdS&ynopsis", menu); menu_append_item (m, "<&arg>", "sgml_arg (1, 1)"); menu_append_item (m, "<&break>", "insert (\"\\n\")"); menu_append_item (m, "", "sgml_cmdsynopsis ()"); menu_append_item (m, "&plain ", "sgml_arg_plain (1, 1)"); menu_append_item (m, "<&group>", "sgml_group ()"); menu_append_item (m, "<&replaceable>", "sgml_insert_tag (\"replaceable\", 1, 1)"); % environment menu_append_popup (menu, "&Environment"); m = sprintf ("%s.&Environment", menu); menu_append_item (m, "<&blockquote>", "sgml_blockquote ()"); menu_append_item (m, "<&caution>", "sgml_env (\"caution\")"); menu_append_item (m, "<&example>", "sgml_env (\"example\")"); menu_append_item (m, "<&important>", "sgml_env (\"important\")"); menu_append_item (m, "<¬e>", "sgml_env (\"note\")"); menu_append_item (m, "<&tip>", "sgml_env (\"tip\")"); menu_append_item (m, "<&warning>", "sgml_env (\"warning\")"); % links menu_append_popup (menu, "Lin&k"); m = sprintf ("%s.Lin&k", menu); menu_append_item (m, "<&anchor>", "sgml_anchor ()"); menu_append_item (m, "<&email>", "sgml_insert_tag (\"email\")"); menu_append_item (m, "<&id>", "sgml_id (); pop_spot ()"); menu_append_item (m, "<&url>", "sgml_url ()"); menu_append_item (m, "<&xref>", "sgml_xref ()"); % lists menu_append_popup (menu, "&List"); m = sprintf ("%s.&List", menu); menu_append_item (m, "<&itemizedlist>", "sgml_itemized_list ()"); menu_append_item (m, "<&listitem>", "sgml_listitem (1); pop_spot ()"); menu_append_item (m, "<&orderedlist>", "sgml_ordered_list ()"); menu_append_item (m, "<&segmentedlist>", "sgml_segmented_list ()"); menu_append_item (m, "<&variablelist>", "sgml_variable_list ()"); menu_append_item (m, "", "sgml_varlistentry (); pop_spot ()"); menu_append_item (m, "", "sgml_seglistitem (1); pop_spot ()"); menu_append_item (m, "<&procedure>", "sgml_procedure ()"); menu_append_item (m, "", "sgml_step (1)"); % table menu_append_popup (menu, "&Table"); m = sprintf ("%s.&Table", menu); menu_append_item (m, "<&align>", "sgml_align ()"); menu_append_item (m, "<&informaltable>", "sgml_table (1)"); menu_append_item (m, "<&table>", "sgml_table (0)"); menu_append_item (m, "<&row>", "sgml_table_row (table_columns, 1, 1); pop_spot ()"); % paragraph menu_append_item (menu, "<¶>", "sgml_para (1); pop_spot ()"); % figure menu_append_item (menu, "<&figure>", "sgml_figure ()"); % separator menu_append_separator (menu); % convert to... menu_append_item (menu, "Convert To &PostScript", "sgml_convert_to_ps ()"); menu_append_item (menu, "Convert To P&DF", "sgml_convert_to_pdf ()"); menu_append_item (menu, "Convert To &HTML", "sgml_convert_to_html ()"); menu_append_item (menu, "&View PostScript", "sgml_view (\"ps\")"); menu_append_item (menu, "View PDF", "sgml_view (\"ps\")"); menu_append_item (menu, "V&iew HTML", "sgml_view (\"html\")"); } $1 = "docbook"; !if (keymap_p ($1)) make_keymap ($1); % various keymaps definekey_reserved ("sgml_bskip_tag", "^B", $1); definekey_reserved ("sgml_skip_tag", "^F", $1); definekey_reserved ("sgml_para (1); pop_spot ()", "p", $1); definekey_reserved ("sgml_section ()", "ss", $1); definekey_reserved ("sgml_sect (1, \"0\"))", "sn", $1); definekey_reserved ("insert (\"$\")", "$", $1); definekey_reserved ("insert (\"&\")", "&", $1); definekey_reserved ("sgml_comment", ";", $1); definekey_reserved ("insert (\"…\")", ".", $1); definekey_reserved ("insert (\"<\")", "<", $1); definekey_reserved ("insert (\">\")", ">", $1); definekey_reserved ("sgml_convert_to_ps ()", "cp", $1); definekey_reserved ("sgml_convert_to_pdf ()", "cd", $1); definekey_reserved ("sgml_convert_to_html ()", "ch", $1); definekey_reserved ("sgml_convert_to_ps ()", "cp", $1); definekey_reserved ("sgml_view (\"ps\")", "vp", $1); definekey_reserved ("sgml_view (\"pdf\")", "vd", $1); definekey_reserved ("sgml_view (\"html\")", "vh", $1); % template definekey_reserved ("sgml_insert_tag (\"ackno\", 1, 1)", "ha", $1); definekey_reserved ("sgml_author (1, 1)", "hu", $1); definekey_reserved ("sgml_copyright ()", "hc", $1); definekey_reserved ("sgml_revision_history ()", "hh", $1); definekey_reserved ("sgml_revision (); pop_spot ()", "hr", $1); definekey_reserved ("sgml_template ()", "ht", $1); % section definekey_reserved ("sgml_appendix (1)", "sa", $1); definekey_reserved ("sgml_chapter (1)", "sc", $1); definekey_reserved ("sgml_epigraph ()", "se", $1); definekey_reserved ("sgml_formalpara ()", "sf", $1); definekey_reserved ("sgml_simple_section ()", "sm", $1); definekey_reserved ("sgml_sect (1, \"0\")", "sn", $1); definekey_reserved ("sgml_sidebar (1)", "si", $1); definekey_reserved ("sgml_title (\"title\", 1); pop_spot ()", "st", $1); definekey_reserved ("sgml_title (\"subtitle\", 1); pop_spot ()", "su", $1); % character definekey_reserved ("sgml_insert_tag (\"acronym\", 1, 1)", "ca", $1); definekey_reserved ("sgml_insert_tag (\"citation\", 1, 1)", "cc", $1); definekey_reserved ("sgml_insert_tag (\"emphasis\", 1, 1)", "ce", $1); definekey_reserved ("sgml_insert_tag (\"firstterm\", 1, 1)", "cf", $1); definekey_reserved ("sgml_insert_tag (\"footnote\", 1, 1)", "cn", $1); definekey_reserved ("sgml_insert_tag (\"superscript\", 1, 1)", "cs", $1); definekey_reserved ("sgml_insert_tag (\"subscript\", 1, 1)", "cu", $1); % computer definekey_reserved ("sgml_insert_tag (\"application\", 1, 1)", "oa", $1); definekey_reserved ("sgml_insert_tag (\"mousebutton\", 1, 1)", "ob", $1); definekey_reserved ("sgml_insert_tag (\"command\", 1, 1)", "oc", $1); definekey_reserved ("sgml_directory ()", "od", $1); definekey_reserved ("sgml_insert_tag (\"envar\", 1, 1)", "oe", $1); definekey_reserved ("sgml_insert_tag (\"filename\", 1, 1)", "of", $1); definekey_reserved ("sgml_insert_tag (\"function\", 1, 1)", "on", $1); definekey_reserved ("sgml_insert_tag (\"programlisting\", 1, 1)", "ol", $1); definekey_reserved ("sgml_insert_tag (\"computeroutput\", 1, 1)", "oo", $1); definekey_reserved ("sgml_insert_tag (\"constant\", 1, 1)", "ot", $1); definekey_reserved ("sgml_insert_tag (\"prompt\", 1, 1)", "op", $1); definekey_reserved ("insert_sgml_screen ()", "os", $1); definekey_reserved ("sgml_insert_tag (\"userinput\", 1, 1)", "ou", $1); definekey_reserved ("sgml_insert_tag (\"varname\", 1, 1)", "ov", $1); % environment definekey_reserved ("sgml_blockquote ()", "eb", $1); definekey_reserved ("sgml_env (\"caution\")", "ec", $1); definekey_reserved ("sgml_env (\"example\")", "ee", $1); definekey_reserved ("sgml_env (\"important\")", "ei", $1); definekey_reserved ("sgml_env (\"note\")", "en", $1); definekey_reserved ("sgml_env (\"tip\")", "et", $1); definekey_reserved ("sgml_env (\"warning\")", "ew", $1); % links definekey_reserved ("sgml_anchor ()", "ka", $1); definekey_reserved ("sgml_insert_tag (\"email\")", "ke", $1); definekey_reserved ("sgml_id (); pop_spot ()", "ki", $1); definekey_reserved ("sgml_url ()", "ku", $1); definekey_reserved ("sgml_xref ()", "kx", $1); % lists definekey_reserved ("sgml_itemized_list ()", "li", $1); definekey_reserved ("sgml_listitem (1); pop_spot ()", "ll", $1); definekey_reserved ("sgml_ordered_list ()", "lo", $1); definekey_reserved ("sgml_segmented_list ()", "ls", $1); definekey_reserved ("sgml_variable_list ()", "lv", $1); definekey_reserved ("sgml_varlistentry (); pop_spot ()", "le", $1); definekey_reserved ("sgml_seglistitem (1); pop_spot ()", "lg", $1); definekey_reserved ("sgml_procedure ()", "lp", $1); definekey_reserved ("sgml_step (1)", "lt", $1); % table definekey_reserved ("sgml_align ()", "ta", $1); definekey_reserved ("sgml_table (1)", "ti", $1); definekey_reserved ("sgml_table (0)", "tt", $1); definekey_reserved ("sgml_table_row (table_columns, 1, 1); pop_spot ()", "tr", $1); definekey_reserved ("sgml_figure ()", "f", $1); definekey ("tex_insert_quote", "\"", $1); definekey ("tex_insert_quote", "'", $1); %!%+ %\function{docbook_mode} %\synopsis{docbook_mode} %\usage{Void docbook_mode ();} %\description % This mode is designed to facilitate the editing of Docbook 3.1 SGML files. % If a region is defined (i.e., if a mark is set), many SGML tags will % insert around the region; e.g. '' and ''. Tags are % inserted either using the Mode menu, or with a key combination resembling % the menu entry, e.g. ^Cce inserts (M&ode/&Character/<&emphasis>). % Functions that affect this mode include (Emacs mode assumed - IDE mode % uses ^Z instead of ^C): %#v+ % sgml_bskip_tag ^C^B % sgml_skip_tag ^C^F % sgml_para ^CP % sgml_section ^CS % sgml_sect ^CN % insert $ ^C$ % insert & ^C& % insert … ^C. % insert < ^C< % insert > ^C> %#v- % Variables affecting this mode include: %#v+ % Variable Default value % % SGML_INDENT 2 % Sgml_Compile_PS_Cmd "db2ps" % Sgml_Compile_Pdf_Cmd "db2pdf" % Sgml_Compile_Html_Cmd "db2html" % Sgml_View_PS_Cmd "gv" % Sgml_View_Pdf_Cmd "gv" % Sgml_View_Html_Cmd "netscape" %#v- % To change the value of a variable, define that variable in .jedrc % before loading docbook.sl. For example: %#v+ % variable SGML_INDENT = 3; %#v- % Hooks: \var{sgml_mode_hook} %!%- define docbook_mode () { variable mode = "docbook"; set_mode (mode, 1); % wrap mode use_keymap (mode); set_syntax_flags (mode, 8); use_syntax_table (mode); set_buffer_hook ("par_sep", &sgml_paragraph_separator); !if (blocal_var_exists (DOC_TYPE)) define_blocal_var (DOC_TYPE, ""); !if (blocal_var_exists (SECT_TYPE)) define_blocal_var (SECT_TYPE, ""); push_spot (); % is the document type already defined? bob (); variable cs = CASE_SEARCH; CASE_SEARCH = 0; if (fsearch ("