commit 65fc755fe2c0f2df201ebcf4fb19ef8aecdac4bb
Author: Aaron J. Graves <>
Date: Thu Feb 20 21:24:10 2014 -0600

  • DoSearch: Changed surrounding character count from 25 to 75 characters

commit 2fa160ac033febdfab2cd2e0f7e997872970b071
Author: Aaron J. Graves <>
Date: Wed Feb 19 22:34:32 2014 -0600

  • Added $CountPageVisits and $PageVisitFile
  • InitVars: Initialize $CountPageVisits with value 1
  • InitVars: Call RegAdminPage on 'css', calls DoAdminCSS()
  • InitVars: RegPostAction 'css' calling DoPostingCSS()
  • Removed sub InitTemplate
  • DoHeader: Re-wrote to do new theme
  • DoFooter: Re-wrote to do new theme
  • DoCSS: Wrote the sub to return $DataDir/style.css (if exsts) or default CSS
  • Added sub Commify: Takes numerical value, returns it with commas every 3 digits
  • Added sub GetPageViewCount: Takes a page name, returns the count of page views
  • Added sub GetTotalViewCount: Returns the total view count of all pages
  • InitDirs: Initialize $PageVisitFile
  • DoAdminIndex: If $CountPageVisits is true, then display the counts next to the page names
  • Added sub DoAdminCSS: Handler for editing the site CSS from the admin back-end
  • DoAdmin: Changed the line at the bottom of the screen to show total pages, total revisions, and total page views
  • DoHistory: Call Commify on all numbers, and show page views
  • Added sub DoPostingCSS: POST handler for CSS form
  • DoVisit: Only execute logging of visitor if $MaxVisitorLog > 0.
  • DoVisit: If page exists, and 'do' paramater not specified, and $CountPageVisits is true, then add the visit to the database
  • DoMaint: Tiny change to variable declaration
  • DoRequest: Remove some commented blocks of code
  • DATA: Now holds the default CSS instead of the default 'theme'

  • Added note to set $MaxVisitorLog to 0 to disable
  • Added block for $CountPageVisits

commit 803d78a21d618d72fad2cb4ac6f1ac670b09271c
Author: Aaron J. Graves <>
Date: Thu Feb 13 21:18:13 2014 -0600

  • Updated copyright year
  • Added $AdminText and $RandomText
  • InitVars: Added code to generate $AdminText and $RandomText
  • MarkupBuildLink: Check for the presence of '?', and if it exists, strip it and trailing characters from the link
  • ReadCookie: Began changing the way this sub worked, then changed my mind. One line of commented code still.
  • Added sub CanView: If $SiteMode < 3, true. Otherwise, check if logged in.
  • Added sub IsLoggedIn: Right now, does exactly the same thing that IsAdmin does, however this could change in the future.
  • DoAdmin: Added a "go back" link at the bottom
  • Init: Move DoPostInit() to below LoadPlugins()
  • Added sub AppendStringToFile: Calles FileToString(), adds to it, then call StringToFile();
  • DoRevert: Confirm any revert request before executing it
  • DoRequest: Call CanView() before allowing the request through
  • DoRequest: For the 'random' param, instead of calling DoRandom(), we should have been calling $Commands{'random'}
  • THEME: Get rid of hard-coded admin and random links, get $AdminText and $RandomText instead

  • Added $SiteMode of 3, which is required authentication for anything

commit 2d703670d62d2b7e9c1191137a401c42420b7448
Author: Aaron J. Graves <>
Date: Fri Sep 13 14:46:59 2013 -0500

  • InitVars: Modify GetParam call for "Search for" to return empty string (default was 0)
  • InitVars: Only call ReplaceSpaces on the link portion, and not the text, of each item in @NavBarPages when building $NavBar
  • Wrote sub DoCSS - Will handle CSS for themes in the future
  • MarkupBuildLink: Check for CanEdit() before giving edit link
  • Wrote sub GetArchivePage - Does the same thing as GetPage, except for an archive revision
  • SetCookie: Now get username and password as arguments
  • AdminForm: Add space in front of "Go" button
  • DoAdminVersion: Call "grep --version" again as we use grep
  • DoAdminClearVisits: Provide a prompt now instead of just clearing the log file
  • DoAdminBlock: Add <br/> after </textarea>
  • DoAdminBannedContent: Add <br/> after </textarea>
  • PassesSpamCheck: BUGFIX: checksum was asking for $FORM{question}, should have been $FORM{session}
  • DoSearch: GetPage call now uses $fn instead of $file
  • DoHistory: Show IP addresses next to each name
  • DoPostingLogin: Send $FORM{user} and $FORM{pass} as arguments to SetCookie, since it wants arguments now
  • DoPostingEditing: Set the user name to what was entered
  • DoPostingDiscuss: Set the user name to what was entered
  • DoPostingDiscuss: Break up the StringToFile call into multiple lines for readability
  • DoVisit: If do=search, set $mypage to parameter search, otherwise $Page

