Home | History | Annotate | Download | only in faqwiz
      1 """FAQ Wizard customization module.
      2 
      3 Edit this file to customize the FAQ Wizard.  For normal purposes, you
      4 should only have to change the FAQ section titles and the small group
      5 of parameters below it.
      6 
      7 """
      8 
      9 # Titles of FAQ sections
     10 
     11 SECTION_TITLES = {
     12     # SectionNumber : SectionTitle; need at least one entry
     13     1: "General information and availability",
     14 }
     15 
     16 # Parameters you definitely want to change
     17 
     18 SHORTNAME = "Generic"                   # FAQ name with "FAQ" omitted
     19 PASSWORD = ""                           # Password for editing
     20 OWNERNAME = "FAQ owner"                 # Name for feedback
     21 OWNEREMAIL = "nobody (at] anywhere.org"      # Email for feedback
     22 HOMEURL = "http://www.python.org"       # Related home page
     23 HOMENAME = "Python home"                # Name of related home page
     24 RCSBINDIR = "/usr/local/bin/"           # Directory containing RCS commands
     25                                         # (must end in a slash)
     26 
     27 # Parameters you can normally leave alone
     28 
     29 MAXHITS = 10                            # Max #hits to be shown directly
     30 COOKIE_LIFETIME = 28*24*3600            # Cookie expiration in seconds
     31                                         # (28*24*3600 = 28 days = 4 weeks)
     32 PROCESS_PREFORMAT = 1                   # toggle whether preformatted text
     33                                         # will replace urls and emails with
     34                                         # HTML links
     35 
     36 # Markers appended to title to indicate recently change
     37 # (may contain HTML, e.g. <IMG>); and corresponding
     38 
     39 MARK_VERY_RECENT = " **"                # Changed very recently
     40 MARK_RECENT = " *"                      # Changed recently
     41 DT_VERY_RECENT = 24*3600                # 24 hours
     42 DT_RECENT = 7*24*3600                   # 7 days
     43 
     44 EXPLAIN_MARKS = """
     45 <P>(Entries marked with ** were changed within the last 24 hours;
     46 entries marked with * were changed within the last 7 days.)
     47 <P>
     48 """
     49 
     50 # Version -- don't change unless you edit faqwiz.py
     51 
     52 WIZVERSION = "1.0.4"                    # FAQ Wizard version
     53 
     54 import os, sys
     55 if os.name in ['nt',]:
     56     # On NT we'll probably be running python from a batch file,
     57     # so sys.argv[0] is not helpful
     58     FAQCGI = 'faq.bat'                  # Relative URL of the FAQ cgi script
     59     # LOGNAME is not typically set on NT
     60     os.environ[ 'LOGNAME' ] = "FAQWizard"
     61 else:
     62     # This parameter is normally overwritten with a dynamic value
     63     FAQCGI = 'faqw.py'                  # Relative URL of the FAQ cgi script
     64     FAQCGI = os.path.basename(sys.argv[0]) or FAQCGI
     65 del os, sys
     66 
     67 # Perl (re module) style regular expression to recognize FAQ entry
     68 # files: group(1) should be the section number, group(2) should be the
     69 # question number.  Both should be fixed width so simple-minded
     70 # sorting yields the right order.
     71 
     72 OKFILENAME = r"^faq(\d\d)\.(\d\d\d)\.htp$"
     73 
     74 # Format to construct a FAQ entry file name
     75 
     76 NEWFILENAME = "faq%02d.%03d.htp"
     77 
     78 # Load local customizations on top of the previous parameters
     79 
     80 try:
     81     from faqcust import *
     82 except ImportError:
     83     pass
     84 
     85 # Calculated parameter names
     86 
     87 COOKIE_NAME = SHORTNAME + "-FAQ-Wizard" # Name used for Netscape cookie
     88 FAQNAME = SHORTNAME + " FAQ"            # Name of the FAQ
     89 
     90 # ----------------------------------------------------------------------
     91 
     92 # Anything below this point normally needn't be changed; you would
     93 # change this if you were to create e.g. a French translation or if
     94 # you just aren't happy with the text generated by the FAQ Wizard.
     95 
     96 # Most strings here are subject to substitution (string%dictionary)
     97 
     98 # RCS commands
     99 
    100 import os
    101 if os.name in ['nt', ]:
    102     SH_RLOG = RCSBINDIR + "rlog %(file)s < NUL"
    103     SH_RLOG_H = RCSBINDIR + "rlog -h %(file)s  < NUL"
    104     SH_RDIFF = RCSBINDIR + "rcsdiff -r%(prev)s -r%(rev)s %(file)s < NUL"
    105     SH_REVISION = RCSBINDIR + "co -p%(rev)s %(file)s < NUL"
    106     ### Have to use co -l, or the file is not marked rw on NT
    107     SH_LOCK = RCSBINDIR + "co -l %(file)s < NUL"
    108     SH_CHECKIN =  RCSBINDIR + "ci -u %(file)s < %(tfn)s"
    109 else:
    110     SH_RLOG = RCSBINDIR + "rlog %(file)s </dev/null 2>&1"
    111     SH_RLOG_H = RCSBINDIR + "rlog -h %(file)s </dev/null 2>&1"
    112     SH_RDIFF = RCSBINDIR + "rcsdiff -r%(prev)s -r%(rev)s %(file)s </dev/null 2>&1"
    113     SH_REVISION = RCSBINDIR + "co -p%(rev)s %(file)s </dev/null 2>&1"
    114     SH_LOCK = RCSBINDIR + "rcs -l %(file)s </dev/null 2>&1"
    115     SH_CHECKIN =  RCSBINDIR + "ci -u %(file)s <%(tfn)s 2>&1"
    116 del os
    117 
    118 # Titles for various output pages (not subject to substitution)
    119 
    120 T_HOME = FAQNAME + " Wizard " + WIZVERSION
    121 T_ERROR = "Sorry, an error occurred"
    122 T_ROULETTE = FAQNAME + " Roulette"
    123 T_ALL = "The Whole " + FAQNAME
    124 T_INDEX = FAQNAME + " Index"
    125 T_SEARCH = FAQNAME + " Search Results"
    126 T_RECENT = "What's New in the " + FAQNAME
    127 T_SHOW = FAQNAME + " Entry"
    128 T_LOG = "RCS log for %s entry" % FAQNAME
    129 T_REVISION = "RCS revision for %s entry" % FAQNAME
    130 T_DIFF = "RCS diff for %s entry" % FAQNAME
    131 T_ADD = "Add an entry to the " + FAQNAME
    132 T_DELETE = "Deleting an entry from the " + FAQNAME
    133 T_EDIT = FAQNAME + " Edit Wizard"
    134 T_REVIEW = T_EDIT + " - Review Changes"
    135 T_COMMITTED = T_EDIT + " - Changes Committed"
    136 T_COMMITFAILED = T_EDIT + " - Commit Failed"
    137 T_CANTCOMMIT = T_EDIT + " - Commit Rejected"
    138 T_HELP = T_EDIT + " - Help"
    139 
    140 # Generic prologue and epilogue
    141 
    142 PROLOGUE = '''
    143 <HTML>
    144 <HEAD>
    145 <TITLE>%(title)s</TITLE>
    146 </HEAD>
    147 
    148 <BODY
    149       BGCOLOR="#FFFFFF"
    150       TEXT="#000000"
    151       LINK="#AA0000"
    152       VLINK="#906A6A">
    153 <H1>%(title)s</H1>
    154 '''
    155 
    156 EPILOGUE = '''
    157 <HR>
    158 <A HREF="%(HOMEURL)s">%(HOMENAME)s</A> /
    159 <A HREF="%(FAQCGI)s?req=home">%(FAQNAME)s Wizard %(WIZVERSION)s</A> /
    160 Feedback to <A HREF="mailto:%(OWNEREMAIL)s">%(OWNERNAME)s</A>
    161 
    162 </BODY>
    163 </HTML>
    164 '''
    165 
    166 # Home page
    167 
    168 HOME = """
    169 <H2>Search the %(FAQNAME)s:</H2>
    170 
    171 <BLOCKQUOTE>
    172 
    173 <FORM ACTION="%(FAQCGI)s">
    174     <INPUT TYPE=text NAME=query>
    175     <INPUT TYPE=submit VALUE="Search"><BR>
    176     <INPUT TYPE=radio NAME=querytype VALUE=simple CHECKED>
    177         Simple string
    178         /
    179     <INPUT TYPE=radio NAME=querytype VALUE=regex>
    180         Regular expression
    181         /<BR>
    182     <INPUT TYPE=radio NAME=querytype VALUE=anykeywords>
    183         Keywords (any)
    184         /
    185     <INPUT TYPE=radio NAME=querytype VALUE=allkeywords>
    186         Keywords (all)
    187         <BR>
    188     <INPUT TYPE=radio NAME=casefold VALUE=yes CHECKED>
    189         Fold case
    190         /
    191     <INPUT TYPE=radio NAME=casefold VALUE=no>
    192         Case sensitive
    193         <BR>
    194     <INPUT TYPE=hidden NAME=req VALUE=search>
    195 </FORM>
    196 
    197 </BLOCKQUOTE>
    198 
    199 <HR>
    200 
    201 <H2>Other forms of %(FAQNAME)s access:</H2>
    202 
    203 <UL>
    204 <LI><A HREF="%(FAQCGI)s?req=index">FAQ index</A>
    205 <LI><A HREF="%(FAQCGI)s?req=all">The whole FAQ</A>
    206 <LI><A HREF="%(FAQCGI)s?req=recent">What's new in the FAQ?</A>
    207 <LI><A HREF="%(FAQCGI)s?req=roulette">FAQ roulette</A>
    208 <LI><A HREF="%(FAQCGI)s?req=add">Add a FAQ entry</A>
    209 <LI><A HREF="%(FAQCGI)s?req=delete">Delete a FAQ entry</A>
    210 </UL>
    211 """
    212 
    213 # Index formatting
    214 
    215 INDEX_SECTION = """
    216 <P>
    217 <HR>
    218 <H2>%(sec)s. %(title)s</H2>
    219 <UL>
    220 """
    221 
    222 INDEX_ADDSECTION = """
    223 <P>
    224 <LI><A HREF="%(FAQCGI)s?req=new&amp;section=%(sec)s">Add new entry</A>
    225 (at this point)
    226 """
    227 
    228 INDEX_ENDSECTION = """
    229 </UL>
    230 """
    231 
    232 INDEX_ENTRY = """\
    233 <LI><A HREF="%(FAQCGI)s?req=show&amp;file=%(file)s">%(title)s</A>
    234 """
    235 
    236 LOCAL_ENTRY = """\
    237 <LI><A HREF="#%(sec)s.%(num)s">%(title)s</A>
    238 """
    239 
    240 # Entry formatting
    241 
    242 ENTRY_HEADER1 = """
    243 <HR>
    244 <H2><A NAME="%(sec)s.%(num)s">%(title)s</A>\
    245 """
    246 
    247 ENTRY_HEADER2 = """\
    248 </H2>
    249 """
    250 
    251 ENTRY_FOOTER = """
    252 <A HREF="%(FAQCGI)s?req=edit&amp;file=%(file)s">Edit this entry</A> /
    253 <A HREF="%(FAQCGI)s?req=log&amp;file=%(file)s">Log info</A>
    254 """
    255 
    256 ENTRY_LOGINFO = """
    257 / Last changed on %(last_changed_date)s by
    258 <A HREF="mailto:%(last_changed_email)s">%(last_changed_author)s</A>
    259 """
    260 
    261 # Search
    262 
    263 NO_HITS = """
    264 No hits.
    265 """
    266 
    267 ONE_HIT = """
    268 Your search matched the following entry:
    269 """
    270 
    271 FEW_HITS = """
    272 Your search matched the following %(count)s entries:
    273 """
    274 
    275 MANY_HITS = """
    276 Your search matched more than %(MAXHITS)s entries.
    277 The %(count)s matching entries are presented here ordered by section:
    278 """
    279 
    280 # RCS log and diff
    281 
    282 LOG = """
    283 Click on a revision line to see the diff between that revision and the
    284 previous one.
    285 """
    286 
    287 REVISIONLINK = """\
    288 <A HREF="%(FAQCGI)s?req=revision&amp;file=%(file)s&amp;rev=%(rev)s"
    289 >%(line)s</A>\
    290 """
    291 DIFFLINK = """\
    292  (<A HREF="%(FAQCGI)s?req=diff&amp;file=%(file)s&amp;\
    293 prev=%(prev)s&amp;rev=%(rev)s"
    294 >diff -r%(prev)s -r%(rev)s</A>)\
    295 """
    296 
    297 # Recently changed entries
    298 
    299 NO_RECENT = """
    300 <HR>
    301 No %(FAQNAME)s entries were changed in the last %(period)s.
    302 """
    303 
    304 VIEW_MENU = """
    305 <HR>
    306 View entries changed in the last...
    307 <UL>
    308 <LI><A HREF="%(FAQCGI)s?req=recent&amp;days=1">24 hours</A>
    309 <LI><A HREF="%(FAQCGI)s?req=recent&amp;days=2">2 days</A>
    310 <LI><A HREF="%(FAQCGI)s?req=recent&amp;days=3">3 days</A>
    311 <LI><A HREF="%(FAQCGI)s?req=recent&amp;days=7">week</A>
    312 <LI><A HREF="%(FAQCGI)s?req=recent&amp;days=28">4 weeks</A>
    313 <LI><A HREF="%(FAQCGI)s?req=recent&amp;days=365250">millennium</A>
    314 </UL>
    315 """
    316 
    317 ONE_RECENT = VIEW_MENU + """
    318 The following %(FAQNAME)s entry was changed in the last %(period)s:
    319 """
    320 
    321 SOME_RECENT = VIEW_MENU + """
    322 The following %(count)s %(FAQNAME)s entries were changed
    323 in the last %(period)s, most recently changed shown first:
    324 """
    325 
    326 TAIL_RECENT = VIEW_MENU
    327 
    328 # Last changed banner on "all" (strftime format)
    329 LAST_CHANGED = "Last changed on %c %Z"
    330 
    331 # "Compat" command prologue (this has no <BODY> tag)
    332 COMPAT = """
    333 <H1>The whole %(FAQNAME)s</H1>
    334 See also the <A HREF="%(FAQCGI)s?req=home">%(FAQNAME)s Wizard</A>.
    335 <P>
    336 """
    337 
    338 # Editing
    339 
    340 EDITHEAD = """
    341 <A HREF="%(FAQCGI)s?req=help">Click for Help</A>
    342 """
    343 
    344 REVIEWHEAD = EDITHEAD
    345 
    346 
    347 EDITFORM1 = """
    348 <FORM ACTION="%(FAQCGI)s" METHOD=POST>
    349 <INPUT TYPE=hidden NAME=req VALUE=review>
    350 <INPUT TYPE=hidden NAME=file VALUE=%(file)s>
    351 <INPUT TYPE=hidden NAME=editversion VALUE=%(editversion)s>
    352 <HR>
    353 """
    354 
    355 EDITFORM2 = """
    356 Title: <INPUT TYPE=text SIZE=70 NAME=title VALUE="%(title)s"><BR>
    357 <TEXTAREA COLS=72 ROWS=20 NAME=body>%(body)s
    358 </TEXTAREA><BR>
    359 Log message (reason for the change):<BR>
    360 <TEXTAREA COLS=72 ROWS=5 NAME=log>%(log)s
    361 </TEXTAREA><BR>
    362 Please provide the following information for logging purposes:
    363 <TABLE FRAME=none COLS=2>
    364     <TR>
    365         <TD>Name:
    366         <TD><INPUT TYPE=text SIZE=40 NAME=author VALUE="%(author)s">
    367     <TR>
    368         <TD>Email:
    369         <TD><INPUT TYPE=text SIZE=40 NAME=email VALUE="%(email)s">
    370     <TR>
    371         <TD>Password:
    372         <TD><INPUT TYPE=password SIZE=20 NAME=password VALUE="%(password)s">
    373 </TABLE>
    374 
    375 <INPUT TYPE=submit NAME=review VALUE="Preview Edit">
    376 Click this button to preview your changes.
    377 """
    378 
    379 EDITFORM3 = """
    380 </FORM>
    381 """
    382 
    383 COMMIT = """
    384 <INPUT TYPE=submit NAME=commit VALUE="Commit">
    385 Click this button to commit your changes.
    386 <HR>
    387 """
    388 
    389 NOCOMMIT_HEAD = """
    390 To commit your changes, please correct the following errors in the
    391 form below and click the Preview Edit button.
    392 <UL>
    393 """
    394 NOCOMMIT_TAIL = """
    395 </UL>
    396 <HR>
    397 """
    398 
    399 CANTCOMMIT_HEAD = """
    400 Some required information is missing:
    401 <UL>
    402 """
    403 NEED_PASSWD = "<LI>You must provide the correct password.\n"
    404 NEED_AUTHOR = "<LI>You must enter your name.\n"
    405 NEED_EMAIL = "<LI>You must enter your email address.\n"
    406 NEED_LOG = "<LI>You must enter a log message.\n"
    407 CANTCOMMIT_TAIL = """
    408 </UL>
    409 Please use your browser's Back command to correct the form and commit
    410 again.
    411 """
    412 
    413 NEWCONFLICT = """
    414 <P>
    415 You are creating a new entry, but the entry number specified is not
    416 correct.
    417 <P>
    418 The two most common causes of this problem are:
    419 <UL>
    420 <LI>After creating the entry yourself, you went back in your browser,
    421     edited the entry some more, and clicked Commit again.
    422 <LI>Someone else started creating a new entry in the same section and
    423     committed before you did.
    424 </UL>
    425 (It is also possible that the last entry in the section was physically
    426 deleted, but this should not happen except through manual intervention
    427 by the FAQ maintainer.)
    428 <P>
    429 <A HREF="%(FAQCGI)s?req=new&amp;section=%(sec)s">Click here to try
    430 again.</A>
    431 <P>
    432 """
    433 
    434 VERSIONCONFLICT = """
    435 <P>
    436 You edited version %(editversion)s but the current version is %(version)s.
    437 <P>
    438 The two most common causes of this problem are:
    439 <UL>
    440 <LI>After committing a change, you went back in your browser,
    441     edited the entry some more, and clicked Commit again.
    442 <LI>Someone else started editing the same entry and committed
    443     before you did.
    444 </UL>
    445 <P>
    446 <A HREF="%(FAQCGI)s?req=show&amp;file=%(file)s">Click here to reload
    447 the entry and try again.</A>
    448 <P>
    449 """
    450 
    451 CANTWRITE = """
    452 Can't write file %(file)s (%(why)s).
    453 """
    454 
    455 FILEHEADER = """\
    456 Title: %(title)s
    457 Last-Changed-Date: %(date)s
    458 Last-Changed-Author: %(author)s
    459 Last-Changed-Email: %(email)s
    460 Last-Changed-Remote-Host: %(REMOTE_HOST)s
    461 Last-Changed-Remote-Address: %(REMOTE_ADDR)s
    462 """
    463 
    464 LOGHEADER = """\
    465 Last-Changed-Date: %(date)s
    466 Last-Changed-Author: %(author)s
    467 Last-Changed-Email: %(email)s
    468 Last-Changed-Remote-Host: %(REMOTE_HOST)s
    469 Last-Changed-Remote-Address: %(REMOTE_ADDR)s
    470 
    471 %(log)s
    472 """
    473 
    474 COMMITTED = """
    475 Your changes have been committed.
    476 """
    477 
    478 COMMITFAILED = """
    479 Exit status %(sts)s.
    480 """
    481 
    482 # Add/Delete
    483 
    484 ADD_HEAD = """
    485 At the moment, new entries can only be added at the end of a section.
    486 This is because the entry numbers are also their
    487 unique identifiers -- it's a bad idea to renumber entries.
    488 <P>
    489 Click on the section to which you want to add a new entry:
    490 <UL>
    491 """
    492 
    493 ADD_SECTION = """\
    494 <LI><A HREF="%(FAQCGI)s?req=new&amp;section=%(section)s">%(section)s. %(title)s</A>
    495 """
    496 
    497 ADD_TAIL = """
    498 </UL>
    499 """
    500 
    501 ROULETTE = """
    502 <P>Hit your browser's Reload button to play again.<P>
    503 """
    504 
    505 DELETE = """
    506 At the moment, there's no direct way to delete entries.
    507 This is because the entry numbers are also their
    508 unique identifiers -- it's a bad idea to renumber entries.
    509 <P>
    510 If you really think an entry needs to be deleted,
    511 change the title to "(deleted)" and make the body
    512 empty (keep the entry number in the title though).
    513 """
    514 
    515 # Help file for the FAQ Edit Wizard
    516 
    517 HELP = """
    518 Using the %(FAQNAME)s Edit Wizard speaks mostly for itself.  Here are
    519 some answers to questions you are likely to ask:
    520 
    521 <P><HR>
    522 
    523 <H2>I can review an entry but I can't commit it.</H2>
    524 
    525 The commit button only appears if the following conditions are met:
    526 
    527 <UL>
    528 
    529 <LI>The Name field is not empty.
    530 
    531 <LI>The Email field contains at least an @ character.
    532 
    533 <LI>The Log message box is not empty.
    534 
    535 <LI>The Password field contains the proper password.
    536 
    537 </UL>
    538 
    539 <P><HR>
    540 
    541 <H2>What is the password?</H2>
    542 
    543 At the moment, only PSA members will be told the password.  This is a
    544 good time to join the PSA!  See <A
    545 HREF="http://www.python.org/psa/">the PSA home page</A>.
    546 
    547 <P><HR>
    548 
    549 <H2>Can I use HTML in the FAQ entry?</H2>
    550 
    551 Yes, if you include it in &lt;HTML&rt; and &lt;/HTML&gt; tags.
    552 <P>
    553 Also, if you include a URL or an email address in the text it will
    554 automatigally become an anchor of the right type.  Also, *word*
    555 is made italic (but only for single alphabetic words).
    556 
    557 <P><HR>
    558 
    559 <H2>How do I delineate paragraphs?</H2>
    560 
    561 Use blank lines to separate paragraphs.
    562 
    563 <P><HR>
    564 
    565 <H2>How do I enter example text?</H2>
    566 
    567 Any line that begins with a space or tab is assumed to be part of
    568 literal text.  Blocks of literal text delineated by blank lines are
    569 placed inside &lt;PRE&gt;...&lt;/PRE&gt;.
    570 """
    571 
    572 # Load local customizations again, in case they set some other variables
    573 
    574 try:
    575     from faqcust import *
    576 except ImportError:
    577     pass
    578