home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Enter 1999 March / enter_03_1999_1.iso / OS2 / TEMPL / FERN.DOC / FERN.DEF < prev    next >
Text File  |  1998-12-15  |  22KB  |  566 lines

  1. ###################################################
  2. # Fern Definition file.
  3. # Copyright 1998 N.A. Krawetz, All rights reserved.
  4. #
  5. # The definition file tells Fern how to process the
  6. # HTML code.  It consists of "actions" followed by
  7. # parameters for the actions.  The first parameter
  8. # is called "%1", the second is %2, and the third
  9. # is the "Message" (only the message can contain spaces).
  10. #
  11. # Available actions:
  12. #  Definitions:
  13. #    define %1  Message    (Make all occurances of %1 be the message)
  14. #    define %1        ("undefine" the definition of %1)
  15. #    Definitions are used with "${%1}".
  16. #    For example,
  17. #        define ns Netscape
  18. #    The value of ${ns} is "Netscape".
  19. #    Definitions can contain other definitions, for example:
  20. #    define browser Your browser is ${ns}.
  21. #    The value of ${browser} is not determined until it is needed.
  22. #    NOTE: The "%1" in "define" is case-sensitive.
  23. #
  24. #  Conditionals:
  25. #    The condition is a "defined" message.  If it is not defined,
  26. #    then the value is "false".  Otherwise, it is true.
  27. #    Note #1: every "if" needs an "endif"
  28. #    Note #2: all conditions are case-senditive.
  29. #
  30. #    if c1        (check if "c1" is defined)
  31. #    if c1 | c2    (check if either "c1" or "c2" are defined)
  32. #    if c1 & c2    (check if either "c1" and "c2" are defined)
  33. #    if ! c1     (check if "c1" is "not" defined)
  34. #    if (c1 | (c2 & ! c3))    (a complex condition)
  35. #    else if c    (else, if the condition is false, try a different if)
  36. #    else        (else, if the condition is false)
  37. #    endif        (end of the "if" if condition)
  38. #
  39. #    The ordering should be:
  40. #        if c1
  41. #        else if c2
  42. #        else
  43. #        endif
  44. #    "if" statements can be nested:
  45. #        if c1
  46. #          if cc1
  47. #          else
  48. #          endif
  49. #        else if c2
  50. #          if cc2
  51. #          else
  52. #          endif
  53. #        else
  54. #          if cc3
  55. #          else
  56. #          endif
  57. #        endif
  58. #
  59. #  Rules:
  60. #  Rules contain messages.  There are 2 types of messages: "MT" are displayed
  61. #  if the rule is applied (message-true); "MF" are displayed if the rule
  62. #  is not applied (message-false).
  63. #  Messages (both MT and MF) contain text strings and defined variables
  64. #  (${...}).  They may also contain special definitions:
  65. #    $1    the value of "%1"
  66. #    $2    the value of "%2"
  67. #    $0    the value of the tag that triggered the rule.
  68. #    $l    the line number in the HTML document (not always available)
  69. #    $b    number of "begin tags" for <$0>
  70. #    $e    number of "end tags" for </$0>
  71. #    $n    difference between $b and $e (the "nesting" of $0)
  72. #    $U    special (URL) see "PROCESS" below.
  73. #    The "\" character means "the next character is special".
  74. #    \n    a new-line character (^M)
  75. #    \r    a carrage return (^J)
  76. #    \t    a tab
  77. #    \a    a bell (alarm)
  78. #    \\    a backslash
  79. #    \$    a dollar sign
  80. #    A "\" followed by any other character just prints the character.
  81. #
  82. #  Rules that define tag ordering.
  83. #    BEFORE %1 %2 MF    (Display message if %2 is not before %1)
  84. #        e.g.:  before html body
  85. #             The tag <html> must come before <body>.
  86. #    NESTED %1 %2 MT (Allow <%1>....<%2> can be nested.)
  87. #    NESTED * * MF   (Special: All other tags should not be nested.)
  88. #    RESET %1 %2 MT  (Tag <%1> resets begin/end tag counters for <%2>)
  89. #    WITHIN %1 %2 MF (The tag <%2> must be within <%1>...</%1>.)
  90. #
  91. #  Rules that define individual tags.
  92. #  (Note: even though many rules do not use %2, it must be defined.)
  93. #    FIELD %1 %2 MF        (Expect the tag to contain "<%1 %2=...>")
  94. #    FIELD_NOT %1 %2 MF    (Expect the tag to not contain "<%1 %2=...>")
  95. #    FOUND %1 %2 MT        (Display message if <%1> is found)
  96. #    IGNORE_WITHIN %1 %2 MT    (ignore all data between <%1> and <%2>)
  97. #    IGNORE_WITHIN * * MF    (Special: display if the %2 was not found.)
  98. #    MATCH %1 %2 MF        (Each tag <%1> must match a </%1>.)
  99. #    MATCH * * MF        (Each tag <$0> must match a </$0>.)
  100. #    MUST  %1 %2 MF        (The tag <%1> must be in the HTML code.>
  101. #    NEVER %1 %2 MF        (The tag <%1> should never be seen.)
  102. #    ONCE %1 %2 MF        (The tag <%1> should be seen at most ONCE.)
  103. #    OPTIONAL_NOT %1 * MT    (The not-tag </%1> is optional.)
  104. #    SURROUND_TAG %1 %2 MF    (The tag begins with "<%1" and ends with "%2")
  105. #    TAG_ERROR %1 %2    MT    (display message on the tag-error)
  106. #        valid values for %1 in TAG_ERROR are:
  107. #            bad_<    (found "<" that isn't in a tag)
  108. #            bad_>    (found ">" that isn't in a tag)
  109. #            bad_/    (found </tag> before a matching <tag>)
  110. #            bad_tag    (found a bad tag; e.g. "</" or "</>")
  111. #            missing_>    (tag is missing a ">")
  112. #            too_long    (tag is more than 4096 characters)
  113. #
  114. #  Rules that determine how Fern processes the input.
  115. #    PRINT_BEFORE    %1 * MT
  116. #        Display the message before processing the file.
  117. #        "%1" is only used to determine printing order.
  118. #        All "PRINT_BEFORE" messages are sorted and then displayed
  119. #        in order from "lowest" to "highest".
  120. #        Although any characters can be used, we recommend using
  121. #        numbers between 0 and 1, for example "0.1" and "0.2".
  122. #        This way, other lines can be inserted easily ("0.15").
  123. #    PRINT_AFTER    %1 * MT
  124. #        Similar to PRINT_BEFORE, except the messages are
  125. #        displayed after the file has been processed.
  126. #    PROCESS %1 %2
  127. #        Determines how to process the input.
  128. #        Values for %1 are:
  129. #          HTTP    == the HTML file includes HTTP meta-header
  130. #          URL    == first line contains the URL (and defines $U)
  131. #        Values for %2 are:
  132. #          any-text == TRUE
  133. #          no-text == FALSE
  134. #    FROM_HTTP %1 %2
  135. #        If the input contains the HTTP meta header, then store
  136. #        the meta-header option "%1" into "define" for "%2".
  137. #        E.g.:    from_http content-type Content
  138. #        This stores the HTTP meta-value "content-type" into the
  139. #        defined variable "Content".
  140. #        For the "content-type: text/html", this would be
  141. #        the same as saying:
  142. #            define Content text/html
  143. ###################################################
  144.  
  145. # comment out what you don't want...
  146.  
  147. ### check for usability issues
  148. #define    Accessibility    TRUE
  149. #define    Compatability    TRUE
  150. #define    SlowModem    TRUE
  151.  
  152. ####################################################
  153. # You shouldn't need to edit below this point unless
  154. # you want to change how Fern processes.
  155. ####################################################
  156. ### check for specific browsers
  157. define    Netscape4    Netscape v.4
  158. define    MSIE4        Microsoft Internet Explorer v.4
  159. define    Lynx        Lynx
  160. #define    HTML4        HTML 4.0
  161.  
  162. ### for input (what to process)
  163. if HTTP_IN
  164.   # currently defined:
  165.   #    HTTP:  input has the HTTP meta-header.
  166.   #    URL:  first line of input has the URL.
  167.   process    HTTP    TRUE
  168.   process    URL    TRUE
  169. endif
  170.  
  171. ### for output
  172. if HTML_OUT
  173.   define li    \    <li>
  174.   define >    >
  175.   define <    <
  176.   define red    <font color=RED>
  177.   define /red    </font>
  178.   define h1    <h1>
  179.   define /h1    </h1>
  180.   define ul    <ul>\n
  181.   define /ul    </ul>\n
  182.   define amp    &
  183. else
  184.   define >    >
  185.   define <    <
  186.   define amp    &
  187. endif
  188.  
  189. ### if we're processing the HTTP meta-header...
  190. # if "process HTTP TRUE", then define ${Content} to the value of content-type
  191. from_http    content-type    Content
  192. from_http    Server    Server
  193. # the ones with a "$" are special and refer to the HTTP initial status line
  194. from_http    $http-code    RC
  195. from_http    $http-message    Message
  196. from_http    $http-protocol    Protocol
  197.  
  198. ### for Templeton
  199. if Tton | Templeton | tton | templeton
  200.   ## should be started with something like:
  201.   ##    Command_pattern * fern.exe fern.def %F Date=%N >> fern.out
  202.   process    HTTP    TRUE
  203.   process    URL    TRUE
  204.   if HTML_OUT
  205.    print_before    0.1    *    ${h1}From <a href="$U">$U</a>${/h1}\n
  206.   else
  207.    print_before    0.1    *    ${h1}From $U:${/h1}\n
  208.   endif
  209.   print_before  0.14    *    ${li}${Date}\n
  210.   print_before    0.15    *    ${li}Server ${Server}: ${Content} ${Message} (${RC})\n
  211.   print_before    0.2    *    ${ul}
  212.   print_after    0.2    *    ${/ul}
  213.   print_after    0.9    *    \n
  214. endif
  215.  
  216. ##############################################
  217. # general messages...
  218. # Special flags:
  219. #  $$ = print a $
  220. #  $1 = print the first parameter
  221. #  $2 = print the second parameter
  222. #  $l = print the line number (not always allowed)
  223. # The following may be reset by some of the actions below
  224. #  $b = print number of Begin-tags seen
  225. #  $e = print number of End-tags seen
  226. #  $n = print difference between number of Begin and End tags ($n="nesting")
  227. #
  228. #  FAQ: How can I get a line to start with a space?  Answer:  Use "\ ".
  229. #  NOTE: Messages can only be nested 8 deep.
  230. define w    ${li}Line $l: Warning:
  231. define e    ${li}${red}Line $l: Error:${/red}
  232. define n    ${li}Line $l: Notice:
  233. define msie    Microsoft Internet Explorer
  234. define netscape    Netscape
  235.  
  236. # tags that "must" be seen  (no line numbers)
  237. define    must    Warning: Missing ${<}$1${>}...${<}$2${>} tags.\n
  238. must    html    /html    ${must}
  239. must    head    /head    ${must}
  240. must    body    /body    ${must}
  241.  
  242. # tags that should only be seen once
  243. define    once    ${e} The ${<}$1${>}...${<}$2${>} tag should only be seen once.\n
  244. once    html    /html    ${once}
  245. once    head    /head    ${once}
  246. once    title    /title    ${once}
  247. once    body    /body    ${once}
  248. once    base    /base    ${once}
  249. once    basefont    /basefont    ${once}
  250.  
  251. # tags that do not require end-tags (no line numbers)
  252. # These "not-tags" are optional (they don't need to be present)
  253. # "optional_not" changes the $n counters.
  254. optional_not dd /dd
  255. optional_not dt /dt
  256. optional_not li /li
  257. optional_not p  /p
  258. optional_not td /td
  259. optional_not th /th
  260. optional_not tr /tr
  261. optional_not noframes /noframes
  262. optional_not legend /legend
  263. optional_not option /option
  264. optional_not optgroup /optgroup
  265.  
  266. # tags that should never be seen
  267. # "Never" tags can be either "begin" tags or "end" tags.
  268. # "never" changes the $n counters.
  269. define    never    ${e} Invalid tag: ${<}$0 ...${>}.\n
  270. ## from the <head>...</head> area
  271. never    /!DOCTYPE    *    ${never}
  272. never    /base    *    ${never}
  273. never    /basefont    *    ${never}
  274. never    /isindex    *    ${never}
  275. never    /link    *    ${never}
  276. never    /meta    *    ${never}
  277. never    /nextid    *    ${never}
  278. ## from the <body>...</body> area
  279. never    /!--    *    ${never}
  280. never    /area    *    ${never}
  281. never    /bgsound    *    ${never}
  282. never    /br    *    ${never}
  283. never    /col    *    ${never}
  284. never    /embed    *    ${never}
  285. never    /frame    *    ${never}
  286. never    /hr    *    ${never}
  287. never    /img    *    ${never}
  288. never    /input    *    ${never}
  289. never    /keygen    *    ${never}
  290. never    /object    *    ${never}
  291. never    /param    *    ${never}
  292. never    /plaintext    *    ${never}
  293. never    /spacer    *    ${never}
  294. never    /wbr    *    ${never}
  295.  
  296. # tags that require specific ordering
  297. define    before ${e} ${<}$1${>} should come before ${<}$2${>}.\n
  298. before    head    body    ${before}
  299. before    /head    body    ${before}
  300.  
  301. # tags that should be "within" other tags
  302. define within    ${w} ${<}$1${>} should be within ${<}$2${>}...${<}/$2${>} tags.\n
  303. ## basic skeleton
  304. within    head    html    ${within}
  305. within    body    html    ${within}
  306. within    frameset    html    ${within}
  307. ## within <head>...</head>
  308. within    base    head    ${within}
  309. within    basefont    head    ${within}
  310. within    isindex    head    ${within}
  311. within    link    head    ${within}
  312. within    meta    head    ${within}
  313. within    nextid    head    ${within}
  314. within    style    head    ${within}
  315. within    title    head    ${within}
  316. ## within <table>...</table>
  317. within    caption    table    ${within}
  318. within    col    table    ${within}
  319. within    colgroup    table    ${within}
  320. within    thead    table    ${within}
  321. within    tbody    table    ${within}
  322. within    tfoot    table    ${within}
  323. within    td    table    ${within}
  324. within    th    table    ${within}
  325. within    tr    table    ${within}
  326. ## within <select>...</select>
  327. within    option    select    ${within}
  328. within    optgroup    select    ${within}
  329. ## other "within" tags
  330. within    area    map    ${within}
  331. within    dt    dl    ${within}
  332. within    dd    dl    ${within}
  333. within    legent    fieldset    ${within}
  334. within    frame    frameset    ${within}
  335. within    noframes    frameset    ${within}
  336. within    server    head    ${within}
  337.  
  338. # tags that can be nested
  339. #define    nested    Line $l: Nested ${<}$1${>}...${<}$2${>} is $n deep (Total $b starts and $e ends).\n
  340. nested dir    /dir    ${nested}
  341. nested dl    /dl    ${nested}
  342. nested menu    /menu    ${nested}
  343. nested ol    /ol    ${nested}
  344. nested ul    /ul    ${nested}
  345. nested frameset    /frameset    ${nested}
  346. nested font    /font    ${nested}
  347. nested table    /table    ${nested}
  348. # general messsage for tags that cannot be nested */
  349. nested * * ${e} The ${<}$0${>} tag cannot be nested; you need a ${<}/$0${>} tag.\n
  350.  
  351. # we want some tags to always match (no line numbers)
  352. match    a    /a    Error: Mismatched ${<}a${>} ($b) and ${<}/a${>} ($e) tags.\n
  353. match    *    *    Error: Missed end tags: ${<}$0${>} ($b occurances) and ${<}/$0${>} ($e occurances) tags.\n
  354.  
  355. ## field_url currently not implemented
  356. # some tag fields with URL's to check
  357. #define    url    ${w} ${<}$1 $2=URL ...${>} contains "$u" in the URL.\n
  358. #field_url    a    href    ${url}
  359. #field_url    body    background    ${url}
  360. #field_url    img    src    ${url}
  361. #field_url    img    lowsrc    ${url}
  362.  
  363. # some tags act as closing tags for other's
  364. define    reset    ${w} ${<}$1${>} closes ${<}$2${>} tag.\n
  365. reset    table    a    ${reset}
  366. reset    /table    td
  367. reset    /table    th
  368. reset    /table    tr
  369.  
  370. # what do tags normally begin with?  Form: "${<}$1 $2"
  371. # Note: Everything that is surrounded is ignored
  372. define surroundtag    ${e} Beginning of tag "${<}$0" missing "$2".\n
  373. ### comments
  374. surround_tag    !--    -->    ${surroundtag}
  375. ### asp pages
  376. surround_tag    %    %>    ${surroundtag}
  377. surround_tag    %@    %>    ${surroundtag}
  378.  
  379. ### scripts
  380. define ignorewithin    ${e} Missed end to block ${<}$0${>}...${<}/$0${>}.\n
  381. ignore_within    script    /script    ${n} Skipping ${<}$1${>}...${<}$2${>}\n
  382. ### pre-formatted
  383. ignore_within    xmp    /xmp    ${n} Skipping ${<}$1${>}...${<}$2${>}\n
  384. ignore_within    *    *    ${ignorewithin}
  385.  
  386. ### general tag markings (these definitions are special)
  387. tag_error    bad_<    *    ${e} Only use "${<}" for tags -- use "${amp}lt;" for text.\n
  388. tag_error    bad_>    *    ${e} Only use "${>}" for tags -- use "${amp}gt;" for text.\n
  389. tag_error    bad_/    *    ${e} Tag ${<}/$0${>} is missing start tag ${<}$0${>}.\n
  390. tag_error    bad_tag    *    ${e} Tag ${<}$0${>} is poorly formed.\n
  391. tag_error    missing_>    *    ${e} Tag "${<}$0" is missing "${>}".\n
  392. tag_error    too_long    *    ${e} The tag is too long.\n
  393.  
  394. ############# HTML specific issues #########################
  395. if Compatability
  396.   # Compatability issues are directed toward maintaining standard HTML
  397.   # that can be properly viewed by all (most) web browsers.
  398.   # Because different browsers support different HTML versions, compatability
  399.   # issues may arise.
  400.   field_not font face    ${w} ${<}$1 $2=...${>} is not supported by the HTML standards.\n
  401.   field_not font size    ${w} Text size set by ${<}$1 $2=...${>} may be unreadable.\n
  402.   field_not hr length    ${w} ${<}$1 $2=...${>} is not supported by older browsers.\n
  403.   nested table    /table    ${w} Nested tables are not supported by some older browsers.\n
  404.   nested font    /font    ${w} Nested fonts are not supported by some older browsers.\n
  405.   # permit error messages for specific browsers
  406.   define MSIE4    true
  407.   define Netscape    true
  408.   define Lynx    true
  409.   define HTML4    true
  410. endif
  411.  
  412. ## "Depricated" means the tag has been replaced by another tag
  413. ##    and will probably become obsolete in the furture.
  414. ## "Obsolete" means the tag is no longer supported by the standards.
  415. ## "Unsupported" means it's a browser-specific extension to the HTML standard.
  416. define dep_found    ${w} The ${<}$1${>} tag is depricated
  417. define obs_found    ${w} The ${<}$1${>} tag is obsolete
  418. define uns_found    ${w} The ${<}$1${>} tag is unsupported
  419. define dep_field    ${w} The ${<}$1$ $2=...{>} tag is depricated
  420. define obs_field    ${w} The ${<}$1$ $2=...{>} tag is obsolete
  421. define uns_field    ${w} The ${<}$1$ $2=...{>} tag is unsupported
  422. if HTML4
  423.   define html4_dep_found  ${dep_found} in ${HTML4}.\n
  424.   define html4_obs_found  ${obs_found} in ${HTML4}.\n
  425.   define html4_uns_found  ${uns_found} in ${HTML4}.\n
  426.   define html4_dep_field  ${dep_field} in ${HTML4}.\n
  427.   define html4_obs_field  ${obs_field} in ${HTML4}.\n
  428.   define html4_uns_field  ${uns_field} in ${HTML4}.\n
  429.   ## depricated HTML
  430.   found applet /applet    ${html4_dep_found}
  431.   found basefont /basefont    ${html4_dep_found}
  432.   found center    /center    ${html4_dep_found}
  433.   found font    /font    ${html4_dep_found}
  434.   found isindex    /isindex    ${html4_dep_found}
  435.   found strike    /strike    ${html4_dep_found}
  436.   found s    /s    ${html4_dep_found}
  437.   found u    /u    ${html4_dep_found}
  438.   field br    clear    ${html4_dep_field}
  439.   field hr    align    ${html4_dep_field}
  440.   field hr    noshade    ${html4_dep_field}
  441.   field hr    size    ${html4_dep_field}
  442.   field hr    width    ${html4_dep_field}
  443.   ## obsolete HTML
  444.   found listing    /listing    ${html4_obs_found}
  445.   found nextid    *    ${html4_obs_found}
  446.   found plaintext    *    ${html4_obs_found}
  447.   found xmp    /xmp    ${html4_obs_found}
  448. endif
  449.  
  450. ############# Browser specific and other issues ############
  451. # Many "popular" browsers have their own extensions to the HTML standard
  452. # or interpret the HTML in a non-standard fashion.
  453. # The extensions are only usable with the specific browser.
  454. # The interpretation issues may cause "standard" HTML to be interpreted
  455. # differently or incorrectly.  In addition, extensions for one browser may
  456. # be misinterpreted by a different browser.
  457.  
  458. ### for MSIE-only tags
  459. if !MSIE4 | (Netscape | Lynx)
  460.   define msie_only_field    ${w} ${<}$1 $2=...${>} is only available under ${msie}\n
  461.   define msie_only_found    ${w} ${<}$1${>}...${<}$2${>} is only available under ${msie}\n
  462.   found  bgsound    *    ${msie_only_found}
  463.   found  marque    /marque    ${msie_only_found}
  464.   found  comment    /comment    ${msie_only_found}
  465.   field_not area    notab    ${msie_only_field}
  466.   field_not area    taborder    ${msie_only_field}
  467.   field_not basefont name    ${msie_only_field}
  468.   field_not body bgproperties    ${msie_only_field}
  469.   field_not body leftmargin    ${msie_only_field}
  470.   field_not body topmargin    ${msie_only_field}
  471.   field_not caption valign    ${msie_only_field}
  472.   field_not div nowrap    ${msie_only_field}
  473.   field_not frameset framespacing    ${msie_only_field}
  474.   field_not hr    color    ${msie_only_field}
  475.   field_not input    notab    ${msie_only_field}
  476.   field_not input    taborder    ${msie_only_field}
  477.   field_not img    controls    ${msie_only_field}
  478.   field_not img    dynsrc    ${msie_only_field}
  479.   field_not img    loop    ${msie_only_field}
  480.   field_not img    start    ${msie_only_field}
  481.   field_not isindex    action    ${msie_only_field}
  482.   field_not meta    charset    ${msie_only_field}
  483.   field_not object    notab    ${msie_only_field}
  484.   field_not object    shapes    ${msie_only_field}
  485.   field_not table    background    ${msie_only_field}
  486.   field_not table    bordercolordark    ${msie_only_field}
  487.   field_not table    bordercolorlight    ${msie_only_field}
  488.   field_not table    nowrap    ${msie_only_field}
  489.   field_not table    valign    ${msie_only_field}
  490.   field_not tr    bordercolor    ${msie_only_field}
  491.   field_not tr    bordercolorlight    ${msie_only_field}
  492.   field_not tr    bordercolordark    ${msie_only_field}
  493.   field_not th    background    ${msie_only_field}
  494.   field_not th    bordercolor    ${msie_only_field}
  495.   field_not th    bordercolorlight    ${msie_only_field}
  496.   field_not th    bordercolordark    ${msie_only_field}
  497.   field_not td    background    ${msie_only_field}
  498.   field_not td    bordercolor    ${msie_only_field}
  499.   field_not td    bordercolorlight    ${msie_only_field}
  500.   field_not td    bordercolordark    ${msie_only_field}
  501. endif
  502.  
  503. ### for Netscape-only tags
  504. if !Netscape | (MSIE4 | Lynx)
  505.   define netscape_only_field    ${w} ${<}$1 $2=...${>} is only available under ${netscape}\n
  506.   define netscape_only_found    ${w} ${<}$1${>}...${<}$2${>} is only available under ${netscape}\n
  507.   found  blink    /blink    ${netscape_only_found}
  508.   found  layer    /layer    ${netscape_only_found}
  509.   found  multicol    /multicol    ${netscape_only_found}
  510.   found  spacer    *    ${netscape_only_found}
  511.   found  server    /server    ${w} ${<}$1${>}...${<}$2${>} is only available from a Netscape web server.\n
  512.   field_not applet    mayscript    ${netscape_only_field}
  513.   field_not embed    align    ${netscape_only_field}
  514.   field_not embed    border    ${netscape_only_field}
  515.   field_not embed    hspace    ${netscape_only_field}
  516.   field_not embed    pluginspace    ${netscape_only_field}
  517.   field_not embed    type    ${netscape_only_field}
  518.   field_not embed    vspace    ${netscape_only_field}
  519.   field_not frameset    border    ${netscape_only_field}
  520.   field_not frameset    bordercolor    ${netscape_only_field}
  521.   field_not frame    bordercolor    ${netscape_only_field}
  522.   field_not form    name    ${netscape_only_field}
  523.   field_not img    lowsrc    ${netscape_only_field}
  524.   field_not img    name    ${netscape_only_field}
  525.   field_not input    border    ${netscape_only_field}
  526.   field_not textarea    wrap    ${netscape_only_field}
  527.   field_not table    hspace    ${netscape_only_field}
  528.   field_not table    vspace    ${netscape_only_field}
  529. endif
  530.  
  531. ### for current browsers
  532. if HTML4 | MSIE4 | Netscape | Lynx
  533.   define most_only_found ${w} ${<}$1${>}...${<}$2${>} is not supported by HTML 4.0.\n
  534.   define most_only_field ${w} ${<}$1$ $2=...${>} is not supported by HTML 4.0.\n
  535.   found    ins    /ins    ${most_only_found}
  536.   found    del    /del    ${most_only_found}
  537.   found    bdo    /bdo    ${most_only_found}
  538.   found    embed    /embed    ${most_only_found}
  539.   found nobr    /nobr    ${most_only_found}
  540.   found wbr    *    ${most_only_found}
  541.   field_not body    onblur    ${most_only_field}
  542.   field_not body    onfocus    ${most_only_field}
  543.   field_not dir        type    ${most_only_field}
  544.   field_not menu    type    ${most_only_field}
  545.   field_not frameset    frameborder    ${most_only_field}
  546.   field_not table    cols    ${most_only_field}
  547.   field_not tr        bgcolor    ${most_only_field}
  548. endif
  549.  
  550. ### for people with slow network connections (most people using ISP's)
  551. if SlowModem
  552.   field img lowsrc    ${n} Consider using ${<}$1 src=url1 $2=url2${>} for large images.\n
  553. endif
  554.  
  555. if Accessibility
  556.   # Accessibility issues are directed toward non-graphical web "browsers".
  557.   # these include search engines, text-only browsers (e.g. Lynx), and
  558.   # HTML-to-speech browsers for the blind.
  559.   must    title    /title    ${must}
  560.   found    table    /table    ${w} Tables may be difficult to follow for non-graphical browsers.\n
  561.   field img alt  ${n} Use ${<}$1 src=url $2="text"${>} for non-graphical browsers.\n
  562.   field_not body bgcolor    ${n} Color appears differently on various platforms.\n
  563.   field_not font color    ${n} Color appears differently on various platforms.\n
  564. endif
  565.  
  566.