commit 1145b6b3556b7b37f45e5b42b2857bba065becdd
Author: Aaron J. Graves <>
Date: Wed Aug 28 22:18:01 2013 -0500

  • InitVars: Change how $Page is detected
  • InitVars: Change $RevisionsText to say "Page Info & History"
  • InitVars: Call ReplaceSpaces() instead of direct substitution
  • MarkupBuildLink: Change way links are parsed
  • Markup: Check $UserName instead of calling ReadCookie() for Signature
  • GetPage: Call ReadDB now instead of reading the page
  • LogRecent: Call Notify() at the end
  • Wrote sub Notify: Does nothing now, reserved for future usage
  • Changed every instance of a call to GetPage to refer to just the page name rather than the full path (and where full paths were required, call
  • SetLock: Comparison to $UserIP is now "ne" rather than "!="
  • SetLock: Return RefreshLock()
  • DoArchive: Call PageExists() instead of -f test
  • WritePage: Convert 4 ~'s to GetSignature()
  • WritePage: Call WriteDB() now instead of write directly
  • Wrote sub WriteDB - Writes out a file in the DB format
  • Wrote sub ReadDB - Reads in a file in DB format
  • AppendPage: Call WriteDB() now instead of write directly
  • AntiSpam: Add an extra <br/> before the question is printed
  • IsBannedContent: Removal of comments and blank lines combined into one grep statement, also check for trailing comment on a line
  • DoDiscuss: Add id="discuss-form" to <p> element just before form
  • DoDiscuss: Add hidden div with MarkupHelp(), and link to unhide the div
  • DoSearch: Call ReplaceSpaces() instead of doing it manually
  • DoSearch: Add two line breaks after "Anothing found!"
  • DoSearch: Add "pages found" count at the bottom of search results
  • DoHistory: Call PageExists() instead of -f test
  • DoHistory: Calculate line count, word count, character count (with and without spaces), and data size of the page
  • DoPostingDiscuss: When re-directing, go to #discuss-form rather than #bottom
  • FileToString: Call FileToArray() and return that joined by "\n"
  • FileToArray: Fixed typo in error message
  • DiscussCount: When getting count, split on the output of GetDiscussionSeparator() in case it's not "----" in the future.

commit cc40733cb9f811d4eae902b0f4004292fa86c445
Author: Aaron J. Graves <>
Date: Tue Aug 20 14:23:23 2013 -0500

  • Added $EditorLicenseText and explanatory text

  • Added vars @PostInitSubs and $EditorLicenseText
  • InitVars: Removed the admin page registration call for 'unlock', just leave it as 'lock' now but change the text displayed based on if the site
  • InitVars: Correct the RegSpecialPage call for $DiscussPrefix (missing period)
  • Wrote sub DoPostInit - Runs subs in @PostInitSubs (if any) just before Init() completes
  • Wrote subs DoHeader and DoFooter - Replacement for InitTemplate (will include default theme in the near future)
  • Markup: Added 4x~, which calls GetSignature()
  • Markup: Changed the way headers are discovered/written, also adds id= (for anchors/TOC later)
  • Wrote sub MarkupHelp - Displays a helpful style guide below the page editor
  • Wrote sub RegPostInitSub - registers a sub to run by DoPostInit()
  • Wrote sub IsSpecialPage - if the current page is registered as a special page via RegSpecialPage, will return true (1) otherwise false (0)
  • DoSpecialPage: Change the match regex to match better
  • GetFile: Rename to GetPage (and throughout)
  • DoEdit: Add an extra <br/> after both <textarea>'s
  • DoEdit: If $EditorLicenseText is set, displate it (in <p> tags) after the editor form
  • WriteFile: Rename to WritePage (and throughout)
  • GetSignature: Do not include '\n----\n' at the tail end (automatic <hr>)
  • AppendFile: Rename to AppendPage (and throughout)
  • AppendPage: Call GetDiscussionSeparator() after GetSignature()
  • DoAdminLock: Handle unlock if site already locked
  • DoAdminBlock: Remove comments (#) and blank lines from count displayed
  • Init: Remove InitTemplate(), now call DoPostInit() before LoadPlugins()
  • DoDiscuss: Added code to remove signature from preview FIXME: Call GetDiscussionSeparator() here in the future!
  • DoDiscuss: Now use 'placeholder' element instead of onfocus and onblur calls in comment box
  • DoRecentChanges: Only link author name if a page of the same name exists
  • DoSearch: Use 'placeholder' element on input box, and if the 'search' parameter has anything in it, pre-fill the value of the input box with it
  • DoHistory: Only link author name if a page of the same name exists
  • DoHistory: Change text for no history to "No log entries found."
  • DoPostingDiscuss: Call GetDiscussionSeparator(), add it to GetSignature()
  • DoPostingDiscuss: When ReDirect is called, add "#bottom" to the call (so user gets right back to where they left off)
  • Wrote sub StripMarkup - Returns only alphanumeric text, and spaces and underscores
  • Wrote sub IsDiscussionPage - Returns true (1) if page matches $DiscussionPrefix, false (0) otherwise.
  • DoRequest: Call GetHeader() and GetFooter() instead of interpolating the $Header and $Footer variables

commit cdd9b31e89dda37c650c1c3040815ca97173933e
Author: Aaron J. Graves <>
Date: Thu Aug 15 18:50:54 2013 -0500

  • InitVars: Strip any leading periods in $Page
  • Wrote sub GetSignature - Gets the signature line to be used when a discussion comment is posted.
  • AppendFile: Call GetSignature, remove local $sig all together
  • DoAdminListVisitors: Change submit button on search form from "Limit" to "Search"
  • DoDiscuss: Check if a preview file exists, and if it's younger than 10 seconds old. If so, add it to the bottom, otherwise delete the file.
  • DoDiscuss: Changed the way the form textarea does it's work, in terms of clearing the default text.
  • DoDiscuss: Added "Preview" button next to "Save"
  • DoSearch: Added check for no search parameter. If none, give up.
  • SearchForm: Changed the $ret build a bit
  • DoPostingDiscuss: Added check for "preview", if found it will save the preview file, otherwise if save, do what you did before.
  • DoPosting: Remove all slashes from file name ($FORM{'file'}), and any leading periods.
  • DoRandom: Instead of old javascript redirect method, use ReDirect() now
  • DoRequest: Check if param 'do' is 'random', and if so, call DoRandom()
  • TEMPLATE: Add double click handler to the wrapper div. Will call the 'edit' action.

commit cc8ed3cb1b238344637ae8f225c71c85425f0957
Author: Aaron J. Graves <>
Date: Mon Aug 12 14:57:15 2013 -0500

  • Added blocks for $SurgeProtectionTime and $SurgeProtectionCount - both set to 20 by default

  • Added variables $SurgeProtectionTime and $SurgeProtectionCount
  • Removed several blocks of commented out code throughout the script
  • InitVars: Added $SurgeProtectionTime and $SurgeProtectionCount to default declarations
  • Index: Call FileToArray instead of reading the file directly
  • DoAdminVersion: Add version information for awk to the end
  • Wrote sub DoSurgeProtection - Checks the last $SurgeProtectionTime seconds for violators who have infringed on the limit set by $SurgeProtectio
  • DoRequest: Added call for DoSurgeProtection();
  • TEMPLATE: Changed $Page to $SearchPage in the search link

commit 770307e8c3957533fa643db142487aec093978fe
Author: Aaron J. Graves <>
Date: Mon Aug 12 09:44:30 2013 -0500

  • Markup: Check for '#NOWIKI' right at the beginning, and if matched, return.
  • Markup: Comment previous '!! nomarkup' check.
  • DoAdminListVisitors: Add a form at the top which allows you to set/clear the 'limit' parameter

commit b05b8de6ec6d9121783bb83387f4226a27088c23
Author: Aaron J. Graves <>
Date: Fri Aug 9 15:11:27 2013 -0500

  • Require perl 5.10 or higher (just in case)
  • InitVars: Set a safe $ENV{path}
  • InitVars: Don't set $PageName to 'Admin' anymore if param 'do' is 'admin'
  • InitVars: Rather than build hashes bare, call RegCommand, RegAdminPage, and RegPostAction
  • InitVars: Change SetSpecialPage to RegSpecialPage
  • SetSpecialPage: Rename to RegSpecialPage
  • Wrote sub UnregSpecialPage - unregisters a special page
  • Wrote sub RegAdminPage - registers an admin page
  • Wrote sub UnregAdminPage - unregisters an admin page
  • Wrote sub RegPostAction - registers a POST action
  • Wrote sub UnregPostAction - unregisters a POST action
  • Wrote sub RegCommand - registers a command
  • Wrote sub UnregCommand - unregisters a command
  • DoEdit: textareas now have style="width:100%" hardcoded
  • DoAdminVersion: Include $ENV{'SERVER_SOFTWARE'}, perl and diff versions at the end of the output
  • DoAdminListVisitors: Include a form for easy entry to the limit param
  • DoAdminBannedContent: Provide the count of the number of rules loaded
  • PassesSpamCheck: If $FORM{'answer'} is blank, return 0
  • PassesSpamCheck: Check if the answer exists in %AnswerQuestions, and if not, return 0
  • DoDiscuss: textarea now has style="width:100%" hardcoded, $NewComment will auto clear and populate when the textarea gets and loses focus, respectively.

commit 71b94231983047798d66d9d35113cb26331738e5
Author: Aaron J. Graves <>
Date: Thu Aug 8 13:31:17 2013 -0500

  • Added var %SpecialPages
  • InitVars: Moved hex check higher
  • InitVars: If param 'page' not set, set it to either $Page or param 'do' (if set)
  • InitVars: In %AdminList, rename 'block' to "Block users"-
  • InitVars: Declare special pages at end using SetSpecialPage
  • MarkupBuildLink: Add rel-"nofollow" to edit links
  • Wrote sub SetSpecialPage - Links a page name with a sub to execute
  • Wrote sub DoSpecialPage - Checks if $Page matches one of %SpecialPages, and if so, executes the linked sub
  • WriteFile: Get rid of \r and \n from summary
  • AdminForm: If a password is set, put it in the password input field
  • DoAdminListVisitors: Make sure the limit= search is case insensitive
  • DoAdmin: Sort %AdminList alphabetically by value, then display the list
  • DoDiscuss: Add open and close paragraph tag before the form
  • DoSearch: new var $altsearch, which is $search with spaces replaced by underscores. This allows a search for "test test" to match the page name
  • DoRequest: $SearchPage will now always be the $PageName with spaces replaced by '+'
  • DoRequest: All of the previously hard-coded checks for RecentChanges and $DiscussPrefix have been commented out, and DoSpecialPage() is called

commit f0ce3a7f0433b1dcbfb9693679a471ceecbe0d1f
Author: Aaron J. Graves <>
Date: Tue Aug 6 21:35:31 2013 -0500

  • Added variable %Param
  • InitVars: Added code to add variables into %Param
  • InitVars: Changed all areas where $command was called to GetParam('do')
  • Wrote sub GetParam - Gets from %Param, or returns the default
  • DoEdit: Changed size of uname input
  • AdminForm: Changed size of inputs
  • DoAdminListVisitors: Instead of $ArgList, use GetParam on 'limit'
  • DoAdminBlock: Added text at top about regex's and comments
  • DoSearch: Instead of $ArgList, use GetParam on 'search'
  • SearchForm: Changed input name from page to search
  • DoVisit: Changed to use GetParam
  • DoDiff: Changed to use GetParam
  • DoDelete: Changed to use GetParam
  • DoRevision: Changed to use GetParam
  • DoRevert: Changed to use GetParam
  • IsBlocked: Convert to allowing regex's and comments
  • DoRequest: Changed to use GetParam
  • TEMPLATE: Changed link to search to use 'search' param instead of 'page'

commit 872cfc9ca4778c699a1f9910c05111f5945603d2
Author: Aaron J. Graves <>
Date: Mon Aug 5 15:40:11 2013 -0500

  • Removed opening and closing paragraph tags from $NewPage
  • Added %QuestionAnswer section

  • Added vars %QuestionAnswer and $BannedContent
  • Added more comments throughout the entire script
  • InitVars: Moved $NewPage and $NewComment to right below $FancyUrls
  • InitVars: Removed lod $NavBar code that was commented out
  • InitVars: Added bannedcontent to %AdminActions, %AdminList, and %PostingActions
  • Markup: Removed commented code at bottom
  • InitDirs: Added $BannedContent under $BlockedList
  • SetCookie: Added check to remove trailing slash from $cookiepath
  • DoEdit: Changed way RedHerringForm was called
  • DoEdit: Added <br/> after textarea, change summary field to textarea
  • DoEdit: Added rel="nofollow" to Delete link
  • AppendFile: Comment out the line that converts \n to \n\t, as it was messing with paragraph breaks in discussions
  • AppendFile: Remove all \n's from summary
  • DoAdminListVisitors: Add check for "index"
  • DoAdminBlock: Change rows on textarea to 30
  • Wrote sub DoAdminBannedContent - Handles the $BannedContent file
  • RedHerringForm: Print directly instead of return the form
  • Wrote sub AntiSpam - Handles the Question and Answer for TextCha
  • Wrote sub IsBannedContent - Checks the submitted data against $BannedContent
  • Wrote sub PassesSpamCheck - Various anti-spam check when data is submitted
  • DoDiscuss: Print directly instead of return discussion form
  • DoPostingEditing: Call PassesSpamCheck() before WriteFile()
  • DoPostingDiscuss: Call PassesSpamCheck() before AppendFile()
  • Wrote sub DoPostingBannedContent - Handles the POST even for updating $BannedContent from the admin interface
  • DoDelete: Instead of CanEdit, call IsAdmin (only admins can delete now)
  • Wrote sub ErrorPage - For 403 and maybe other errors
  • DoRequest: If IsBlocked, call ErrorPage() rather than handling it ourselves
  • DoRequest: Change call to DoDiscuss, since it prints by itself now
  • TEMPLATE: Change header

commit 2e4f83ea8dca23db3141c1060db6a94c9b38e4cd
Author: Aaron J. Graves <>
Date: Thu Aug 1 14:38:52 2013 -0500

  • InitVars: If $FancyUrls is not set, instead of '?' use '/' in $ShortUrl and $Url
  • InitVars: $Page now checks for PATH_INFO, and if it is set and QUERY_STRING is empty, use PATH_INFO for $Page, otherwise use QUERY_STRING
  • MarkupBuildLink: When building a link for internal pages, if the page does not exist, and the link does not start with '?' or match $DiscussPre
  • DoDiscuss: Textarea is now 10 rows instead of 5

commit 95a38a9acc54447d8712477b70a2f631c323978f
Author: Aaron J. Graves <>
Date: Thu Aug 1 14:19:24 2013 -0500


  • Added an additional condition to check QUERY_STRING
  • Changed RewriteRule to use / instead of ?


  • Added directory

commit e3353ba3510c21113d329dc5f2c2863f705e7b95
Author: Aaron J. Graves <>
Date: Wed Jul 31 21:48:44 2013 -0500

  • Added '$| = 1' so output is not buffered
  • InitVars: Call InitDirs() inside InitVars() instead of after InitVars()
  • InitVars: Add the result of DiscussCount() to $DiscussText
  • InitVars: Added 'index' to %Commands, point it at DoAdminIndex()
  • DoAdminReIndex: Show the count of files added to the index
  • Init: Comment out InitDirs(), as it is now called from inside InitVars()
  • RedHerringForm: Add 'label's for the inputs
  • DoMaintPurgeOldRevs: Return to using stat() to check file modification time instead of internal 'ts' variable
  • Added sub DiscussCount - Returns the number of comments on a discussion page
  • CSS: Added .navbar block
  • THEME: $NavBar is now shown in a <div> rather than a <span> element

commit 72a988e25ba9e2e4b38ce3681d70465f66110756
Author: Aaron J. Graves <>
Date: Thu Jul 25 14:57:59 2013 -0500

  • Updated $VERSION to 0.30
  • InitVars: Added 'spam' and 'recentchanges' to %Commands
  • InitVars: Added 'commenting' to %PostingActions
  • Created sub MarkupBuildLink - takes everything between [ and ?] and returns a properly formatted href anchor
  • Markup: Commented existing link checking code, added new line that calls MarkupBuildLink() below the images section
  • DoEdit: Add call to RedHerringForm() before the actual edit form
  • Created sub CountAllRevisions - returns a number of revisions that exist in $ArchiveDir
  • DoAdminIndex: Output the page list in an ordered list
  • DoAdminListVisitors: Added check for "spam" in the action field
  • DoAdmin: Call CountAllRevisions() in addition to counting the return val from ListAllPages() at the bottom of the admin page
  • Wrote sub RedHerringForm - returns a honeypot form to catch spammers
  • DoDiscuss: Call RedHerringForm() before the discussion form
  • Wrote sub DoPostingSpam - handles the POST action when the honeypot form is submitted
  • Wrote sub DoSpam - handles the "spam" action after honeypot form is submitted
  • TEMPLATE: Moved <head> onto it's own line, added xml:lang="en" to <html> tag