release readme2index.sh version 1.0 2024-01-14

The initial release of `bin/readme2index.sh` tool that converts
`READMD.md` and various JSON files such as `.winner.json`
as well as "author/author_handle.json" files.

Applied the `readme2index.sh` tool to generate `2020/ferguson1/index.html`.

We generated the  `2020/ferguson1/index.html` by executing:

```sh
./bin/readme2index.sh -v 3 2020/ferguson1
```

NOTE: This above tool requires **pandoc to be installed**.
See the [pandoc web site](https://pandoc.org) for how
to install.  We used _HomeBrew_ to install it,
but there is also a _macports_ process as well.

NOTE: While the above web page does have formatting issues, it is
a first attempt data driven programmatic web page generation.

Some adjustments can be made by mostly improving `ioccc.css`,
and some perhaps by modifying how `bin/pandoc_wrapper.sh`
invokes pandoc.  But probably most of the improvements can
be made by fixing and improving `ioccc.css`.

TODO: Fix and improve the `2020/ferguson1/index.html`
web page by fixing and improving `ioccc.css`.

Moved scripts and tools needed to generate HTML pages
into a new `/bin` subdirectory.

TODO: Consider getting rid of the [build-ioccc
repo](https://github.com/ioccc-src/build-ioccc) and just use the
`/bin` subdirectory.

NOTE: Some links in the `2020/ferguson1/index.html`
web page do not (yet) exist.

TODO: Once the basic format of the `2020/ferguson1/index.html` web
page is somewhat reasonable, generate `index.html` pages for other
winners.  Generate the year level `index.html' files.
Generate the top level HTML files, including the missing
`location.html` file.

Greatly simplified the `.winner.json` file format,
removing a number of fields that were not strictly needed
for generating an inventory on a `index.html` page.

Updated various versions:

* `bin/gen-author.sh` VERSION="1.3 2024-01-14"
* `bin/gen-inventory.sh` VERSION="1.0 2024-01-14"
* `bin/manifest.winner.json.awk` VERSION="1.0 2024-01-14"
* `bin/pandoc_wrapper.sh` VERSION="1.3 2024-01-14"
* `bin/readme2index.sh` VERSION="1.0 2024-01-14"
* `bin/subst.default.sh` VERSION="1.1 2024-01-14"
* `bin/subst.winner-index.sh` VERSION="1.1 2024-01-14"
* `tmp/gen_path_list.found.sh` VERSION="1.1 2024-01-14"
* `tmp/gen_winner_json.sh` VERSION="1.1 2024-01-14"

The `.winner.json` file format from winner_JSON_format_version
"0.5 2023-11-04" to "1.0 2024-01-14".

All `.winner.json` files have been updated to use the
new `.winner.json` file format.

The manifest (`tmp/manifest.numbers` and `tmp/manifest.csv`) has
updated to use the new `.winner.json` file format.

The following procedure was used to generate the
`tmp/manifest.csv` manifest file:

0. open [manifest.numbers](manifest.numbers) in numbers: modify if/as needed

NOTE: Please try to keep the [manifest.numbers](manifest.numbers) spreadsheet
      in order order.  Use Organize -> Sort -> ((Sort Now)) to sort.

NOTE: Empty fields in the [manifest.numbers](manifest.numbers) spreadsheet
      are not allowed.  By default, a cell that is empty is colored
      as a warning.

1. File -> Export To -> CSV...
    * 1a. `[ ]` Include table names (unset)
    * 1b. Text Encoding: Unicode (UTF-8)
    * 1c. Click ((Save..))

2. Save As: manifest.csv
    * 2a. Select the `tmp` directory

3. Click ((Export))
    * 3a. If needed click ((Replace))

4. Execute ./tmp/[fix_csv.sh](fix_csv.sh)

NOTE: You must run the [fix_csv.sh](fix_csv.sh) in the above
      step in order to make the CSV file usable by other tools.

NOTE: If no changes are needed in the above step, the
      original file content will be restored.

5. Execute ./tmp/[gen_path_list.found.sh](gen_path_list.found.sh)

NOTE: The above step silently performs a `make clobber` at the
      top level, and so it takes a bit of time.

NOTE: If no changes are needed in the above step, the
      original file content will be restored.

6. Execute ./tmp/[check_path_list.sh](check_path_list.sh)

NOTE: The above step prints nothing and for an exit 0, then
      all is well.  If there is a problem, such as files
      found that are not part of the manifest, or files
      in the manifest that are not found, then an error
      message will be printed and the tool will exit non-zero.
      If errors are reported, go back to step 0 and
      correct the errors.

7. Execute ./tmp/[run_all.sh](run_all.sh) ./gen_winner_json.sh

NOTE: The above step will take a few seconds to run.  It will rebuild
      all `.winner.json` files for all winners.

NOTE: If no changes are needed in the above step, the
      original file content will be restored.

8. Execute `git status` and inspect changes

NOTE: Check in changes if and as needed.

NOTE: In a number of shell scripts under `bin/*.sh`,
      and in the `bin/manifest.winner.json.awk` script
      you will find comments of the form:

```
```

This is a note that when tools such as `jnamval` (and `jval` and `jfmt`) are
ready, these gross hacks should be replaced with calls to those tools.
Until they are ready, some must be careful with the layout of JSON files.

A number of bugs and typos have been fixed.

NOTE: Fixing typos in the files touched by this comment is welcome.
      This includes scripts, data files, text files, etc.

The _inventory_order_, _display_as_, _display_via_github_.  and
_winners_text_ fields of the [manifest.numbers](manifest.numbers)
spreadsheet were just set to have some initial values.
As they impact the inventory displayed on `index.html` pages,
their content needs to be improved.

NOTE: Improving the above mentioned fields of the
      [manifest.numbers](manifest.numbers) spreadsheet is welcome.
This commit is contained in:
Landon Curt Noll committed 2024-01-14 22:03:28 -08:00
1 parent f5a259d3b3
commit c6e6201209
366 files changed
+29369 -31783

No files matched your search

+4 -202
View File
@@ -1,212 +1,14 @@
# inc
The [inc](/inc) directory holds content that is used by the
[build-ioccc repo](https://github.com/ioccc-src/build-ioccc/tree/master)
**HOWEVER ...** XXX
While the build-ioccc repo is not ready, tools under
[temp-test-ioccc repo tmp directory](https://github.com/ioccc-src/temp-test-ioccc/tree/master/tmp)
will use files in this directory.
The [inc](README.md) directory holds content that is used by the
tools in the [bin](../bin/README.md) directory.
## Why the name inc?
We use inc because "include" would be misleading for both C and because
the contents of HTML files under [inc](/inc) are not really included
the contents of HTML files under [inc](README.md) are not really included
by the web server or the browser. Content of HTML files is
processed by tools in the [build-ioccc repo](https://github.com/ioccc-src/build-ioccc/tree/master).
processed by tools the [bin](../bin/README.md) directory.
Processing can include substitution of strings of the form _%%CURDS%%_ with some command
line supplied value by the tool in question.
## How HTML content is built
Files under the [inc](/inc) directory contain HTML fragments that the
[build-ioccc repo](https://github.com/ioccc-src/build-ioccc/tree/master)
tools use to form HTML content for the [official IOCCC web site](https://www.ioccc.org).
The canonical way that HTML content is built uses, by default, files of the form:
```
*.default.html
```
### HTML phases
The following HTML phase files are used to build HTML content:
0. inc/top.default.html
1. inc/head.default.html
2. inc/body.default.html
3. inc/header.default.html
4. inc/topnav.default.html
5. inc/begin-row.default.html
6. inc/begin-leftcolumn.default.html
7. inc/sidenav.default.html
8. inc/end-leftcolumn.default.html
9. inc/begin-rightcolumn.default.html
10. inc/before-content.default.html
Phases 11-19 are reserved for future use.
20. ((insert before pandoc tool output))
21. ((insert pandoc tool output))
22. ((insert after pandoc tool output))
Phases 23-29 are reserved for future use.
30. inc/after-content.default.html
31. inc/end-rightcolumn.default.html
32. inc/end-row.default.html
33. inc/footer.default.html
34. inc/bottom.default.html
Phases 35-39 are reserved for future use.
In the above HTML phases, except HTML phases 20-29, symbols of the form %%TOKEN%% are substituted.
### Tool command line
The command line of a [build-ioccc repo](https://github.com/ioccc-src/build-ioccc/tree/master)
tool, and perhaps modified via [md2html config file](/inc/md2html.cfg) file may change
to using a different filename for a given phase.
For example when forming the HTML from `2020/ferguson2/chocolate-cake.md`,
a different "topnav" navigation bar is needed. So instead of the
usual top navigation bar that normally directs people to the previous
entry for the year, or go up to the year page, or to the next entry
for the year, a top navigation bar to just go up to the entry's
main page is needed. A line the [md2html config file](/inc/md2html.cfg) file
that refers to `2020/ferguson1/chocolate-cake.md` may specify use
of `topnav.up2index.html` instead of using the `topnav.default.html` default.
The HTML phase may be skipped resulting in no HTML output during a given phase.
Furthermore, forming HTML content from a given markdown file altogether.
See comments in the [md2html config file](/inc/md2html.cfg) file for details.
## Use CAUTION when modifying inc files
Some of the files under this directory are used to form **MOST** of the HTML content
on the [official IOCCC web site](https://www.ioccc.org):
**HOWEVER ...** XXX
Well, until the [official IOCCC web site](https://www.ioccc.org), via the
[IOCCC winner repo](https://github.com/ioccc-src/winner) is ready for the mass pull request/merge,
these files are used to form **MOST** of the HTML content
on the [experimental web site](https://ioccc-src.github.io/temp-test-ioccc/).
... and in particular files under [inc](/inc) that are of the form (called default HTML files) ...:
```
*.default.html
```
... contain default content used to form IOCCC HTML / IOCCC web pages.
Instead of editing the default HTML files in order to fix a special web page,
consider making a copy of the default file and modifying the [md2html config file](/inc/md2html.cfg) to refer to the copy instead. That way your special case situation will
not impact **MOST** of the HTML content.
## Why do we do not use certain well know HTML technology
You may wonder why we need these files in the first place.
You may wonder why we even need the tools in the
[build-ioccc repo](https://github.com/ioccc-src/build-ioccc/tree/master)
when there other solutions available to form web pages.
### <a name="static-only"></a>Static web pages only
Here are some reasons why we are using these files and
special tools to create HTML content / IOCCC web pages:
We host [official IOCCC web site](https://www.ioccc.org) via [GitHub pages](https://pages.github.com).
As of the time this file written, **only static web pages are supported**.
### Cannot use server side include
We use [static web pages](#static-only), so use of "server side include" is not available to the IOCCC.
For example, Apache SSI "#include" does not work on [GitHub pages](https://pages.github.com).
### Cannot use a back-end database
We use [static web pages](#static-only), so use of "back-end database" is not available to the IOCCC.
### <a name="why-github"></a>Cannot use non-GitHub web servers
The [GitHub pages](https://pages.github.com) have the distributed server capacity needed to handle
the **huge download volume** or [Slashdot effect](https://en.wikipedia.org/wiki/Slashdot_effect)
that happens when a IOCCC winners are published.
Most so-called low cost web hosting sites have a somewhat hidden excessive bandwidth charge
and/or cap bandwidth when the volume gets too high, and/or do not have the infrastructure
that can handle the [Slashdot effect](https://en.wikipedia.org/wiki/Slashdot_effect).
The IOCCC had experience with people offering web mirrors and even free hosting
only to find that the generous benefactor moves on, or their service is purchased
by someone else who is not so generous. While it is possible that GitHub might someday
suffer a similar fate, for the time being we are betting that GitHub will remain
willing to host the IOCCC.
The [official IOCCC web site](https://www.ioccc.org) is, after all, primarily C source code
with some supporting documentation. As such it is a natural fit for GitHub and
[GitHub pages](https://pages.github.com).
### cannot use the HTML object tag
The _<_ object _>_ HTML tag does not work for our needs.
The browser context relationship between the HTML content holds the
HTML tag does not extend into the content that the tag includes.
For example, menu bars will not operate as specified by the [ioccc CSS](/ioccc.css).
### cannot use the HTML embed tag
The _<_ embed _>_ HTML tag does not work for our needs.
This tag wants one to specify the _width_ and _height_ in pixels.
Use of a percentage is not officially supported even if some browsers
might do so. Our Responsive Web Design on the [ioccc CSS](/ioccc.css)
needs to be responsive to small-sized cell phone-like screens,
mid-sized table-like screens, as well as large-sized desktop-like screens.
Specifying a _width_ and _height_ in pixels will not work well in
all of those screen size contexts.
### cannot use the HTML iframe tag
The _<_ iframe _>_ HTML tag does not work for our needs.
This tag wants one to specify the _width_ and _height_ in pixels.
Use of a percentage is not officially supported even if some browsers
might do so. Our Responsive Web Design on the [ioccc CSS](/ioccc.css)
needs to be responsive to small-sized cell phone-like screens,
mid-sized table-like screens, as well as large-sized desktop-like screens.
Specifying a _width_ and _height_ in pixels will not work well in
all of those screen size contexts.
### cannot use JavaScript to include content
We do not use JavaScript to include HTML content.
While the IOCCC may use JavaScript in the future to directly render things like C source code,
we will do so in such a way that someone will be able to view [official IOCCC web site](https://www.ioccc.org)
content with JavaScript disabled.
The IOCCC will **NOT MANDATE USE OF JavaScript** to view [official IOCCC web site](https://www.ioccc.org).
For this reason, we cannot use JavaScript include HTML content.
+2 -2
View File
@@ -1,3 +1,3 @@
<!-- START: this line starts content from: /inc/after-content.default.html -->
<!-- START: this line starts content from: inc/after-content.default.html -->
<!-- END: this line ends content from: /inc/after-content.default.html -->
<!-- END: this line ends content from: inc/after-content.default.html -->
+2 -2
View File
@@ -1,5 +1,5 @@
<!-- START: this line starts content from: /inc/before-content.default.html -->
<!-- START: this line starts content from: inc/before-content.default.html -->
<a name="content"></a>
<!-- END: this line ends content from: /inc/before-content.default.html -->
<!-- END: this line ends content from: inc/before-content.default.html -->
+2 -2
View File
@@ -1,5 +1,5 @@
<!-- START: this line starts content from: /inc/begin-leftcolumn.default.html -->
<!-- START: this line starts content from: inc/begin-leftcolumn.default.html -->
<div class="leftcolumn">
<!-- END: this line ends content from: /inc/begin-leftcolumn.default.html -->
<!-- END: this line ends content from: inc/begin-leftcolumn.default.html -->
+2 -2
View File
@@ -1,5 +1,5 @@
<!-- START: this line starts content from: /inc/begin-rightcolumn.default.html -->
<!-- START: this line starts content from: inc/begin-rightcolumn.default.html -->
<div class="rightcolumn">
<!-- END: this line ends content from: /inc/begin-rightcolumn.default.html -->
<!-- END: this line ends content from: inc/begin-rightcolumn.default.html -->
+2 -2
View File
@@ -1,5 +1,5 @@
<!-- START: this line starts content from: /inc/begin-row.default.html -->
<!-- START: this line starts content from: inc/begin-row.default.html -->
<div class="row">
<!-- END: this line ends content from: /inc/begin-row.default.html -->
<!-- END: this line ends content from: inc/begin-row.default.html -->
+2 -2
View File
@@ -1,5 +1,5 @@
<!-- START: this line starts content from: /inc/body.default.html -->
<!-- START: this line starts content from: inc/body.default.html -->
<body>
<!-- END: this line ends content from: /inc/body.default.html -->
<!-- END: this line ends content from: inc/body.default.html -->
+2 -2
View File
@@ -1,6 +1,6 @@
<!-- START: this line starts content from: /inc/bottom.default.html -->
<!-- START: this line starts content from: inc/bottom.default.html -->
</body>
</html>
<!-- END: this line ends content from: /inc/bottom.default.html -->
<!-- END: this line ends content from: inc/bottom.default.html -->
+2 -2
View File
@@ -1,5 +1,5 @@
<!-- START: this line starts content from: /inc/end-leftcolumn.default.html -->
<!-- START: this line starts content from: inc/end-leftcolumn.default.html -->
</div>
<!-- END: this line ends content from: /inc/end-leftcolumn.default.html -->
<!-- END: this line ends content from: inc/end-leftcolumn.default.html -->
+2 -2
View File
@@ -1,5 +1,5 @@
<!-- START: this line starts content from: /inc/end-rightcolumn.default.html -->
<!-- START: this line starts content from: inc/end-rightcolumn.default.html -->
</div>
<!-- END: this line ends content from: /inc/end-rightcolumn.default.html -->
<!-- END: this line ends content from: inc/end-rightcolumn.default.html -->
+2 -2
View File
@@ -1,5 +1,5 @@
<!-- START: this line starts content from: /inc/end-row.default.html -->
<!-- START: this line starts content from: inc/end-row.default.html -->
</div>
<!-- END: this line ends content from: /inc/end-row.default.html -->
<!-- END: this line ends content from: inc/end-row.default.html -->
+5 -5
View File
@@ -1,10 +1,10 @@
<!-- START: this line starts content from: /inc/footer.default.html -->
<!-- START: this line starts content from: inc/footer.default.html -->
<div class="footer">
<hr>
<h2>Footer</h2>
<p>This is where stuff at the bottom of all pages would be found.</p>
<a href="#top">Jump to top</a>
<h2>Coda</h2>
<p><a href="https://validator.w3.org/nu/?doc=%%VALIDATOR_ENCODED_URL%%">Nu HTML check this web page</a></p>
<p><a href="#top">Jump to top</a> <a href="#content">Jump to Content</a> <a href="#inventory">Jump to Inventory</a></p>
</div>
<!-- END: this line ends content from: /inc/footer.default.html -->
<!-- END: this line ends content from: inc/footer.default.html -->
-756
View File
@@ -1,756 +0,0 @@
#!/usr/bin/env bash
#
# gen-author.sh - output winning author(s) related HTML
#
# This tool is intended to be used as a "before tool" during HTML phase number 20.
#
# This tool is intended to be invoked by a tool such as "readme2index.sh"
# and as such, the leading options will include "-p pandoc_wrapper" and -P "optstr",
# the final arg will be in yyyy/dir form, and will be called from
# the topdir directory under which the yyyy/dir winner directory must be found.
#
# Copyright (c) 2023,2024 by Landon Curt Noll. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and
# its documentation for any purpose and without fee is hereby granted,
# provided that the above copyright, this permission notice and text
# this comment, and the disclaimer below appear in all of the following:
#
# supporting documentation
# source copies
# source works derived from this source
# binaries derived from this source or from derived source
#
# LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
# EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
# USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#
# chongo (Landon Curt Noll, http://www.isthe.com/chongo/index.html) /\oo/\
#
# Share and enjoy! :-)
# firewall - must be bash with a version 4.2 or later
#
# We must declare arrays with -ag or -Ag
#
if [[ -z ${BASH_VERSINFO[0]} || ${BASH_VERSINFO[0]} -lt 4 || ${BASH_VERSINFO[0]} -eq 4 && ${BASH_VERSINFO[1]} -lt 2 ]]; then
echo "$0: ERROR: bash version must be >= 4.2: $BASH_VERSION" 1>&2
exit 4
fi
# setup bash file matching
#
# Requires bash with a version 4.2 or later
#
shopt -s nullglob # enable expanded to nothing rather than remaining unexpanded
shopt -u failglob # disable error message if no matches are found
shopt -u dotglob # disable matching files starting with .
shopt -s globskipdots # enable never matching . nor ..
shopt -u nocaseglob # disable strict case matching
shopt -u extglob # enable extended globbing patterns
shopt -s globstar # enable ** to match all files and zero or more directories and subdirectories
# set variables referenced in the usage message
#
export VERSION="1.2 2024-01-04"
NAME=$(basename "$0")
export NAME
export V_FLAG=0
GIT_TOOL=$(type -P git)
export GIT_TOOL
if [[ -z "$GIT_TOOL" ]]; then
echo "$0: FATAL: git tool is not installed or not in PATH" 1>&2
exit 200
fi
"$GIT_TOOL" rev-parse --is-inside-work-tree >/dev/null 2>&1
status="$?"
if [[ $status -eq 0 ]]; then
TOPDIR=$("$GIT_TOOL" rev-parse --show-toplevel)
fi
export PANDOC_WRAPPER="inc/pandoc_wrapper.sh"
export PANDOC_WRAPPER_OPTSTR="-f markdown -t html --fail-if-warnings=true"
export REPO_URL="https://github.com/ioccc-src/temp-test-ioccc"
# set usage message
#
export USAGE="usage: $0 [-h] [-v level] [-V] [-n] [-N]
[-d topdir] [-p tool] [-P optstr]
[-u repo_url] [-e string ..] [-E exitcode]
yyyy/dir
-h print help message and exit
-v level set verbosity level (def level: 0)
-V print version string and exit
-d topdir set topdir (def: $TOPDIR)
-n go thru the actions, but do not update any files (def: do the action)
-N do not process file, just parse arguments and ignore the file (def: process the file)
-p tool run 'pandoc wrapper tool' (not pandoc path) during HTML phase number 21 (def: use $PANDOC_WRAPPER)
-P pandoc_opts run 'pandoc wrapper tool' with options found in 'optstr' (def: $PANDOC_WRAPPER_OPTSTR)
NOTE: The 'optstr' may not contain a single-quote, nor a double-quote.
-u repo_url URL of the final target repo from where HTML files will be viewed (def: $REPO_URL)
-e string output string, followed by newline, to stderr (def: do not)
-E exitcode force exit with exitcode (def: exit based on success or failure of the action)
yyyy/dir path from topdir to winner directory: must contain the files: README.md, .path and .winner.json
Exit codes:
0 all OK
1 pandoc exited non-zero
2 -h and help string printed or -V and version string printed
3 command line error
4 bash version is < 4.2
5 yyyy/dir is not a winner directory
6 pandoc tool not found or not executable
>= 10 < 200 ((not used))
>= 200 internal error
$NAME version: $VERSION"
# setup
#
export NOOP=
export DO_NOT_PROCESS=
# output_author_handles
#
# Write the author handle(s) for the yyyy/dir winner to standard output (stdout)
#
# XXX - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - XXX
# XXX - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - XXX
# XXX - until we have the jnamval command, we must FAKE PARSE the .winner.json file - XXX
# XXX - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - XXX
# XXX - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - XXX
#
# usage:
# output_author_handles yyyy/dir/.winner.json
#
# returns:
# 0 ==> no errors detected, but output may be empty
# > 0 ==> function error number
#
function output_author_handles
{
local WINNER_JSON_PATH; # the .winner.json path
local author_handle; # a found author handle
# parse args
#
if [[ $# -ne 1 ]]; then
echo "$0: ERROR: in output_author_handles: expected 1 arg, found $#" 1>&2
return 1
fi
WINNER_JSON_PATH="$1"
if [[ ! -e $WINNER_JSON_PATH ]]; then
echo "$0: ERROR: in output_author_handles: .winner.json does not exist: $WINNER_JSON_PATH" 1>&2
return 2
fi
if [[ ! -f $WINNER_JSON_PATH ]]; then
echo "$0: ERROR: in output_author_handles: .winner.json is not a file: $WINNER_JSON_PATH" 1>&2
return 3
fi
if [[ ! -r $WINNER_JSON_PATH ]]; then
echo "$0: ERROR: in output_author_handles: .winner.json is not a readable file: $WINNER_JSON_PATH" 1>&2
return 4
fi
# extract author handles from .winner.json
#
grep -F author_handle "$WINNER_JSON_PATH" |
awk 'NF == 5 { print $4; }' |
tr -d '"' |
while read -r author_handle; do
echo "$author_handle"
done
return 0
}
# output_winner_ids
#
# Write the winner ids from an author/author_handle.json file to standard output (stdout)
#
# XXX - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - XXX
# XXX - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - XXX
# XXX - until we have the jnamval command, we must FAKE PARSE the author/author_handle.json file - XXX
# XXX - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - XXX
# XXX - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - XXX
#
# usage:
# output_winner_ids author/author_handle.json
#
# returns:
# 0 ==> no errors detected, but output may be empty
# > 0 ==> function error number
#
function output_winner_ids
{
local AUTHOR_HANDLE_JSON_PATH; # the .winner.json path
local winner_id; # a found winner id
# parse args
#
if [[ $# -ne 1 ]]; then
echo "$0: ERROR: in output_winner_ids: expected 1 arg, found $#" 1>&2
return 1
fi
AUTHOR_HANDLE_JSON_PATH="$1"
if [[ ! -e $AUTHOR_HANDLE_JSON_PATH ]]; then
echo "$0: ERROR: in output_winner_ids: author_handle.json does not exist: $AUTHOR_HANDLE_JSON_PATH" 1>&2
return 2
fi
if [[ ! -f $AUTHOR_HANDLE_JSON_PATH ]]; then
echo "$0: ERROR: in output_winner_ids: author_handle.json is not a file: $AUTHOR_HANDLE_JSON_PATH" 1>&2
return 3
fi
if [[ ! -r $AUTHOR_HANDLE_JSON_PATH ]]; then
echo "$0: ERROR: in output_winner_ids: author_handle.json is not a readable file: $AUTHOR_HANDLE_JSON_PATH" 1>&2
return 4
fi
# extract winner ids from the author/author_handle.json file
#
grep -F winner_id "$AUTHOR_HANDLE_JSON_PATH" |
awk 'NF == 5 { print $4; }' |
tr -d '"' |
while read -r winner_id; do
echo "$winner_id"
done
return 0
}
# output_full_name
#
# Write the Full Name from an author/author_handle.json file to standard output (stdout)
#
# XXX - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - XXX
# XXX - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - XXX
# XXX - until we have the jnamval command, we must FAKE PARSE the author/author_handle.json file - XXX
# XXX - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - XXX
# XXX - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - XXX
#
# usage:
# output_full_name author/author_handle.json
#
# returns:
# 0 ==> no errors detected, but output may be empty
# > 0 ==> function error number
#
function output_full_name
{
local AUTHOR_HANDLE_JSON_PATH; # the .winner.json path
# parse args
#
if [[ $# -ne 1 ]]; then
echo "$0: ERROR: in output_full_name: expected 1 arg, found $#" 1>&2
return 1
fi
AUTHOR_HANDLE_JSON_PATH="$1"
if [[ ! -e $AUTHOR_HANDLE_JSON_PATH ]]; then
echo "$0: ERROR: in output_full_name: author_handle.json does not exist: $AUTHOR_HANDLE_JSON_PATH" 1>&2
return 2
fi
if [[ ! -f $AUTHOR_HANDLE_JSON_PATH ]]; then
echo "$0: ERROR: in output_full_name: author_handle.json is not a file: $AUTHOR_HANDLE_JSON_PATH" 1>&2
return 3
fi
if [[ ! -r $AUTHOR_HANDLE_JSON_PATH ]]; then
echo "$0: ERROR: in output_full_name: author_handle.json is not a readable file: $AUTHOR_HANDLE_JSON_PATH" 1>&2
return 4
fi
# extract Full Name from the author/author_handle.json file
#
grep -F full_name "$AUTHOR_HANDLE_JSON_PATH" | sed -e 's/.*"full_name" : "//' -e 's/",.*//'
return 0
}
# output_location_code
#
# Write the Location Code from an author/author_handle.json file to standard output (stdout)
#
# XXX - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - XXX
# XXX - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - XXX
# XXX - until we have the jnamval command, we must FAKE PARSE the author/author_handle.json file - XXX
# XXX - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - GROSS HACK - XXX
# XXX - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - XXX
#
# usage:
# output_location_code author/author_handle.json
#
# returns:
# 0 ==> no errors detected, but output may be empty
# > 0 ==> function error number
#
function output_location_code
{
local AUTHOR_HANDLE_JSON_PATH; # the .winner.json path
# parse args
#
if [[ $# -ne 1 ]]; then
echo "$0: ERROR: in output_location_code: expected 1 arg, found $#" 1>&2
return 1
fi
AUTHOR_HANDLE_JSON_PATH="$1"
if [[ ! -e $AUTHOR_HANDLE_JSON_PATH ]]; then
echo "$0: ERROR: in output_location_code: author_handle.json does not exist: $AUTHOR_HANDLE_JSON_PATH" 1>&2
return 2
fi
if [[ ! -f $AUTHOR_HANDLE_JSON_PATH ]]; then
echo "$0: ERROR: in output_location_code: author_handle.json is not a file: $AUTHOR_HANDLE_JSON_PATH" 1>&2
return 3
fi
if [[ ! -r $AUTHOR_HANDLE_JSON_PATH ]]; then
echo "$0: ERROR: in output_location_code: author_handle.json is not a readable file: $AUTHOR_HANDLE_JSON_PATH" 1>&2
return 4
fi
# extract Location Code from the author/author_handle.json file
#
grep -F location_code "$AUTHOR_HANDLE_JSON_PATH" | sed -e 's/.*"location_code" : "*//' -e 's/"*,.*//'
return 0
}
# parse command line
#
while getopts :hv:Vd:nNp:P:u:e:E: flag; do
case "$flag" in
h) echo "$USAGE" 1>&2
exit 2
;;
v) V_FLAG="$OPTARG"
;;
V) echo "$VERSION"
exit 2
;;
d) TOPDIR="$OPTARG"
;;
n) NOOP="-n"
;;
N) DO_NOT_PROCESS="-N"
;;
p) PANDOC_WRAPPER="$OPTARG"
;;
P) # parse -P optstr
case "$OPTARG" in
*"'"*)
echo "$0: ERROR: in -P optstr, the optstr may not contain a single-quote character: $OPTARG" 1>&2
echo 1>&2
print_usage 1>&2
exit 3
;;
*'"'*)
echo "$0: ERROR: in -P optstr, the optstr may not contain a double-quote character: $OPTARG" 1>&2
echo 1>&2
print_usage 1>&2
exit 3
;;
*) ;;
esac
PANDOC_WRAPPER_OPTSTR="$OPTARG"
;;
u) REPO_URL="$OPTARG"
;;
e) echo "$OPTARG" 1>&2
;;
E) exit "$OPTARG"
;;
\?) echo "$0: ERROR: invalid option: -$OPTARG" 1>&2
echo 1>&2
print_usage 1>&2
exit 3
;;
:) echo "$0: ERROR: option -$OPTARG requires an argument" 1>&2
echo 1>&2
echo "$USAGE" 1>&2
exit 3
;;
*) echo "$0: ERROR: unexpected value from getopts: $flag" 1>&2
echo 1>&2
echo "$USAGE" 1>&2
exit 3
;;
esac
done
# parse the command line arguments
#
if [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: debug level: $V_FLAG" 1>&2
fi
#
shift $(( OPTIND - 1 ));
#
if [[ $V_FLAG -ge 5 ]]; then
echo "$0: debug[5]: file argument count: $#" 1>&2
fi
if [[ $# -ne 1 ]]; then
echo "$0: ERROR: expected 1 arg, found: $#" 1>&2
exit 3
fi
#
export WINNER_PATH="$1"
if [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: WINNER_PATH=$WINNER_PATH" 1>&2
fi
# verify that we have a topdir directory
#
REPO_NAME=$(basename "$REPO_URL")
export REPO_NAME
if [[ -z $TOPDIR ]]; then
echo "$0: ERROR: cannot find top of git repo directory" 1>&2
echo "$0: Notice: if needed: $GIT_TOOL clone $REPO_URL; cd $REPO_NAME" 1>&2
exit 201
fi
if [[ ! -d $TOPDIR ]]; then
echo "$0: ERROR: TOPDIR is not a directory: $TOPDIR" 1>&2
echo "$0: Notice: if needed: $GIT_TOOL clone $REPO_URL; cd $REPO_NAME" 1>&2
exit 202
fi
# verify that we have an author subdirectory
#
export AUTHOR_PATH="$TOPDIR/author"
if [[ ! -d $AUTHOR_PATH ]]; then
echo "$0: ERROR: author is not a directory under topdir: $AUTHOR_PATH" 1>&2
exit 203
fi
export AUTHOR_DIR="author"
# cd to topdir
#
if [[ ! -e $TOPDIR ]]; then
echo "$0: ERROR: cannot cd to non-existent path: $TOPDIR" 1>&2
exit 204
fi
if [[ ! -d $TOPDIR ]]; then
echo "$0: ERROR: cannot cd to a non-directory: $TOPDIR" 1>&2
exit 205
fi
export CD_FAILED
if [[ $V_FLAG -ge 5 ]]; then
echo "$0: debug[5]: about to: cd $TOPDIR" 1>&2
fi
cd "$TOPDIR" || CD_FAILED="true"
if [[ -n $CD_FAILED ]]; then
echo "$0: ERROR: cd $TOPDIR failed" 1>&2
exit 206
fi
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: now in directory: $(/bin/pwd)" 1>&2
fi
# verify that WINNER_PATH is a winner directory
#
# WINNER_PATH must be in yyyy/dir form
# yyyy must be a directory
# yyyy must be a writable directory
# yyyy/.year must be a non-empty file
# yyyy/dir must be a directory
# yyyy/dir/.path must be a non-empty file
# WINNER_PATH must match the contents of yyyy/dir/.path
# yyyy/dir/.winner.json must be a non-empty file
#
if [[ ! -d $WINNER_PATH ]]; then
echo "$0: ERROR: arg is not a directory: $WINNER_PATH" 1>&2
exit 5
fi
if [[ ! -w $WINNER_PATH ]]; then
echo "$0: ERROR: arg is not a writable directory: $WINNER_PATH" 1>&2
exit 5
fi
export YEAR_DIR=${WINNER_PATH%%/*}
if [[ -z $YEAR_DIR ]]; then
echo "$0: ERROR: arg not in yyyy/dir form: $WINNER_PATH" 1>&2
exit 5
fi
export WINNER_DIR=${WINNER_PATH#*/}
if [[ -z $WINNER_DIR ]]; then
echo "$0: ERROR: arg: $WINNER_PATH not in $YEAR_DIR/dir form: $WINNER_PATH" 1>&2
exit 5
fi
if [[ $WINNER_DIR = */* ]]; then
echo "$0: ERROR: dir from arg: $WINNER_PATH contains a /: $WINNER_DIR" 1>&2
exit 5
fi
if [[ ! -d $YEAR_DIR ]]; then
echo "$0: ERROR: yyyy from arg: $WINNER_PATH is not a directory: $YEAR_DIR" 1>&2
exit 5
fi
export WINNER_ID="${YEAR_DIR}_${WINNER_DIR}"
export DOT_YEAR="$YEAR_DIR/.year"
if [[ ! -s $DOT_YEAR ]]; then
echo "$0: ERROR: not a non-empty file: $DOT_YEAR" 1>&2
exit 5
fi
if [[ ! -d $YEAR_DIR/$WINNER_DIR ]]; then
echo "$0: ERROR: yyyy/dir from arg: $WINNER_PATH is not a directory: $YEAR_DIR/$WINNER_DIR" 1>&2
exit 5
fi
export DOT_PATH="$YEAR_DIR/$WINNER_DIR/.path"
if [[ ! -s $DOT_PATH ]]; then
echo "$0: ERROR: not a non-empty file: $DOT_PATH" 1>&2
exit 5
fi
DOT_PATH_CONTENT=$(< "$DOT_PATH")
if [[ $WINNER_PATH != "$DOT_PATH_CONTENT" ]]; then
echo "$0: ERROR: arg: $WINNER_PATH does not match $DOT_PATH contents: $DOT_PATH_CONTENT" 1>&2
exit 5
fi
export WINNER_JSON="$YEAR_DIR/$WINNER_DIR/.winner.json"
if [[ ! -e $WINNER_JSON ]]; then
echo "$0: ERROR: .winner.json does not exist: $WINNER_JSON" 1>&2
exit 5
fi
if [[ ! -f $WINNER_JSON ]]; then
echo "$0: ERROR: .winner.json is not a file: $WINNER_JSON" 1>&2
exit 5
fi
if [[ ! -r $WINNER_JSON ]]; then
echo "$0: ERROR: .winner.json is not a readable file: $WINNER_JSON" 1>&2
exit 5
fi
if [[ ! -e $PANDOC_WRAPPER ]]; then
echo "$0: ERROR: pandoc wrapper tool does not exist: $PANDOC_WRAPPER" 1>&2
exit 6
fi
if [[ ! -f $PANDOC_WRAPPER ]]; then
echo "$0: ERROR: pandoc wrapper tool is not a file: $PANDOC_WRAPPER" 1>&2
exit 6
fi
if [[ ! -x $PANDOC_WRAPPER ]]; then
echo "$0: ERROR: pandoc wrapper tool is not an executable file: $PANDOC_WRAPPER" 1>&2
exit 6
fi
# parameter debugging
#
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: NAME=$NAME" 1>&2
echo "$0: debug[3]: YEAR_DIR=$YEAR_DIR" 1>&2
echo "$0: debug[3]: WINNER_DIR=$WINNER_DIR" 1>&2
echo "$0: debug[3]: WINNER_ID=$WINNER_ID" 1>&2
echo "$0: debug[3]: DOT_YEAR=$DOT_YEAR" 1>&2
echo "$0: debug[3]: DOT_PATH=$DOT_PATH" 1>&2
echo "$0: debug[3]: WINNER_JSON=$WINNER_JSON" 1>&2
echo "$0: debug[3]: REPO_URL=$REPO_URL" 1>&2
echo "$0: debug[3]: REPO_NAME=$REPO_NAME" 1>&2
echo "$0: debug[3]: AUTHOR_PATH=$AUTHOR_PATH" 1>&2
echo "$0: debug[3]: AUTHOR_DIR=$AUTHOR_DIR" 1>&2
echo "$0: debug[3]: PANDOC_WRAPPER=$PANDOC_WRAPPER" 1>&2
echo "$0: debug[3]: PANDOC_WRAPPER_OPTSTR=$PANDOC_WRAPPER_OPTSTR" 1>&2
echo "$0: debug[3]: DO_NOT_PROCESS=$DO_NOT_PROCESS" 1>&2
echo "$0: debug[3]: NOOP=$NOOP" 1>&2
fi
# Set AUTHOR_HANDLE_SET with author handles from .winner.json
#
export AUTHOR_HANDLE_SET
AUTHOR_HANDLE_SET=$(output_author_handles "$WINNER_JSON")
status="$?"
if [[ $status -ne 0 || -z $AUTHOR_HANDLE_SET ]]; then
echo "$0: ERROR: unable to obtain any author handles from: $WINNER_JSON" 1>&2
exit 207
fi
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: author handles found in $WINNER_JSON start below" 1>&2
echo "$AUTHOR_HANDLE_SET" 1>&2
echo "$0: debug[3]: author handles found in $WINNER_JSON end above" 1>&2
fi
# verify each author handle has a readable /author/author_handle.json file
#
for author_handle in $AUTHOR_HANDLE_SET; do
# determine the author handle JSON path
#
AUTHOR_HANDLE_JSON="$AUTHOR_DIR/$author_handle.json"
# verify that /author/author_handle.json exists as a readable file
#
if [[ ! -e $AUTHOR_HANDLE_JSON ]]; then
echo "$0: ERROR: for author handle: $author_handle author JSON file not found: $AUTHOR_HANDLE_JSON" 1>&2
exit 208
fi
if [[ ! -f $WINNER_JSON ]]; then
echo "$0: ERROR: for author handle: $author_handle author JSON is not a file: $AUTHOR_HANDLE_JSON" 1>&2
exit 209
fi
if [[ ! -r $WINNER_JSON ]]; then
echo "$0: ERROR: for author handle: $author_handle author JSON is not a readable file: $AUTHOR_HANDLE_JSON" 1>&2
exit 210
fi
if [[ $V_FLAG -ge 5 ]]; then
echo "$0: debug[5]: for author handle: $author_handle found a readable author JSON file: $AUTHOR_HANDLE_JSON" 1>&2
fi
# verify that the /author/author_handle.json file lists the WINNER_ID as one of their wins
#
WINNER_ID_FOUND=$(output_winner_ids "$AUTHOR_HANDLE_JSON" | grep -F -- "$WINNER_ID")
status="$?"
if [[ $status -ne 0 || -z $WINNER_ID_FOUND ]]; then
echo "$0: ERROR: winner id: $WINNER_ID not found in author JSON file: $AUTHOR_HANDLE_JSON, status: $status" 1>&2
exit 211
fi
if [[ $V_FLAG -ge 7 ]]; then
echo "$0: debug[7]: readable author JSON file: $AUTHOR_HANDLE_JSON mentions winner id: $WINNER_ID" 1>&2
fi
# verify that we have a Full Name in the /author/author_handle.json file
#
FULL_NAME=$(output_full_name "$AUTHOR_HANDLE_JSON")
status="$?"
if [[ $status -ne 0 || -z $FULL_NAME ]]; then
echo "$0: ERROR: author JSON file: $AUTHOR_HANDLE_JSON as no FULL NAME, status: $status" 1>&2
exit 212
fi
if [[ $V_FLAG -ge 7 ]]; then
echo "$0: debug[7]: author JSON file: $AUTHOR_HANDLE_JSON Full Name: $FULL_NAME" 1>&2
fi
# verify that we have a Location Code in the /author/author_handle.json file
#
LOCATION_CODE=$(output_location_code "$AUTHOR_HANDLE_JSON")
status="$?"
if [[ $status -ne 0 || -z $LOCATION_CODE ]]; then
echo "$0: ERROR: author JSON file: $AUTHOR_HANDLE_JSON as no Location Code, status: $status" 1>&2
exit 213
fi
if [[ $V_FLAG -ge 7 ]]; then
echo "$0: debug[7]: author JSON file: $AUTHOR_HANDLE_JSON Location Code: $LOCATION_CODE" 1>&2
fi
done
# If -N, time to exit
#
if [[ -n $DO_NOT_PROCESS ]]; then
if [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: arguments parsed, -N given, exit 0" 1>&2
fi
exit 0
fi
# create a temporary markdown for pandoc to process
#
TMP_FILE=".$NAME.$$.md"
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: temporary markdown file: $TMP_FILE" 1>&2
fi
if [[ -z $NOOP ]]; then
trap 'rm -f $TMP_FILE; exit' 0 1 2 3 15
rm -f "$TMP_FILE"
if [[ -e $TMP_FILE ]]; then
echo "$0: ERROR: cannot remove temporary markdown file: $TMP_FILE" 1>&2
exit 214
fi
:> "$TMP_FILE"
if [[ ! -e $TMP_FILE ]]; then
echo "$0: ERROR: cannot create temporary markdown file: $TMP_FILE" 1>&2
exit 215
fi
elif [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: because of -n, temporary markdown file is not used: $TMP_FILE" 1>&2
fi
# write author header to temporary markdown file
#
{
AUTHOR_COUNT=$(echo "$AUTHOR_HANDLE_SET" | wc -l)
if [[ $AUTHOR_COUNT -gt 1 ]]; then
echo '<a name="author">**Authors:**</a>'
else
echo '<a name="author">**Author:**</a>'
fi
echo
} | if [[ -z $NOOP ]]; then
cat >> "$TMP_FILE"
elif [[ $V_FLAG -ge 3 ]]; then
sed -e "s;^;$0: debug[3]: -n disabled write: ;" 1>&2
else
cat >> /dev/null
fi
# write each author's information to temporary markdown file
#
for author_handle in $AUTHOR_HANDLE_SET; do
# determine the author handle JSON path
#
AUTHOR_HANDLE_JSON="$AUTHOR_DIR/$author_handle.json"
# obtain the Full Name from the author handle JSON file
#
FULL_NAME=$(output_full_name "$AUTHOR_HANDLE_JSON")
status="$?"
if [[ $status -ne 0 || -z $FULL_NAME ]]; then
echo "$0: ERROR: author JSON file: $AUTHOR_HANDLE_JSON as no FULL NAME, status: $status" 1>&2
exit 216
fi
# obtain the Location Code from the author handle JSON file
#
LOCATION_CODE=$(output_location_code "$AUTHOR_HANDLE_JSON")
status="$?"
if [[ $status -ne 0 || -z $LOCATION_CODE ]]; then
echo "$0: ERROR: author JSON file: $AUTHOR_HANDLE_JSON as no Location Code, status: $status" 1>&2
exit 217
fi
# write this author's information
#
{
echo "Name: [$FULL_NAME](/winners.html#$author_handle)<br>"
if [[ $LOCATION_CODE == null ]]; then
echo "Location: [unknown](/location.html#$LOCATION_CODE)"
else
echo "Location: [$LOCATION_CODE](/location.html#$LOCATION_CODE)"
fi
echo
} | if [[ -z $NOOP ]]; then
cat >> "$TMP_FILE"
elif [[ $V_FLAG -ge 3 ]]; then
sed -e "s;^;$0: debug[3]: -n disabled write: ;" 1>&2
else
cat >> /dev/null
fi
done
# convert temporary markdown file into HTML
#
if [[ -z $NOOP ]]; then
echo "<!-- START: this line starts content generated by: inc/$NAME -->"
echo
if [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: about to execute: $PANDOC_WRAPPER -P \"$PANDOC_WRAPPER_OPTSTR\" $TMP_FILE -" 1>&2
fi
"$PANDOC_WRAPPER" -P "$PANDOC_WRAPPER_OPTSTR" "$TMP_FILE" -
status="$?"
if [[ $status -ne 0 ]]; then
echo "$0: ERROR: pandoc failed, error: $status" 1>&2
exit 218
fi
echo
echo "<!-- END: next line ends content generated by: inc/$NAME -->"
elif [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: -n disabled execution of: $PANDOC_WRAPPER -P \"$PANDOC_WRAPPER_OPTSTR\" $TMP_FILE -" 1>&2
fi
# All Done!!! -- Jessica Noll, Age 2
#
if [[ -z $NOOP ]]; then
rm -f "$TMP_FILE"
elif [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: -n disabled execution of: rm -f $TMP_FILE" 1>&2
fi
exit 0
+2 -2
View File
@@ -1,4 +1,4 @@
<!-- START: this line starts content from: /inc/head.default.html -->
<!-- START: this line starts content from: inc/head.default.html -->
<head>
<link rel="stylesheet" href="%%DOCROOT_URL_SLASH%%ioccc.css">
@@ -9,4 +9,4 @@
<meta name="keywords" content="%%KEYWORDS%%">
</head>
<!-- END: this line ends content from: /inc/head.default.html -->
<!-- END: this line ends content from: inc/head.default.html -->
+2 -2
View File
@@ -1,4 +1,4 @@
<!-- START: this line starts content from: /inc/header.default.html -->
<!-- START: this line starts content from: inc/header.default.html -->
<div class="header">
<img src="%%DOCROOT_URL_SLASH%%png/ioccc.png" alt="IOCCC image by Matt Zucker" width=300 height=110>
@@ -6,4 +6,4 @@
<h2>%%HEADER_2%%</h2>
</div>
<!-- END: this line ends content from: /inc/header.default.html -->
<!-- END: this line ends content from: inc/header.default.html -->
+55 -97
View File
@@ -33,8 +33,7 @@
# Here the 'command' first processes any command line options, then
# it processes 'cfg_options' obtained from this file from a 1st match of a given file_glob, then
# it processes 'output tool' (i.e., -o tool) options found in 'command_options', and 'cfg_options', then
# an optional -- (end of all options), then
# zero of more 'filename_arg' filename arguments.
# an optional -- (end of all options), then zero of more 'filename_arg' filename arguments.
##################
# import options #
@@ -98,8 +97,10 @@
# NOTE: A later '-O tool=optstr' will override all earlier '-O tool=optstr' for the same 'tool'.
# NOTE: -O may only be used in command_options and md2html.cfg cfg_options (getopt phases 0 and 2)
#
# -u repo_url URL of the final target repo from where HTML files will be viewed (def: $REPO_URL)
# NOTE: The '-u repo_url' will be passed as leading options on the -b tool and -a tool command lines.
# -u repo_url Base level URL of target git repo (def: $REPO_URL)
# NOTE: The '-u repo_url' is passed as leading options on -o tool, -b tool, and -a tool command lines.
# -U top_url Top level URL of web site where HTML files will be viewed (def: $TOP_URL)
# NOTE: The '-U top_url' is passed as leading options on -o tool, -b tool, and -a tool command lines.
#
# -e string output 'string', followed by newline, to stderr (def: do not)
# -E exitcode force exit with exitcode (def: exit based on success or failure of the action)
@@ -173,44 +174,6 @@
# While above list is not a complete list of options, it does list options that are required of
# tools that use this configuration file.
###############
# HTML phases #
###############
# The following HTML phase files are used to build HTML content:
#
# 0. inc/top.default.html
# 1. inc/head.default.html
# 2. inc/body.default.html
# 3. inc/header.default.html
# 4. inc/topnav.default.html
# 5. inc/begin-row.default.html
# 6. inc/begin-leftcolumn.default.html
# 7. inc/sidenav.default.html
# 8. inc/end-leftcolumn.default.html
# 9. inc/begin-rightcolumn.default.html
# 10. inc/before-content.default.html
#
# Phases 11-19 are reserved for future use.
#
# 20. ((insert 'before tool' output))
# 21. ((insert 'pandoc wrapper tool' output))
# 22. ((insert 'after tool' output))
#
# Phases 23-29 are reserved for future use.
#
# 30. inc/after-content.default.html
# 31. inc/end-rightcolumn.default.html
# 32. inc/end-row.default.html
# 33. inc/footer.default.html
# 34. inc/bottom.default.html
#
# Phases 35-39 are reserved for future use.
#
# In the above HTML phase numbers, except during HTML phase numbers 20-29, symbols of the form %%TOKEN%% are substituted.
# Any %%TOKEN%% printed by the 'before tool' (-b tool), the 'pandoc wrapper tool' (-p tool), and the 'after tool' (-a tool)
# are ignored (i.e., not substituted).
#################
# Configuration #
#################
@@ -219,72 +182,67 @@
#
# sort using: sort -d -u
CODE_OF_CONDUCT.md -H topnav=. -o inc/subst.default.sh
README.md -H topnav=. -o inc/subst.default.sh
bugs.md -H topnav=. -o inc/subst.default.sh
contact.md -H topnav=. -o inc/subst.default.sh
faq.md -H topnav=. -o inc/subst.default.sh
index.md -H topnav=. -o inc/subst.default.sh
judges.md -H topnav=. -o inc/subst.default.sh
news.md -H topnav=. -o inc/subst.default.sh
thanks-for-help.md -H topnav=. -o inc/subst.default.sh
winners.md -H topnav=. -o inc/subst.default.sh
www-history.md -H topnav=. -o inc/subst.default.sh
years.md -H topnav=. -o inc/subst.default.sh
CODE_OF_CONDUCT.md -H topnav=. -o bin/subst.default.sh
README.md -H topnav=. -o bin/subst.default.sh
bugs.md -H topnav=. -o bin/subst.default.sh
contact.md -H topnav=. -o bin/subst.default.sh
faq.md -H topnav=. -o bin/subst.default.sh
index.md -H topnav=. -o bin/subst.default.sh
judges.md -H topnav=. -o bin/subst.default.sh
news.md -H topnav=. -o bin/subst.default.sh
thanks-for-help.md -H topnav=. -o bin/subst.default.sh
winners.md -H topnav=. -o bin/subst.default.sh
www-history.md -H topnav=. -o bin/subst.default.sh
years.md -H topnav=. -o bin/subst.default.sh
# Year level README.md files have a special year navbar
[12][0-9][0-9][0-9]/README.md -H topnav=year -o inc/subst.default.sh -o inc/subst.year.sh
mock/README.md -H topnav=mock_year -o inc/subst.default.sh
[12][0-9][0-9][0-9]/README.md -H topnav=year -o bin/subst.default.sh -o bin/subst.year.sh
mock/README.md -H topnav=mock_year -o bin/subst.default.sh
# Navigation bar only moved up to the index for internal markdown files
#
# sort using: sort -d -u
1986/marshall/compilers.md -H topnav=up2index -o inc/subst.default.sh
1991/brnstnd/sorta.README.md -H topnav=up2index -o inc/subst.default.sh
1992/buzzard.2/buzzard.2.README.md -H topnav=up2index -o inc/subst.default.sh
1993/ejb/hanoi.md -H topnav=up2index -o inc/subst.default.sh
1993/ejb/patience.md -H topnav=up2index -o inc/subst.default.sh
1993/rince/design.md -H topnav=up2index -o inc/subst.default.sh
1994/shapiro/shapiro.md -H topnav=up2index -o inc/subst.default.sh
1995/leo/spoiler1.md -H topnav=up2index -o inc/subst.default.sh
1998/dorssel/dorssel.md -H topnav=up2index -o inc/subst.default.sh
1998/schweikh1/macos.md -H topnav=up2index -o inc/subst.default.sh
2004/gavin/gavin.md -H topnav=up2index -o inc/subst.default.sh
2012/deckmyn/deckmyn.md -H topnav=up2index -o inc/subst.default.sh
2012/hou/hint.md -H topnav=up2index -o inc/subst.default.sh
2012/tromp/how.md -H topnav=up2index -o inc/subst.default.sh
2013/hou/doc/example.md -H topnav=up2index -o inc/subst.default.sh
2014/endoh1/spoilers.md -H topnav=up2index -o inc/subst.default.sh
2015/burton/road.to.obscurity.md -H topnav=up2index -o inc/subst.default.sh
2015/burton/spoilers.md -H topnav=up2index -o inc/subst.default.sh
2018/burton2/discrepancies.md -H topnav=up2index -o inc/subst.default.sh
2018/ferguson/rpm.md -H topnav=up2index -o inc/subst.default.sh
2020/endoh2/spoiler/spoiler.md -H topnav=up2index -o inc/subst.default.sh
2020/ferguson1/COMPILING.md -H topnav=up2index -o inc/subst.default.sh
2020/ferguson1/HACKING.md -H topnav=up2index -o inc/subst.default.sh
2020/ferguson1/bugs.md -H topnav=up2index -o inc/subst.default.sh
2020/ferguson1/cannibalism.log.md -H topnav=up2index -o inc/subst.default.sh
2020/ferguson1/chocolate-cake.md -H topnav=up2index -o inc/subst.default.sh
2020/ferguson1/crazy.log.md -H topnav=up2index -o inc/subst.default.sh
2020/ferguson1/gameplay.md -H topnav=up2index -o inc/subst.default.sh
2020/ferguson1/spoilers.md -H topnav=up2index -o inc/subst.default.sh
2020/ferguson1/terminals.md -H topnav=up2index -o inc/subst.default.sh
2020/ferguson1/troubleshooting.md -H topnav=up2index -o inc/subst.default.sh
2020/ferguson2/chocolate-cake.md -H topnav=up2index -o inc/subst.default.sh
2020/ferguson2/obfuscation.md -H topnav=up2index -o inc/subst.default.sh
2020/ferguson2/recode.md -H topnav=up2index -o inc/subst.default.sh
# All winner inventory.md files use a navbar that just moves to the index.html file
[12][0-9][0-9][0-9]/*/inventory.md -H topnav=up2index -o inc/subst.default.sh
mock/*/inventory.md -H topnav=up2index -o inc/subst.default.sh
1986/marshall/compilers.md -H topnav=up2index -o bin/subst.default.sh
1991/brnstnd/sorta.README.md -H topnav=up2index -o bin/subst.default.sh
1992/buzzard.2/buzzard.2.README.md -H topnav=up2index -o bin/subst.default.sh
1993/ejb/hanoi.md -H topnav=up2index -o bin/subst.default.sh
1993/ejb/patience.md -H topnav=up2index -o bin/subst.default.sh
1993/rince/design.md -H topnav=up2index -o bin/subst.default.sh
1994/shapiro/shapiro.md -H topnav=up2index -o bin/subst.default.sh
1995/leo/spoiler1.md -H topnav=up2index -o bin/subst.default.sh
1998/dorssel/dorssel.md -H topnav=up2index -o bin/subst.default.sh
1998/schweikh1/macos.md -H topnav=up2index -o bin/subst.default.sh
2004/gavin/gavin.md -H topnav=up2index -o bin/subst.default.sh
2012/deckmyn/deckmyn.md -H topnav=up2index -o bin/subst.default.sh
2012/hou/hint.md -H topnav=up2index -o bin/subst.default.sh
2012/tromp/how.md -H topnav=up2index -o bin/subst.default.sh
2013/hou/doc/example.md -H topnav=up2index -o bin/subst.default.sh
2014/endoh1/spoilers.md -H topnav=up2index -o bin/subst.default.sh
2015/burton/road.to.obscurity.md -H topnav=up2index -o bin/subst.default.sh
2015/burton/spoilers.md -H topnav=up2index -o bin/subst.default.sh
2018/burton2/discrepancies.md -H topnav=up2index -o bin/subst.default.sh
2018/ferguson/rpm.md -H topnav=up2index -o bin/subst.default.sh
2020/endoh2/spoiler/spoiler.md -H topnav=up2index -o bin/subst.default.sh
2020/ferguson1/COMPILING.md -H topnav=up2index -o bin/subst.default.sh
2020/ferguson1/HACKING.md -H topnav=up2index -o bin/subst.default.sh
2020/ferguson1/bugs.md -H topnav=up2index -o bin/subst.default.sh
2020/ferguson1/cannibalism.log.md -H topnav=up2index -o bin/subst.default.sh
2020/ferguson1/chocolate-cake.md -H topnav=up2index -o bin/subst.default.sh
2020/ferguson1/crazy.log.md -H topnav=up2index -o bin/subst.default.sh
2020/ferguson1/gameplay.md -H topnav=up2index -o bin/subst.default.sh
2020/ferguson1/spoilers.md -H topnav=up2index -o bin/subst.default.sh
2020/ferguson1/terminals.md -H topnav=up2index -o bin/subst.default.sh
2020/ferguson1/troubleshooting.md -H topnav=up2index -o bin/subst.default.sh
2020/ferguson2/chocolate-cake.md -H topnav=up2index -o bin/subst.default.sh
2020/ferguson2/obfuscation.md -H topnav=up2index -o bin/subst.default.sh
2020/ferguson2/recode.md -H topnav=up2index -o bin/subst.default.sh
# Unless matched above, default process all winner README.md files
[12][0-9][0-9][0-9]/*/README.md -o inc/subst.default.sh -o inc/subst.winner-index.sh -b inc/gen-author.sh
mock/*/README.md -o inc/subst.default.sh -o inc/subst.winner-index.sh -b inc/gen-author.sh
[12][0-9][0-9][0-9]/*/README.md -o bin/subst.default.sh -o bin/subst.winner-index.sh -b bin/gen-author.sh -a bin/gen-inventory.sh
mock/*/README.md -o bin/subst.default.sh -o bin/subst.winner-index.sh -b bin/gen-author.sh -a bin/gen-inventory.sh
# Exit 9 for any markdown file that we have not previously configured
-297
View File
@@ -1,297 +0,0 @@
#!/usr/bin/env bash
#
# pandoc_wrapper.sh - wrapper tool to run pandoc
#
# This tool is intended to be used as a 'pandoc wrapper tool' during HTML phase number 21.
#
# This tool is intended to be invoked by a tool such as 'readme2index.sh"
# and as such, the leading options will include "-p pandoc_wrapper" and -P "optstr",
# the final arg will be in yyyy/dir form, and will be called from
# the topdir directory under which the yyyy/dir winner directory must be found.
#
# Copyright (c) 2023 by Landon Curt Noll. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and
# its documentation for any purpose and without fee is hereby granted,
# provided that the above copyright, this permission notice and text
# this comment, and the disclaimer below appear in all of the following:
#
# supporting documentation
# source copies
# source works derived from this source
# binaries derived from this source or from derived source
#
# LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
# EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
# USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#
# chongo (Landon Curt Noll, http://www.isthe.com/chongo/index.html) /\oo/\
#
# Share and enjoy! :-)
# firewall - must be bash with a version 4.2 or later
#
# We must declare arrays with -ag or -Ag
#
if [[ -z ${BASH_VERSINFO[0]} || ${BASH_VERSINFO[0]} -lt 4 || ${BASH_VERSINFO[0]} -eq 4 && ${BASH_VERSINFO[1]} -lt 2 ]]; then
echo "$0: ERROR: bash version must be >= 4.2: $BASH_VERSION" 1>&2
exit 4
fi
# setup bash file matching
#
# Requires bash with a version 4.2 or later
#
shopt -s nullglob # enable expanded to nothing rather than remaining unexpanded
shopt -u failglob # disable error message if no matches are found
shopt -u dotglob # disable matching files starting with .
shopt -s globskipdots # enable never matching . nor ..
shopt -u nocaseglob # disable strict case matching
shopt -u extglob # enable extended globbing patterns
shopt -s globstar # enable ** to match all files and zero or more directories and subdirectories
# set variables referenced in the usage message
#
export VERSION="1.2 2023-12-31"
NAME=$(basename "$0")
export NAME
export V_FLAG=0
export PANDOC_TOOL
GIT_TOOL=$(type -P git)
export GIT_TOOL
if [[ -z "$GIT_TOOL" ]]; then
echo "$0: FATAL: git tool is not installed or not in PATH" 1>&2
exit 200
fi
"$GIT_TOOL" rev-parse --is-inside-work-tree >/dev/null 2>&1
status="$?"
if [[ $status -eq 0 ]]; then
TOPDIR=$("$GIT_TOOL" rev-parse --show-toplevel)
fi
PANDOC_TOOL=$(type -P pandoc)
if [[ -z $PANDOC_TOOL ]]; then
PANDOC_TOOL="/opt/homebrew/bin/pandoc"
fi
export PANDOC_ARGS="-f markdown -t html --fail-if-warnings=true"
export PANDOC_WRAPPER="inc/pandoc_wapper.sh"
export PANDOC_WRAPPER_OPTSTR="-f markdown -t html --fail-if-warnings=true"
export REPO_URL="https://github.com/ioccc-src/temp-test-ioccc"
# set usage message
#
export USAGE="usage: $0 [-h] [-v level] [-V] [-n] [-N]
[-d topdir] [-p pandoc_tool] [-P pandoc_opts] [-e string ..] [-E exitcode]
file.md output.html
-h print help message and exit
-v level set verbosity level (def level: 0)
-V print version string and exit
-d topdir set topdir (def: $TOPDIR)
-n go thru the actions, but do not update any files (def: do the action)
-N do not process file, just parse arguments and ignore the file (def: process the file)
-p pandoc_tool path to the pandoc tool (not the wrapper) (def: $PANDOC_TOOL)
-P pandoc_opts options given to the pandoc tool (def: $PANDOC_ARGS)
-e string output string, followed by newline, to stderr (def: do not)
-E exitcode force exit with exitcode (def: exit based on success or failure of the action)
file.md markdown file to convert into HTML
output.html HTML generated by pandoc from file.md
NOTE: Use - to write to standard output (stdout)
NOTE: Without -n, will prepend '-o output.html' as first pandoc options
With -n, will append '-o /dev/null' as last pandoc options before file.md
Exit codes:
0 all OK
1 pandoc exited non-zero
2 -h and help string printed or -V and version string printed
3 command line error
4 bash version is < 4.2
5 file.md file not found or not readable file
6 pandoc tool not found or not executable
>= 10 < 200 ((not used))
>= 200 internal error
$NAME version: $VERSION"
# setup
#
export NOOP=
export DO_NOT_PROCESS=
# parse command line
#
while getopts :hv:Vd:nNp:P:e:E: flag; do
case "$flag" in
h) echo "$USAGE" 1>&2
exit 2
;;
v) V_FLAG="$OPTARG"
;;
V) echo "$VERSION"
exit 2
;;
d) TOPDIR="$OPTARG"
;;
n) NOOP="-n"
;;
N) DO_NOT_PROCESS="-N"
;;
p) PANDOC_TOOL="$OPTARG"
;;
P) PANDOC_ARGS="$OPTARG"
;;
e) echo "$OPTARG" 1>&2
;;
E) exit "$OPTARG"
;;
\?) echo "$0: ERROR: invalid option: -$OPTARG" 1>&2
echo 1>&2
print_usage 1>&2
exit 3
;;
:) echo "$0: ERROR: option -$OPTARG requires an argument" 1>&2
echo 1>&2
echo "$USAGE" 1>&2
exit 3
;;
*) echo "$0: ERROR: unexpected value from getopts: $flag" 1>&2
echo 1>&2
echo "$USAGE" 1>&2
exit 3
;;
esac
done
# parse the command line arguments
#
if [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: debug level: $V_FLAG" 1>&2
fi
#
shift $(( OPTIND - 1 ));
#
if [[ $V_FLAG -ge 5 ]]; then
echo "$0: debug[5]: argument count: $#" 1>&2
fi
if [[ $# -ne 2 ]]; then
echo "$0: ERROR: expected 2 args, found: $#" 1>&2
exit 3
fi
#
export MARKDOWN_INPUT="$1"
export HTML_OUTPUT="$2"
if [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: MARKDOWN_INPUT=$MARKDOWN_INPUT" 1>&2
echo "$0: debug[1]: HTML_OUTPUT=$HTML_OUTPUT" 1>&2
fi
# firewall - validate args
#
if [[ ! -e $MARKDOWN_INPUT ]]; then
echo "$0: ERROR: markdown input file does not exist: $MARKDOWN_INPUT" 1>&2
exit 5
fi
if [[ ! -f $MARKDOWN_INPUT ]]; then
echo "$0: ERROR: markdown input is not a file: $MARKDOWN_INPUT" 1>&2
exit 5
fi
if [[ ! -r $MARKDOWN_INPUT ]]; then
echo "$0: ERROR: markdown input is not a readable file: $MARKDOWN_INPUT" 1>&2
exit 5
fi
if [[ ! -x $PANDOC_TOOL ]]; then
echo "$0: ERROR: cannot find an executable pandoc tool: $PANDOC_TOOL" 1>&2
exit 6
fi
# verify that we have a topdir directory
#
REPO_NAME=$(basename "$REPO_URL")
export REPO_NAME
if [[ -z $TOPDIR ]]; then
echo "$0: ERROR: cannot find top of git repo directory" 1>&2
echo "$0: Notice: if needed: $GIT_TOOL clone $REPO_URL; cd $REPO_NAME" 1>&2
exit 201
fi
if [[ ! -d $TOPDIR ]]; then
echo "$0: ERROR: TOPDIR is not a directory: $TOPDIR" 1>&2
echo "$0: Notice: if needed: $GIT_TOOL clone $REPO_URL; cd $REPO_NAME" 1>&2
exit 202
fi
# cd to topdir
#
if [[ ! -e $TOPDIR ]]; then
echo "$0: ERROR: cannot cd to non-existent path: $TOPDIR" 1>&2
exit 204
fi
if [[ ! -d $TOPDIR ]]; then
echo "$0: ERROR: cannot cd to a non-directory: $TOPDIR" 1>&2
exit 205
fi
export CD_FAILED
if [[ $V_FLAG -ge 5 ]]; then
echo "$0: debug[5]: about to: cd $TOPDIR" 1>&2
fi
cd "$TOPDIR" || CD_FAILED="true"
if [[ -n $CD_FAILED ]]; then
echo "$0: ERROR: cd $TOPDIR failed" 1>&2
exit 206
fi
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: now in directory: $(/bin/pwd)" 1>&2
fi
# parameter debugging
#
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: REPO_URL=$REPO_URL" 1>&2
echo "$0: debug[3]: REPO_NAME=$REPO_NAME" 1>&2
echo "$0: debug[3]: DO_NOT_PROCESS=$DO_NOT_PROCESS" 1>&2
echo "$0: debug[3]: NOOP=$NOOP" 1>&2
fi
# If -N, time to exit
#
if [[ -n $DO_NOT_PROCESS ]]; then
if [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: arguments parsed, -N given, exit 0" 1>&2
fi
exit 0
fi
# execute pandoc
#
if [[ -z $NOOP ]]; then
if [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: will execute pandoc as: $PANDOC_TOOL -o $HTML_OUTPUT $PANDOC_ARGS $MARKDOWN_INPUT" 1>&2
fi
# SC2086 (info): Double quote to prevent globbing and word splitting.
# shellcheck disable=SC2086
"$PANDOC_TOOL" -o "$HTML_OUTPUT" $PANDOC_ARGS "$MARKDOWN_INPUT"
status="$?"
else
if [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[3]: will execute pandoc as: $PANDOC_TOOL $PANDOC_ARGS -o /dev/null $MARKDOWN_INPUT" 1>&2
fi
# SC2086 (info): Double quote to prevent globbing and word splitting.
# shellcheck disable=SC2086
"$PANDOC_TOOL" $PANDOC_ARGS -o /dev/null "$MARKDOWN_INPUT"
status="$?"
fi
if [[ $status -ne 0 ]]; then
echo "$0: ERROR: pandoc: $PANDOC_TOOL exited non-zero: $status" 1>&2
exit 1
fi
# All Done!!! -- Jessica Noll, Age 2
#
exit 0
+4 -2
View File
@@ -1,4 +1,4 @@
<!-- START: this line starts content from: /inc/sidenav.default.html -->
<!-- START: this line starts content from: inc/sidenav.default.html -->
<div class="sidenav">
<a href="#content">Jump to contents</a>
@@ -23,12 +23,14 @@
<a href="%%DOCROOT_URL_SLASH%%faq.html#fix_author">Fixing winner info</a>
<a href="%%DOCROOT_URL_SLASH%%thanks-for-help.html">Thanks for the help</a>
</div>
<hr>
<div class="sidenav">
<a href="%%DOCROOT_URL_SLASH%%judges.html">The IOCCC Judges</a>
<a href="%%DOCROOT_URL_SLASH%%contact.html">Contacting the IOCCC</a>
</div>
<hr>
<div class="sidenav">
<a href="#top">Jump to top</a>
</div>
<!-- END: this line ends content from: /inc/sidenav.default.html -->
<!-- END: this line ends content from: inc/sidenav.default.html -->
-310
View File
@@ -1,310 +0,0 @@
#!/usr/bin/env bash
#
# subst.default.sh - print default substitutions
#
# This tool is used in conjunction with the inc/md2html.cfg configuration
# file, and the tools that use that use that configuration file
# such as "readme2index.sh".
#
# Copyright (c) 2024 by Landon Curt Noll. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and
# its documentation for any purpose and without fee is hereby granted,
# provided that the above copyright, this permission notice and text
# this comment, and the disclaimer below appear in all of the following:
#
# supporting documentation
# source copies
# source works derived from this source
# binaries derived from this source or from derived source
#
# LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
# EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
# USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#
# chongo (Landon Curt Noll, http://www.isthe.com/chongo/index.html) /\oo/\
#
# Share and enjoy! :-)
# firewall - must be bash with a version 4.2 or later
#
# We must declare arrays with -ag or -Ag
#
if [[ -z ${BASH_VERSINFO[0]} || ${BASH_VERSINFO[0]} -lt 4 || ${BASH_VERSINFO[0]} -eq 4 && ${BASH_VERSINFO[1]} -lt 2 ]]; then
echo "$0: ERROR: bash version must be >= 4.2: $BASH_VERSION" 1>&2
exit 4
fi
# setup bash file matching
#
# Requires bash with a version 4.2 or later
#
shopt -s nullglob # enable expanded to nothing rather than remaining unexpanded
shopt -u failglob # disable error message if no matches are found
shopt -u dotglob # disable matching files starting with .
shopt -s globskipdots # enable never matching . nor ..
shopt -u nocaseglob # disable strict case matching
shopt -u extglob # enable extended globbing patterns
shopt -s globstar # enable ** to match all files and zero or more directories and subdirectories
# set variables referenced in the usage message
#
export VERSION="1.0 2024-01-02"
NAME=$(basename "$0")
export NAME
export V_FLAG=0
GIT_TOOL=$(type -P git)
export GIT_TOOL
if [[ -z "$GIT_TOOL" ]]; then
echo "$0: FATAL: git tool is not installed or not in PATH" 1>&2
exit 200
fi
"$GIT_TOOL" rev-parse --is-inside-work-tree >/dev/null 2>&1
status="$?"
if [[ $status -eq 0 ]]; then
TOPDIR=$("$GIT_TOOL" rev-parse --show-toplevel)
fi
# set usage message
#
export USAGE="usage: $0 [-h] [-v level] [-V] [-n] [-N]
[-d topdir] [-p tool] [-P optstr]
[-e string ..] [-E exitcode]
yyyy/dir
-h print help message and exit
-v level set verbosity level (def level: 0)
-V print version string and exit
-d topdir set topdir (def: $TOPDIR)
-n go thru the actions, but do not update any files (def: do the action)
-N do not process file, just parse arguments and ignore the file (def: process the file)
-e string output string, followed by newline, to stderr (def: do not)
-E exitcode force exit with exitcode (def: exit based on success or failure of the action)
yyyy/dir path from topdir to winner directory: must contain the files: README.md, .path and .winner.json
Exit codes:
0 all OK
1 pandoc exited non-zero
2 -h and help string printed or -V and version string printed
3 command line error
4 bash version is < 4.2
5 yyyy/dir is not a winner directory
>= 10 < 200 ((not used))
>= 200 internal error
$NAME version: $VERSION"
# setup
#
export NOOP=
export DO_NOT_PROCESS=
export DOCROOT_URL_SLASH="/"
# parse command line
#
while getopts :hv:Vd:nNe:E: flag; do
case "$flag" in
h) echo "$USAGE" 1>&2
exit 2
;;
v) V_FLAG="$OPTARG"
;;
V) echo "$VERSION"
exit 2
;;
d) TOPDIR="$OPTARG"
;;
n) NOOP="-n"
;;
N) DO_NOT_PROCESS="-N"
;;
e) echo "$OPTARG" 1>&2
;;
E) exit "$OPTARG"
;;
\?) echo "$0: ERROR: invalid option: -$OPTARG" 1>&2
echo 1>&2
print_usage 1>&2
exit 3
;;
:) echo "$0: ERROR: option -$OPTARG requires an argument" 1>&2
echo 1>&2
echo "$USAGE" 1>&2
exit 3
;;
*) echo "$0: ERROR: unexpected value from getopts: $flag" 1>&2
echo 1>&2
echo "$USAGE" 1>&2
exit 3
;;
esac
done
# parse the command line arguments
#
if [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: debug level: $V_FLAG" 1>&2
fi
#
shift $(( OPTIND - 1 ));
#
if [[ $V_FLAG -ge 5 ]]; then
echo "$0: debug[5]: file argument count: $#" 1>&2
fi
if [[ $# -ne 1 ]]; then
echo "$0: ERROR: expected 1 arg, found: $#" 1>&2
exit 3
fi
#
export WINNER_PATH="$1"
if [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: WINNER_PATH=$WINNER_PATH" 1>&2
fi
# verify that we have an author subdirectory
#
export AUTHOR_PATH="$TOPDIR/author"
if [[ ! -d $AUTHOR_PATH ]]; then
echo "$0: ERROR: author is not a directory under topdir: $AUTHOR_PATH" 1>&2
exit 203
fi
export AUTHOR_DIR="author"
# cd to topdir
#
if [[ ! -e $TOPDIR ]]; then
echo "$0: ERROR: cannot cd to non-existent path: $TOPDIR" 1>&2
exit 204
fi
if [[ ! -d $TOPDIR ]]; then
echo "$0: ERROR: cannot cd to a non-directory: $TOPDIR" 1>&2
exit 205
fi
export CD_FAILED
if [[ $V_FLAG -ge 5 ]]; then
echo "$0: debug[5]: about to: cd $TOPDIR" 1>&2
fi
cd "$TOPDIR" || CD_FAILED="true"
if [[ -n $CD_FAILED ]]; then
echo "$0: ERROR: cd $TOPDIR failed" 1>&2
exit 206
fi
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: now in directory: $(/bin/pwd)" 1>&2
fi
# verify that WINNER_PATH is a winner directory
#
# WINNER_PATH must be in yyyy/dir form
# yyyy must be a directory
# yyyy must be a writable directory
# yyyy/.year must be a non-empty file
# yyyy/dir must be a directory
# yyyy/dir/.path must be a non-empty file
# WINNER_PATH must match the contents of yyyy/dir/.path
# yyyy/dir/.winner.json must be a non-empty file
#
if [[ ! -d $WINNER_PATH ]]; then
echo "$0: ERROR: arg is not a directory: $WINNER_PATH" 1>&2
exit 5
fi
if [[ ! -w $WINNER_PATH ]]; then
echo "$0: ERROR: arg is not a writable directory: $WINNER_PATH" 1>&2
exit 5
fi
export YEAR_DIR=${WINNER_PATH%%/*}
if [[ -z $YEAR_DIR ]]; then
echo "$0: ERROR: arg not in yyyy/dir form: $WINNER_PATH" 1>&2
exit 5
fi
export WINNER_DIR=${WINNER_PATH#*/}
if [[ -z $WINNER_DIR ]]; then
echo "$0: ERROR: arg: $WINNER_PATH not in $YEAR_DIR/dir form: $WINNER_PATH" 1>&2
exit 5
fi
if [[ $WINNER_DIR = */* ]]; then
echo "$0: ERROR: dir from arg: $WINNER_PATH contains a /: $WINNER_DIR" 1>&2
exit 5
fi
if [[ ! -d $YEAR_DIR ]]; then
echo "$0: ERROR: yyyy from arg: $WINNER_PATH is not a directory: $YEAR_DIR" 1>&2
exit 5
fi
export WINNER_ID="${YEAR_DIR}_${WINNER_DIR}"
export DOT_YEAR="$YEAR_DIR/.year"
if [[ ! -s $DOT_YEAR ]]; then
echo "$0: ERROR: not a non-empty file: $DOT_YEAR" 1>&2
exit 5
fi
if [[ ! -d $YEAR_DIR/$WINNER_DIR ]]; then
echo "$0: ERROR: yyyy/dir from arg: $WINNER_PATH is not a directory: $YEAR_DIR/$WINNER_DIR" 1>&2
exit 5
fi
export DOT_PATH="$YEAR_DIR/$WINNER_DIR/.path"
if [[ ! -s $DOT_PATH ]]; then
echo "$0: ERROR: not a non-empty file: $DOT_PATH" 1>&2
exit 5
fi
DOT_PATH_CONTENT=$(< "$DOT_PATH")
if [[ $WINNER_PATH != "$DOT_PATH_CONTENT" ]]; then
echo "$0: ERROR: arg: $WINNER_PATH does not match $DOT_PATH contents: $DOT_PATH_CONTENT" 1>&2
exit 5
fi
export WINNER_JSON="$YEAR_DIR/$WINNER_DIR/.winner.json"
if [[ ! -e $WINNER_JSON ]]; then
echo "$0: ERROR: .winner.json does not exist: $WINNER_JSON" 1>&2
exit 5
fi
if [[ ! -f $WINNER_JSON ]]; then
echo "$0: ERROR: .winner.json is not a file: $WINNER_JSON" 1>&2
exit 5
fi
if [[ ! -r $WINNER_JSON ]]; then
echo "$0: ERROR: .winner.json is not a readable file: $WINNER_JSON" 1>&2
exit 5
fi
# parameter debugging
#
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: NAME=$NAME" 1>&2
echo "$0: debug[3]: YEAR_DIR=$YEAR_DIR" 1>&2
echo "$0: debug[3]: WINNER_DIR=$WINNER_DIR" 1>&2
echo "$0: debug[3]: WINNER_ID=$WINNER_ID" 1>&2
echo "$0: debug[3]: DOT_YEAR=$DOT_YEAR" 1>&2
echo "$0: debug[3]: DOT_PATH=$DOT_PATH" 1>&2
echo "$0: debug[3]: WINNER_JSON=$WINNER_JSON" 1>&2
echo "$0: debug[3]: AUTHOR_PATH=$AUTHOR_PATH" 1>&2
echo "$0: debug[3]: AUTHOR_DIR=$AUTHOR_DIR" 1>&2
echo "$0: debug[3]: DO_NOT_PROCESS=$DO_NOT_PROCESS" 1>&2
echo "$0: debug[3]: NOOP=$NOOP" 1>&2
fi
# If -N, time to exit
#
if [[ -n $DO_NOT_PROCESS ]]; then
if [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: arguments parsed, -N given, exit 0" 1>&2
fi
exit 0
fi
# output DOCROOT_URL_SLASH substitution
#
echo "-s DOCROOT_URL_SLASH='$DOCROOT_URL_SLASH'"
# output HEADER_1 substitution
#
echo "-s HEADER_1='The International Obfuscated C Code Contest'"
# All Done!!! -- Jessica Noll, Age 2
#
exit 0
-317
View File
@@ -1,317 +0,0 @@
#!/usr/bin/env bash
#
# subst.winner-index.sh - print substitutions for a winner index.html
#
# This tool is used in conjunction with the inc/md2html.cfg configuration
# file, and "readme2index.sh" to build an index.html file for a winner.
#
# Copyright (c) 2024 by Landon Curt Noll. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and
# its documentation for any purpose and without fee is hereby granted,
# provided that the above copyright, this permission notice and text
# this comment, and the disclaimer below appear in all of the following:
#
# supporting documentation
# source copies
# source works derived from this source
# binaries derived from this source or from derived source
#
# LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
# EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
# USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#
# chongo (Landon Curt Noll, http://www.isthe.com/chongo/index.html) /\oo/\
#
# Share and enjoy! :-)
# firewall - must be bash with a version 4.2 or later
#
# We must declare arrays with -ag or -Ag
#
if [[ -z ${BASH_VERSINFO[0]} || ${BASH_VERSINFO[0]} -lt 4 || ${BASH_VERSINFO[0]} -eq 4 && ${BASH_VERSINFO[1]} -lt 2 ]]; then
echo "$0: ERROR: bash version must be >= 4.2: $BASH_VERSION" 1>&2
exit 4
fi
# setup bash file matching
#
# Requires bash with a version 4.2 or later
#
shopt -s nullglob # enable expanded to nothing rather than remaining unexpanded
shopt -u failglob # disable error message if no matches are found
shopt -u dotglob # disable matching files starting with .
shopt -s globskipdots # enable never matching . nor ..
shopt -u nocaseglob # disable strict case matching
shopt -u extglob # enable extended globbing patterns
shopt -s globstar # enable ** to match all files and zero or more directories and subdirectories
# set variables referenced in the usage message
#
export VERSION="1.0 2024-01-02"
NAME=$(basename "$0")
export NAME
export V_FLAG=0
GIT_TOOL=$(type -P git)
export GIT_TOOL
if [[ -z "$GIT_TOOL" ]]; then
echo "$0: FATAL: git tool is not installed or not in PATH" 1>&2
exit 200
fi
"$GIT_TOOL" rev-parse --is-inside-work-tree >/dev/null 2>&1
status="$?"
if [[ $status -eq 0 ]]; then
TOPDIR=$("$GIT_TOOL" rev-parse --show-toplevel)
fi
# set usage message
#
export USAGE="usage: $0 [-h] [-v level] [-V] [-n] [-N]
[-d topdir] [-p tool] [-P optstr]
[-e string ..] [-E exitcode]
yyyy/dir
-h print help message and exit
-v level set verbosity level (def level: 0)
-V print version string and exit
-d topdir set topdir (def: $TOPDIR)
-n go thru the actions, but do not update any files (def: do the action)
-N do not process file, just parse arguments and ignore the file (def: process the file)
-e string output string, followed by newline, to stderr (def: do not)
-E exitcode force exit with exitcode (def: exit based on success or failure of the action)
yyyy/dir path from topdir to winner directory: must contain the files: README.md, .path and .winner.json
Exit codes:
0 all OK
1 pandoc exited non-zero
2 -h and help string printed or -V and version string printed
3 command line error
4 bash version is < 4.2
5 yyyy/dir is not a winner directory
>= 10 < 200 ((not used))
>= 200 internal error
$NAME version: $VERSION"
# setup
#
export NOOP=
export DO_NOT_PROCESS=
export DOCROOT_URL_SLASH="/"
# parse command line
#
while getopts :hv:Vd:nNe:E: flag; do
case "$flag" in
h) echo "$USAGE" 1>&2
exit 2
;;
v) V_FLAG="$OPTARG"
;;
V) echo "$VERSION"
exit 2
;;
d) TOPDIR="$OPTARG"
;;
n) NOOP="-n"
;;
N) DO_NOT_PROCESS="-N"
;;
e) echo "$OPTARG" 1>&2
;;
E) exit "$OPTARG"
;;
\?) echo "$0: ERROR: invalid option: -$OPTARG" 1>&2
echo 1>&2
print_usage 1>&2
exit 3
;;
:) echo "$0: ERROR: option -$OPTARG requires an argument" 1>&2
echo 1>&2
echo "$USAGE" 1>&2
exit 3
;;
*) echo "$0: ERROR: unexpected value from getopts: $flag" 1>&2
echo 1>&2
echo "$USAGE" 1>&2
exit 3
;;
esac
done
# parse the command line arguments
#
if [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: debug level: $V_FLAG" 1>&2
fi
#
shift $(( OPTIND - 1 ));
#
if [[ $V_FLAG -ge 5 ]]; then
echo "$0: debug[5]: file argument count: $#" 1>&2
fi
if [[ $# -ne 1 ]]; then
echo "$0: ERROR: expected 1 arg, found: $#" 1>&2
exit 3
fi
#
export WINNER_PATH="$1"
if [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: WINNER_PATH=$WINNER_PATH" 1>&2
fi
# verify that we have an author subdirectory
#
export AUTHOR_PATH="$TOPDIR/author"
if [[ ! -d $AUTHOR_PATH ]]; then
echo "$0: ERROR: author is not a directory under topdir: $AUTHOR_PATH" 1>&2
exit 203
fi
export AUTHOR_DIR="author"
# cd to topdir
#
if [[ ! -e $TOPDIR ]]; then
echo "$0: ERROR: cannot cd to non-existent path: $TOPDIR" 1>&2
exit 204
fi
if [[ ! -d $TOPDIR ]]; then
echo "$0: ERROR: cannot cd to a non-directory: $TOPDIR" 1>&2
exit 205
fi
export CD_FAILED
if [[ $V_FLAG -ge 5 ]]; then
echo "$0: debug[5]: about to: cd $TOPDIR" 1>&2
fi
cd "$TOPDIR" || CD_FAILED="true"
if [[ -n $CD_FAILED ]]; then
echo "$0: ERROR: cd $TOPDIR failed" 1>&2
exit 206
fi
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: now in directory: $(/bin/pwd)" 1>&2
fi
# verify that WINNER_PATH is a winner directory
#
# WINNER_PATH must be in yyyy/dir form
# yyyy must be a directory
# yyyy must be a writable directory
# yyyy/.year must be a non-empty file
# yyyy/dir must be a directory
# yyyy/dir/.path must be a non-empty file
# WINNER_PATH must match the contents of yyyy/dir/.path
# yyyy/dir/.winner.json must be a non-empty file
#
if [[ ! -d $WINNER_PATH ]]; then
echo "$0: ERROR: arg is not a directory: $WINNER_PATH" 1>&2
exit 5
fi
if [[ ! -w $WINNER_PATH ]]; then
echo "$0: ERROR: arg is not a writable directory: $WINNER_PATH" 1>&2
exit 5
fi
export YEAR_DIR=${WINNER_PATH%%/*}
if [[ -z $YEAR_DIR ]]; then
echo "$0: ERROR: arg not in yyyy/dir form: $WINNER_PATH" 1>&2
exit 5
fi
export WINNER_DIR=${WINNER_PATH#*/}
if [[ -z $WINNER_DIR ]]; then
echo "$0: ERROR: arg: $WINNER_PATH not in $YEAR_DIR/dir form: $WINNER_PATH" 1>&2
exit 5
fi
if [[ $WINNER_DIR = */* ]]; then
echo "$0: ERROR: dir from arg: $WINNER_PATH contains a /: $WINNER_DIR" 1>&2
exit 5
fi
if [[ ! -d $YEAR_DIR ]]; then
echo "$0: ERROR: yyyy from arg: $WINNER_PATH is not a directory: $YEAR_DIR" 1>&2
exit 5
fi
export WINNER_ID="${YEAR_DIR}_${WINNER_DIR}"
export DOT_YEAR="$YEAR_DIR/.year"
if [[ ! -s $DOT_YEAR ]]; then
echo "$0: ERROR: not a non-empty file: $DOT_YEAR" 1>&2
exit 5
fi
if [[ ! -d $YEAR_DIR/$WINNER_DIR ]]; then
echo "$0: ERROR: yyyy/dir from arg: $WINNER_PATH is not a directory: $YEAR_DIR/$WINNER_DIR" 1>&2
exit 5
fi
export DOT_PATH="$YEAR_DIR/$WINNER_DIR/.path"
if [[ ! -s $DOT_PATH ]]; then
echo "$0: ERROR: not a non-empty file: $DOT_PATH" 1>&2
exit 5
fi
DOT_PATH_CONTENT=$(< "$DOT_PATH")
if [[ $WINNER_PATH != "$DOT_PATH_CONTENT" ]]; then
echo "$0: ERROR: arg: $WINNER_PATH does not match $DOT_PATH contents: $DOT_PATH_CONTENT" 1>&2
exit 5
fi
export WINNER_JSON="$YEAR_DIR/$WINNER_DIR/.winner.json"
if [[ ! -e $WINNER_JSON ]]; then
echo "$0: ERROR: .winner.json does not exist: $WINNER_JSON" 1>&2
exit 5
fi
if [[ ! -f $WINNER_JSON ]]; then
echo "$0: ERROR: .winner.json is not a file: $WINNER_JSON" 1>&2
exit 5
fi
if [[ ! -r $WINNER_JSON ]]; then
echo "$0: ERROR: .winner.json is not a readable file: $WINNER_JSON" 1>&2
exit 5
fi
# parameter debugging
#
if [[ $V_FLAG -ge 3 ]]; then
echo "$0: debug[3]: NAME=$NAME" 1>&2
echo "$0: debug[3]: YEAR_DIR=$YEAR_DIR" 1>&2
echo "$0: debug[3]: WINNER_DIR=$WINNER_DIR" 1>&2
echo "$0: debug[3]: WINNER_ID=$WINNER_ID" 1>&2
echo "$0: debug[3]: DOT_YEAR=$DOT_YEAR" 1>&2
echo "$0: debug[3]: DOT_PATH=$DOT_PATH" 1>&2
echo "$0: debug[3]: WINNER_JSON=$WINNER_JSON" 1>&2
echo "$0: debug[3]: AUTHOR_PATH=$AUTHOR_PATH" 1>&2
echo "$0: debug[3]: AUTHOR_DIR=$AUTHOR_DIR" 1>&2
echo "$0: debug[3]: DO_NOT_PROCESS=$DO_NOT_PROCESS" 1>&2
echo "$0: debug[3]: NOOP=$NOOP" 1>&2
fi
# If -N, time to exit
#
if [[ -n $DO_NOT_PROCESS ]]; then
if [[ $V_FLAG -ge 1 ]]; then
echo "$0: debug[1]: arguments parsed, -N given, exit 0" 1>&2
fi
exit 0
fi
# output TITLE substitution
#
echo "-s TITIE='$YEAR_DIR/$WINNER_DIR'"
# output DESCRIPTION substitution
#
echo "-s DESCRIPTION='$YEAR_DIR IOCCC winner $WINNER_DIR'"
# output KEYWORDS substitution
#
echo "-s KEYWORDS='IOCCC, $YEAR_DIR, IOCCC $YEAR_DIR, IOCCC winner, $WINNER_DIR'"
# output HEADER_2 substitution
#
echo "-s HEADER_2='$YEAR_DIR/$WINNER_DIR'"
# All Done!!! -- Jessica Noll, Age 2
#
exit 0
+2 -2
View File
@@ -1,6 +1,6 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<!-- START: two lines up starts content from: /inc/top.default.html -->
<!-- START: two lines up starts content from: inc/top.default.html -->
<!-- -->
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
@@ -8,4 +8,4 @@
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<!-- -->
<!-- END: this line ends content from: /inc/top.default.html -->
<!-- END: this line ends content from: inc/top.default.html -->
+5 -5
View File
@@ -1,9 +1,9 @@
<!-- START: this line starts content from: /inc/topnav.default.html -->
<!-- START: this line starts content from: inc/topnav.default.html -->
<div class="topnav">
<a href="%%LEFT_LINK%%">&larr; %%LEFT_TEXT%%</a>
<a href="%%UP_LINK%%">&uarr; %%UP_TEXT%% &uarr;</a>
<a href="%%RIGHT_LINK%%">%%RIGHT_TEXT%% &rarr;</a>
<a class="Left" href="%%LEFT_LINK%%">&larr; %%LEFT_TEXT%%</a>
<a class="Left" href="%%UP_LINK%%">&uarr; %%UP_TEXT%% &uarr;</a>
<a class="Left" href="%%RIGHT_LINK%%">%%RIGHT_TEXT%% &rarr;</a>
</div>
<!-- END: this line ends content from: /inc/topnav.default.html -->
<!-- END: this line ends content from: inc/topnav.default.html -->
+6 -5
View File
@@ -1,9 +1,10 @@
<!-- START: this line starts content from: /inc/topnav.first.html -->
<!-- START: this line starts content from: inc/topnav.first.html -->
<div class="topnav">
<p class="Disabled">first entry</a>
<a href="%%UP_LINK%%">&uarr; %%UP_TEXT%% &uarr;</a>
<a href="%%RIGHT_LINK%%">%%RIGHT_TEXT%% &rarr;</a>
<p class="Left Disabled">first entry</a>
<a class="Left" href="%%UP_LINK%%">&uarr; %%UP_TEXT%% &uarr;</a>
<a class="Left" href="%%RIGHT_LINK%%">%%RIGHT_TEXT%% &rarr;</a>
<a class="Right" href="%%INVENTORY_LINK%%">%%INVENTORY_TEXT%%</a>
</div>
<!-- END: this line ends content from: /inc/topnav.first.html -->
<!-- END: this line ends content from: inc/topnav.first.html -->
+6 -5
View File
@@ -1,9 +1,10 @@
<!-- START: this line starts content from: /inc/topnav.last.html -->
<!-- START: this line starts content from: inc/topnav.last.html -->
<div class="topnav">
<a href="%%LEFT_LINK%%">&larr; %%LEFT_TEXT%%</a>
<a href="%%UP_LINK%%">&uarr; %%UP_TEXT%% &uarr;</a>
<p class="Disabled">last entry</p>
<a class="Left" href="%%LEFT_LINK%%">&larr; %%LEFT_TEXT%%</a>
<a class="Left" href="%%UP_LINK%%">&uarr; %%UP_TEXT%% &uarr;</a>
<p class="Left Disabled">last entry</p>
<a class="Right" href="%%INVENTORY_LINK%%">%%INVENTORY_TEXT%%</a>
</div>
<!-- END: this line ends content from: /inc/topnav.last.html -->
<!-- END: this line ends content from: inc/topnav.last.html -->
+10
View File
@@ -0,0 +1,10 @@
<!-- START: this line starts content from: inc/topnav.mid.html -->
<div class="topnav">
<a class="Left" href="%%LEFT_LINK%%">&larr; %%LEFT_TEXT%%</a>
<a class="Left" href="%%UP_LINK%%">&uarr; %%UP_TEXT%% &uarr;</a>
<a class="Left" href="%%RIGHT_LINK%%">%%RIGHT_TEXT%% &rarr;</a>
<a class="Right" href="%%INVENTORY_LINK%%">%%INVENTORY_TEXT%%</a>
</div>
<!-- END: this line ends content from: inc/topnav.mid.html -->