home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / mslang / mh / mh.txt < prev    next >
Text File  |  1993-09-04  |  18KB  |  570 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.                                     MINIHELP
  10.  
  11.  
  12.                     Create Microsoft Windows Help Files in a flash!
  13.  
  14.                     Requirements:
  15.                       Microsoft Windows
  16.                       The HC31.EXE help compiler or its equivalent
  17.                       An ASCII text editor such as QEDIT or NotePad.
  18.  
  19.  
  20.  
  21.                   Copyright 1993 by Tom Campbell.  All Rights Reserved.
  22.  
  23.                   You may use MiniHelp any way you like, as long
  24.                   as you preserve the copyright notices.
  25.  
  26.                   This distribution contains:
  27.  
  28.                     MH.EXE        -- The MiniHelp preprocessor
  29.                     MH.TXT        -- You're reading it!
  30.                     MC.C          -- Source code to MiniHelp
  31.                     TEST?.HPJ     -- Sample help project files.
  32.                     TEST?.SRC     -- Sample MiniHelp source
  33.                                      files.
  34.  
  35.  
  36.  
  37.  
  38. WHAT IT IS
  39.  
  40.   If you've ever tried to create topic source files for the
  41.   Microsoft Windows Help compiler (HC from here on in), you know
  42.   it's a pain.  Commendably enough, Microsoft has made the input
  43.   to HC a subset of RTF or Rich Text Files.  Not all word
  44.   processor support RTF, though.  Even when they do, using RTF
  45.   isn't exactly intuitive.  Finally, you're probably used to
  46.   your own text editor and not all that excited about changing.
  47.  
  48.   MiniHelp works as a go-between, taking its simplified language
  49.   as input and creating as output Help-compliant RTF topic
  50.   files. It offers only a few commands, a mere fraction of the
  51.   rich language that HC understands, but those commands are the
  52.   ones you'll use by far the most often.  You can create the
  53.   first pass using MiniHelp and add things like buttons and
  54.   graphics using RTF later, or just stick with MiniHelp.
  55.   MiniHelp supports easy-to-use versions of these topic file
  56.   features:
  57.  
  58.   - Topic names
  59.   - Titles
  60.   - Keywords
  61.   - Hypertext links
  62.   - Font sizing
  63.   - Comments
  64.  
  65.   That's pretty much it.  I have created complete help systems
  66.   using nothing but MiniHelp because it's fast and easy.
  67.  
  68.   You can of course include standard RTF commands within a
  69.   MiniHelp script, but once you change the output .RTF file, you
  70.   can't read the .RTF file back into MiniHelp to recreate the
  71.   MiniHelp source with the changes you added.  It's a one-way
  72.   process.  (Quit complaining. It's free, after all!)
  73.  
  74. EXAMPLES
  75.  
  76.   Here's a before-and-after example of MiniHelp in action.  This
  77.   is a minimum help topic file in RTF.  It contains a topic
  78.   name, a title, and a few words of text.
  79.  
  80.     {\rtf1\ansi \deff2
  81.     {\fonttbl
  82.     {\f0\froman Times New Roman;}
  83.     {\f1\fdecor Courier New;}
  84.     {\f2\fswiss Arial;}}
  85.     #{\footnote SuperNoteOverview}
  86.     ${\footnote A SuperNote Overview}
  87.     Supernote lets you write several different notes at once.
  88.     \page
  89.     }
  90.  
  91.   Here's the equivalent file written using MiniHelp:
  92.   
  93.     .topic SuperNoteOverview
  94.     .title A SuperNote Overview
  95.      Supernote lets you write several different notes at once.
  96.  
  97.   As you can see, even if you have an RTF-capable editor,
  98.   MiniHelp source files resemble the organization of Windows
  99.   help files much more closely.  And there's a lot less to keep
  100.   track of.  You must remember to end each topic in the RTF file
  101.   with a \page command, you must remember to end the RTF file
  102.   itself with a closing curly brace, you must remember to end
  103.   font names with a semicolon, etc.  MiniHelp lets you forget
  104.   all that and concentrate on getting the job done.
  105.  
  106.   The example above lacked a feature or two, notably keywords
  107.   and hypertext links.  Here's a multitopic help file with table
  108.   of contents, keywords, titles, and hypertext links.
  109.  
  110.     .topic TOFC
  111.     .title Table of Contents
  112.  
  113.     Table of Contents
  114.  
  115.  
  116.     {Find a file anywhere on the disk with FF.EXE:FileFind}
  117.  
  118.     {Finding Today's Files with All2Day:All2day}
  119.  
  120.     .topic FileFind
  121.     .title Find Files on Your Disk
  122.     .keyword FF.EXE;FileFind;files, finding;finding files
  123.     FileFind, or FF.EXE, lets you find files
  124.      anywhere on your disk.  Use it in conjunction with
  125.      {ALL2DAY.EXE:all2day}, which lets you find all
  126.      the files you created today.
  127.  
  128.     See also {Table of Contents:TOFC}
  129.  
  130.     .topic All2Day
  131.     .title Finding the Files You Created Today
  132.     .keyword All2Day;ALL2DAY.EXE;Today
  133.     Whereas {FileFind (FF.EXE):FileFind} searches for the specfied
  134.      file anywhere on your hard disk, All2Day searches the
  135.      default disk for all files created today.
  136.  
  137.     See also {Table of Contents:TOFC}
  138.  
  139.   This may look a bit complex, and it is.  But compare it to the
  140.   RTF version:
  141.  
  142.     {\rtf1\ansi \deff2
  143.     {\fonttbl
  144.     {\f0\froman Times New Roman;}
  145.     {\f1\fdecor Courier New;}
  146.     {\f2\fswiss Arial;}
  147.     }
  148.     #{\footnote TOFC}
  149.     ${\footnote Table of Contents
  150.     }
  151.     \par
  152.     {\uldb Find a file anywhere on the disk with FF.EXE}{\v FILEFIND}
  153.     \par
  154.     {\uldb Finding Today's Files with All2Day}{\v ALL2DAY}
  155.     \par
  156.     \page
  157.     #{\footnote FileFind}
  158.     ${\footnote Find Files on Your Disk}
  159.     K{\footnote  FF.EXE}
  160.     K{\footnote FileFind}
  161.     K{\footnote files, finding}
  162.     K{\footnote finding files}
  163.     FileFind, or FF.EXE, lets you find files
  164.      anywhere on your disk.  Use it in conjunction with
  165.      {\uldb ALL2DAY.EXE}{\v ALL2DAY} , which lets you find all
  166.      the files you created today.
  167.     \par
  168.     See also {\uldb Table of Contents}{\v TOFC}
  169.     \par
  170.     \page
  171.     #{\footnote All2Day}
  172.     ${\footnote Finding the Files You Created Today}
  173.     K{\footnote  All2Day}
  174.     K{\footnote ALL2DAY.EXE}
  175.     Whereas {\uldb FileFind (FF.EXE)}{\v FILEFIND}  searches for the specfied
  176.      file anywhere on your hard disk, All2Day searches the
  177.      default disk for all files created today.
  178.     \par
  179.     See also {\uldb Table of Contents}{\v TOFC}
  180.     \page
  181.     }
  182.  
  183.   As you can see, keeping track of all those nested curly braces
  184.   and backslash commands gets old fast.  MiniHelp can save you
  185.   from all that.
  186.  
  187.  
  188.  
  189. CHAPTER 1. OVERVIEW
  190.  
  191.   MiniHelp creates help topic files.  A topic file contains one
  192.   or more of the following:
  193.  
  194.     1. A topic
  195.     2. A title
  196.     3. Keywords (optional, but strongly recommended)
  197.     4. The topic text itself
  198.  
  199.  You can have multiple topics in a topic file.  The only
  200.  constraint is that topics be given unique names.  Titles are
  201.  not so constrained.
  202.  
  203.  The Microsoft Help Compiler (HC) doesn't use the topic file
  204.  directly, however.  You give it the name of a help project file
  205.  instead.  The help project file has a default extension of .HPJ
  206.  and contains a list of the topic files.
  207.  
  208.  There's a lot going on in a help project file, but you can
  209.  safely ignore all but the [FILES] section.  That's the section
  210.  that names the topic files.  Here's an example of a complete
  211.  help project file named TEST1.HPJ:
  212.  
  213.    [FILES]
  214.    TEST1A.RTF
  215.  
  216.  You have to create the project file yourself; MiniHelp can't do
  217.  it because it doesn't know what files are in the project.  The
  218.  files listed must include full pathnames with extensions.
  219.  Normally, you'll have only one project per directory and keep
  220.  all the topic files in that directory.  In some cases you might
  221.  not want it that way; for example, if you have a standard help
  222.  topic file for the File menu with such unchanging features as
  223.  Save As, Print Setup, and so on, you might wish to keep them in
  224.  a common directory to avoid duplicated effort and maintainence
  225.  problems.
  226.  
  227.  HC "automatically" creates a table of contents; it's whatever
  228.  happens to appear on the first screen of the topic.  See
  229.  TEST2.* for an example.
  230.  
  231.  At any rate, include all of the topic files in your help
  232.  project file.  They may include cross-file references; that is,
  233.  a topic doesn't have to be in file A as long as it appears in
  234.  file B.
  235.  
  236.  The next chapter shows you how to create the topic files using
  237.  MiniHelp.
  238.  
  239.  
  240.  
  241. CHAPTER 2. CREATING A MINIHELP SOURCE FILE
  242.  
  243.   MiniHelp source files contain the text of the help, "dot
  244.   commands", and hypertext links.  That's all.  They get
  245.   converted into the .RTF files that HC needs to create binary
  246.   .HLP files for Microsoft Windows.
  247.  
  248.   A dot command starts the line with a period, a.k.a. dot, and
  249.   contains a single dot command.  Each dot command has at at
  250.   least one operand.  The line should contain nothing else.  If
  251.   you're used to old-fashioned programs such as troff, WordStar,
  252.   or TeX, this will be old hat.  Dot commands can be in upper,
  253.   lower, or mixed case. It doesn't matter.
  254.  
  255.   Here's a summary of the dot commands, in rough order of
  256.   importance:
  257.  
  258.   Dot command             What it does
  259.   -----------             ------------
  260.   .topic                  Creates a location for the topic. Does not
  261.                           appear.
  262.   .title                  Creates the text used in Search and History
  263.                           dialogs.
  264.   .keywords               Creates alternate text for Search dialogs.
  265.   .fontsize               Lets you specify a font size in points.
  266.  
  267.  
  268.   In addition to the dot commands, there are:
  269.  
  270.   Text                    What it does
  271.   ----                    ------------
  272.   Blank lines             Appear as carriage returns in output file
  273.   hypertext link          Lets the user jump to a different topic
  274.   Comments                Start line with a ';'. The line is
  275.                           ignored and not sent to output.
  276.   Everything else         (Called the topic text) Appears literally
  277.  
  278.   Remember that word wrap isn't as it appears in the file for
  279.   the topic text.  Here are the rules for for word wrap:
  280.  
  281.   1. The first character on lines after the first one must be
  282.      preceded by a space if you want them to be separated from
  283.      the preceding words
  284.   2. You can force a break using a newline.
  285.  
  286.   Here's the reference to Minihelp in alphabetical order. The
  287.   next chapter shows complete code examples.
  288.  
  289.  
  290.  
  291.   KEYWORD:
  292.     .fontsize
  293.  
  294.   FORMAT:
  295.     .fontsize <integer>
  296.  
  297.   WHAT IT DOES:
  298.     Lets you specify a font size in points.
  299.  
  300.   EXAMPLES:
  301.     .fontsize 10
  302.     .fontsize 12
  303.  
  304. -------------------------------------------------------------------
  305.  
  306.   KEYWORD:
  307.     .keywords
  308.  
  309.   FORMAT:
  310.     .keywords <word or phrase>
  311.     .keywords <word or phrase>;<word or phrase>;...<word or phrase>
  312.  
  313.   WHAT IT DOES:
  314.     Creates alternate text for Search dialogs.  Clicking on
  315.     these keywords in the Search dialog will jump to the current
  316.     topic.
  317.  
  318.     The keywords may consist of more than one word, and may
  319.     include or start with numbers.  You may specify more than
  320.     one keyword by separating them with semicolons.
  321.  
  322.     You can also use ".keyword", without the "s", if you have
  323.     just one keyword on the line.  But you don't have to.
  324.  
  325.  
  326.   EXAMPLES:
  327.     .keyword File
  328.     .keywords File;File menu;Open;Exit;Save As...;Save
  329.  
  330.  
  331. -------------------------------------------------------------------
  332.   KEYWORD:
  333.     (link)
  334.  
  335.   FORMAT:
  336.     {<text to display>:<topic identifier>}
  337.  
  338.   WHAT IT DOES:
  339.     Hypertext links aren't dot commands, but they're critical to
  340.     the creation of good help files.  Links are embedded in the
  341.     topic text.  The first part of a link is a left curly brace,
  342.     the '{' character.  Then comes one or more words of a phrase
  343.     that will be displayed underlined and in green on the help
  344.     screen.  This phrase is followed by a colon separator, the
  345.     ':' character, and a single-token topic identifier.
  346.     Finally, there's a closing curly brace '}' character.
  347.  
  348.  
  349.   EXAMPLES:
  350.     See the {File menu:FileMenu} for more details.
  351.  
  352.     See also the {Options menu:Options_Menu} and the
  353.     {View menu:View_1_A0}.
  354.  
  355.  
  356. -------------------------------------------------------------------
  357.  
  358.   KEYWORD:
  359.     .title
  360.  
  361.   FORMAT:
  362.     .title <title text>
  363.  
  364.   WHAT IT DOES:
  365.     Creates the text used in Search and History dialogs.
  366.  
  367.     <title text> may consist of more than one word.
  368.  
  369.  
  370.   EXAMPLES:
  371.     .title The File Menu
  372.     .title Table of Contents
  373.     .title Printing
  374.  
  375.  
  376. -------------------------------------------------------------------
  377.  
  378.   KEYWORD:
  379.     .topic
  380.  
  381.   FORMAT:
  382.     .topic <identifier>
  383.  
  384.   WHAT IT DOES:
  385.     Creates a location for the topic.  Does not appear.
  386.  
  387.     <identifier> follows the same rules as variables in
  388.     programming languages.  It must start with a letter, and may
  389.     consist only of letters, underscores, and numbers.  It may
  390.     not include any spaces, tabs, or punctuation marks.
  391.  
  392.  
  393.   EXAMPLES:
  394.     .topic FileMenu
  395.     .topic Options_Menu
  396.     .topic View_1_A0
  397.  
  398.  
  399. -------------------------------------------------------------------
  400.  
  401.  
  402. CHAPTER 3. Examples
  403.  
  404.   Here are two brief, step-by-step examples listing all the
  405.   steps required to create and run a help file.
  406.  
  407.   Example 1. The bare minimum
  408.   ---------------------------
  409.   This example creates a file so simple, it has no keywords and
  410.   a single screen that serves as both the table of contents and
  411.   a topic.
  412.  
  413.   1. Create a file called TEST1.SRC with these contents:
  414.  
  415. .topic SuperNoteOverview
  416. .title A SuperNote Overview
  417. Supernote lets you write
  418.   several different notes at
  419.   once.
  420.   
  421.  
  422.   2. Create a file called TEST1.HPJ with these contents:
  423.  
  424. [FILES]
  425. TEST1.RTF
  426.  
  427.   3. Run MiniHelp on TEST1.SRC:
  428.  
  429.       rem Remember that .SRC is the default extension
  430.       rem used by MH.
  431.       mh test1
  432.  
  433.      This creates the output file TEST1.RTF.
  434.  
  435.   4. Run HC on the .HPJ file:
  436.  
  437.       rem Remember that .HPJ is the default extension
  438.       rem used by HC.
  439.       hc31 test1
  440.  
  441.      HC plucks the file named TEST1.RTF, which was automatically generated
  442.      from TEST1.SRC by MiniHelp, out of the [FILES] list of
  443.      TEST1.HPJ and compiles it.
  444.  
  445.   5. Run WinHelp on the resultant .HLP file.
  446.  
  447.      For example, if you're working in the C:\MH directory,
  448.      choose Run... from the Program Manager's File dialog and
  449.      enter this:
  450.  
  451.        winhelp  c:\mh\test1
  452.  
  453.   Example 2. Soup to Nuts
  454.   -----------------------
  455.   This example creates a short file showing off most of
  456.   MiniHelp's features.  This is much closer to what you'll
  457.   normally do when you create help for a real-life project.
  458.  
  459.   1. Create a file called TEST2.SRC with these contents:
  460.  
  461. .topic TOFC
  462. .title Table of Contents
  463.  
  464. Table of Contents
  465.  
  466.  
  467. {Find a file anywhere on the disk with FF.EXE:FileFind}
  468.  
  469. {Finding Today's Files with All2Day:All2day}
  470.  
  471. .topic FileFind
  472. .title Find Files on Your Disk
  473. .keyword FF.EXE;FileFind;files, finding;finding files
  474. FileFind, or FF.EXE, lets you find files
  475.  anywhere on your disk.  Use it in conjunction with
  476.  {ALL2DAY.EXE:all2day}, which lets you find all
  477.  the files you created today.
  478.  
  479. See also {Table of Contents:TOFC}
  480.  
  481. .topic All2Day
  482. .title Finding the Files You Created Today
  483. .keyword All2Day;ALL2DAY.EXE;Today
  484. Whereas {FileFind (FF.EXE):FileFind} searches for the specfied
  485.  file anywhere on your hard disk, All2Day searches the
  486.  default disk for all files created today.
  487.  
  488. See also {Table of Contents:TOFC}
  489.   
  490.  
  491.   2. Create a file called TEST2.HPJ with these contents:
  492.  
  493. [FILES]
  494. TEST2.RTF
  495.  
  496.   3. Run MiniHelp on TEST2.SRC:
  497.  
  498.       rem Remember that .SRC is the default extension
  499.       rem used by MH.
  500.       mh test2
  501.  
  502.      This creates the output file TEST2.RTF.
  503.  
  504.   4. Run HC on the .HPJ file:
  505.  
  506.       rem Remember that .HPJ is the default extension
  507.       rem used by HC.
  508.       hc31 test2
  509.  
  510.      HC plucks the file named TEST2.RTF, which was automatically generated
  511.      from TEST2.SRC by MiniHelp, out of the [FILES] list of
  512.      TEST2.HPJ and compiles it.
  513.  
  514.   5. Run WinHelp on the resultant .HLP file.
  515.  
  516.      For example, if you're working in the C:\MH directory,
  517.      choose Run... from the Program Manager's File dialog and
  518.      enter this:
  519.  
  520.        winhelp  c:\mh\test2
  521.  
  522.   6. Try jumping from topic to topic and using keyword searches.
  523.      You'll find that this is beginning to look like a help file
  524.      someone could actually use.
  525.  
  526.  
  527.  
  528. CHAPTER 4. THE SOURCE CODE
  529.  
  530.   You can use this source code in your own projects.  It's quite
  531.   modular, and uses some general-purpose routines with wide
  532.   ranging applications:
  533.  
  534.   void AddExtension(char *str, char *ext);
  535.   -------------------------------------------------------------
  536.     Adds an extension to a filename if it doesn't have one.
  537.  
  538.  
  539.   int Parse(char *Input, char *Separators, WORD StartAt,
  540.              BOOL ForceUpper, WORD MaxLen,
  541.              char *Buffer);
  542.   -------------------------------------------------------------
  543.     A reentrant routine that parses lines of text.  Somewhat
  544.     like strtok(), but a little more unwieldy, nondestructive,
  545.     and a lot more flexible.
  546.  
  547.  
  548.   void ReplaceExtension(char *Filename, char *Ext);
  549.   -------------------------------------------------------------
  550.     Replaces the file extension, or adds one if none is present.
  551.  
  552.  
  553.   int StripExtension(char *input);
  554.   -------------------------------------------------------------
  555.     Removes a file extension.
  556.  
  557.  
  558.   int UpStr(char *Str);
  559.   -------------------------------------------------------------
  560.     Forces a string to uppercase
  561.  
  562.  
  563. Copyright 1993, by Tom Campbell.  All Rights Reserved.
  564.  
  565. Use this code any way you wish, as long as you preserve the
  566. copyright notice.
  567.  
  568.  
  569.  
  570.