More or less the same , but XD

This commit is contained in:
Nova 2021-06-24 13:08:43 -03:00
commit 1432dbfeb7
11 changed files with 561 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
bin
output/*.xml
output/*.html
output/urllist.txt

15
LICENSE Normal file
View File

@ -0,0 +1,15 @@
ISC License
Copyright (c) 2011-2016 Hiltjo Posthuma <hiltjo@codemadness.org>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, 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.

62
README.md Normal file
View File

@ -0,0 +1,62 @@
static site scripts
===================
Description
-----
This is a fork of the [original project](http://git.codemadness.org/static-site-scripts/log.html) enabling XHTML 1.1 support made by Nova.
Default values were left blank on this variant.
Usage
-----
sh generate.sh
Features
--------
- Small and simple to understand (I hope).
- Small amount of dependencies, requires a POSIX shell and basic Linux/Unix
utilities[1][2].
- Markdown supported by default[0], easily extendable to add your
\<favorite markup language\>.
- RSS and Atom output support.
- Sitemap support (sitemap.xml and urllist.txt).
Pages
-----
Pages are defined as shellscripts containing the metadata, for example
the file pages/html-example.sh.
The content filename is the basename of the shellscript with the type of
markup file appended to it (.html or .md), for example the file
pages/html-example.html.
Markdown is supported. By default "smu"[0] is set as a Markdown processor,
to change this set $markdown to your favorite Markdown-to-HTML converter in
the file generate.sh.
Dependencies
------------
cat, cut, date, mkdir, printf, read, sed, sh (POSIX), test, tr
License
-------
ISC, see LICENSE file.
References
----------
[0] smu - markdown processor: https://github.com/Gottox/smu
[1] sbase - http://git.suckless.org/sbase/
ubase - http://git.suckless.org/ubase/
[2] busybox - http://www.busybox.net/

1
TODO Normal file
View File

@ -0,0 +1 @@

301
generate.sh Executable file
View File

@ -0,0 +1,301 @@
#!/bin/sh
# site title (part of ${pagetitle} probably).
sitetitle=""
# site language.
sitelang="en"
# main site domain.
sitedomain=""
# relative site url, can be "/blog" or something.
siteurlrel=""
# full site url.
siteurlfull="${sitedomain}${siteurlrel}"
# site keywords (global default), don't use too many.
sitekeywords=""
# site description (global default).
sitedescription=""
# site mail used for contact "mail link".
sitemail=""
# site author (global).
siteauthor=""
# site last updated (default use date when script was run).
siteupdated=$(date "+%Y-%m-%dT%H:%M:%SZ")
# site owner's projects url (can be github or anything)
siteprojects=""
# directories containing content and metadata.
# NOTE: it's recommended to use absolute paths here, use "." for current directory.
pagesdir="pages"
# Output dir.
outputdir="output"
# Markdown processor: default: is "smu".
markdown="smu"
#gnudate(fmt,date)
gnudate() {
date "+$1" -d "$2"
}
#bsddate(fmt,date)
bsddate() {
date -j "+$1" "$(printf '%s' "$2" | tr -Cd '[:digit:]')"
}
# added for compatibility with GNU and BSD date.
alias formatdate='gnudate'
if ! gnudate '%Y' '2015-01-01 00:00' 2>/dev/null; then
alias formatdate='bsddate'
fi
#makeid(title), format "Some title" to "some-title".
makeid() {
printf '%s\n' "$1" | tr '[:upper:]' '[:lower:]' | \
sed -e 's@[^[:alnum:]]\{1,\}@-@g' -e 's@-*$@@g' -e 's@^-*@@g'
}
# initial values for page variables, use some site vars as global defaults.
pagereset() {
id=""
title=""
url=""
description="${sitedescription}"
keywords="${sitekeywords}"
author="${siteauthor}"
content=""
tags=""
categories=""
timecreated=""
datecreated=""
timeupdated=""
dateupdated=""
}
pageread() {
meta="$1"
. "${meta}" # source page metadata.
basename=$(basename "${meta}" ".sh")
datecreated=$(printf '%s' "${timecreated}" | cut -b 1-10)
dateupdated=$(printf '%s' "${timeupdated}" | cut -b 1-10)
# if ${id} is empty and title is set: create id based on title.
if test -z "${id}" && test -n "${title}"; then
id=$(makeid "${title}")
fi
if test -z "${id}"; then
printf 'Warning: $id or $title not set in "%s", skipping...\n' "${meta}" >&2
return 1
fi
if test -z "${url}"; then
url="${id}.html"
fi
outfile="${id}.html"
urlfull="${siteurlfull}/${outfile}"
filename=""
# ${content} not set; try data from filetypes.
if test -z "${content}"; then
if test -f "${pagesdir}/${basename}.html"; then
filename="${pagesdir}/${basename}.html"
content=$(cat "${filename}")
elif test -f "${pagesdir}/${basename}.md"; then
filename="${pagesdir}/${basename}.md"
content=$("${markdown}" "${filename}")
fi
fi
created="<strong>Created on:</strong> ${datecreated}<br/>"
if test "${datecreated}" != "${dateupdated}"; then
created="${created}<strong>Last update on:</strong> ${dateupdated}<br/>"
fi
}
pageheader() {
# prefix page title with site title, make sure its neatly formatted.
if test -z "${title}"; then
pagetitle="${sitetitle}"
else
pagetitle="${title} - ${sitetitle}"
fi
cat <<!__EOF__
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd" dir="ltr" xml:lang="${sitelang}" lang="${sitelang}">
<head>
<title>${pagetitle}</title>
<link rel="stylesheet" href="style.css" type="text/css" media="screen" />
<link rel="stylesheet" href="print.css" type="text/css" media="print" />
<link rel="alternate" type="application/rss+xml" title="${sitetitle} RSS Feed" href="rss.xml" />
<link rel="alternate" type="application/atom+xml" title="${sitetitle} Atom Feed" href="atom.xml" />
<link rel="icon" type="image/png" href="/favicon.png" />
<meta http-equiv="Content-Type" content="application/xhtml+xml;charset=utf-8" />
<meta http-equiv="Content-Language" content="${sitelang}" />
<meta content="width=device-width" name="viewport" />
<meta content="${keywords}" name="keywords" />
<meta content="${description}" name="description" />
<meta content="${author}" name="author" />
</head>
<body>
<div id="menuwrap">
<div id="menu">
<span id="links">
<a href="index.html" title="Blog">Blog</a> |
<a href="${siteprojects}" title="Some of my projects">Projects</a>
</span>
<span id="links-contact">
<span class="hidden"> | </span>
<a href="rss.xml" title="RSS feed">RSS</a> |
<a href="atom.xml" title="Atom feed">Atom</a> |
<a href="mailto:${sitemail}" title="Mail me">Mail</a>
</span>
</div>
</div>
<hr class="hidden" />
<div id="mainwrap">
<div id="main">
!__EOF__
}
pagecontent() {
pageheader
cat <<!__EOF__
<h1><a href="">${title}</a></h1>
<em>${created}</em>
${content}
!__EOF__
pagefooter
}
pagefooter() {
cat <<!__EOF__
</div>
</div>
</body>
</html>
!__EOF__
}
if ! test -d "${pagesdir}"; then
printf 'Error: pages directory "%s" not found.\n' "${pagesdir}" >&2
exit 1
fi
# process single page as argument (handy for testing a single page).
if test -n "$1"; then
pagereset
pageread "$1" || exit 1
pagecontent
exit 0
fi
# try to make output dir.
mkdir -p "${outputdir}"
# truncate urllist.txt (sitemap).
> "${outputdir}/urllist.txt"
# content for RSS, Atom sitemap and index, this is appended as a string.
contentindex=""
contentrss=""
contentatom=""
contentsitemap=""
while read -r meta; do
pagereset
pageread "${meta}" || continue
pagecontent > "${outputdir}/${outfile}"
# index / posts item: append.
contentindex="${contentindex}$(cat <<!__EOF__
<tr><td>${dateupdated}</td>
<td><a href="${url}" title="${description}">${title}</a></td></tr>
!__EOF__
)"
# RSS item: append.
# NOTE: GMT timezone is hard-coded because %z is not consistent,
# change accordingly.
contentrsspubdate=$(formatdate "%a, %d %b %Y %H:%M:%S GMT" "${timeupdated}")
contentrss="${contentrss}$(
cat <<!__EOF__
<item>
<title>${title}</title>
<link>${urlfull}</link>
<pubDate>${contentrsspubdate}</pubDate>
<author>${author}</author>
<guid isPermaLink="false">${urlfull}</guid>
<description><![CDATA[${description}]]></description>
</item>
!__EOF__
)"
# Atom item: append.
contentatomupdated=$(formatdate "%Y-%m-%dT%H:%M:%SZ" "${timeupdated}")
contentatompublished=$(formatdate "%Y-%m-%dT%H:%M:%SZ" "${timecreated}")
contentatom="${contentatom}$(
cat <<!__EOF__
<entry>
<title type="html"><![CDATA[${title}]]></title>
<link rel="alternate" type="text/html" href="${urlfull}" />
<id>${urlfull}</id>
<updated>${contentatomupdated}</updated>
<published>${contentatompublished}</published>
<author>
<name>${author}</name>
<uri>${siteurlfull}</uri>
</author>
<summary type="html"><![CDATA[${description}]]></summary>
</entry>
!__EOF__
)"
# sitemap: sitemap.xml, append item.
contentsitemap="${contentsitemap}<url><loc>${urlfull}</loc></url>"
# sitemap: urllist.txt, append item, write directly to file, because
# this is just a plain-text list.
printf '%s\n' "${urlfull}" >> "${outputdir}/urllist.txt"
done <<!FILELIST
$(find "${pagesdir}" -type f -name "*.sh" | sort -rn)
!FILELIST
# process pages (reverse numeric order).
# NOTE: above heredoc is used to make sure content* variables are known
# in the scope after the while loop (subshell / pipes prevents this in a
# standard manner).
# index HTML page (index.html).
pagereset
title="Posts"
(pageheader
cat <<!__EOF__
<h1>${title}</h1>
<table>
${contentindex}
</table>
!__EOF__
pagefooter) > "${outputdir}/index.html"
# RSS feed (rss.xml).
cat <<!__EOF__ > "${outputdir}/rss.xml"
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>${sitetitle}</title>
<link>${siteurlfull}</link>
<description>${sitedescription}</description>
<language>${sitelang}</language>
${contentrss}
</channel>
</rss>
!__EOF__
# Atom feed (atom.xml).
cat <<!__EOF__ > "${outputdir}/atom.xml"
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="${sitelang}">
<title type="text">${sitetitle}</title>
<subtitle type="text">${sitedescription}</subtitle>
<updated>${siteupdated}</updated>
<link rel="alternate" type="text/html" href="${siteurlfull}" />
<id>${siteurlfull}/atom.xml</id>
<link rel="self" type="application/atom+xml" href="${siteurlfull}/atom.xml" />
${contentatom}
</feed>
!__EOF__
# sitemap (sitemap.xml).
cat <<!__EOF__ > "${outputdir}/sitemap.xml"
<?xml version="1.0" encoding="UTF-8"?><urlset>${contentsitemap}</urlset>
!__EOF__

22
output/print.css Normal file
View File

@ -0,0 +1,22 @@
table {
border: 0;
}
h1, h1 a, h1 a:visited,
h2, h2 a, h2 a:visited,
h3, h3 a, h3 a:visited,
h1 a:hover, h2 a:hover, h3 a:hover {
color: inherit;
text-decoration: none;
}
table tr td {
padding: 2px 10px 2px 0px;
}
pre {
border: 1px dashed #777;
padding: 5px;
overflow-x: auto;
}
#menuwrap,
.hidden {
display: none;
}

67
output/style.css Normal file
View File

@ -0,0 +1,67 @@
body {
font-family: sans-serif, monospace;
text-align: center;
overflow-y: scroll;
color: #333;
background-color: #fff;
margin: 0;
padding: 0;
}
table {
border: 0;
}
hr {
height: 1px;
color: #ccc;
background-color: #ccc;
border: 0;
}
h1 {
font-size: 140%;
}
h2 {
font-size: 120%;
}
h3 {
font-size: 100%;
}
h1, h1 a, h1 a:visited,
h2, h2 a, h2 a:visited,
h3, h3 a, h3 a:visited,
h1 a:hover, h2 a:hover, h3 a:hover {
color: inherit;
text-decoration: none;
}
table tr td {
padding: 2px 10px 2px 0px;
}
pre {
border: 1px dashed #777;
background-color: #eee;
padding: 5px;
overflow-x: auto;
}
#menuwrap {
background-color: #eee;
padding: 1ex;
border-bottom: 1px solid #ccc;
}
#main {
padding: 1ex;
}
#menu,
#main {
margin: 0px auto;
text-align: left;
max-width: 80ex;
}
#menu a {
font-weight: bold;
vertical-align: middle;
}
#links-contact {
float: right;
}
.hidden {
display: none;
}

View File

@ -0,0 +1 @@
<p>This is an example page :)</p>

13
pages/001-html-example.sh Executable file
View File

@ -0,0 +1,13 @@
#!/bin/sh
title="HTML example"
description="description here"
timecreated="2013-01-01 00:00"
timeupdated="2013-01-01 00:00"
#id="html-example"
#url="${id}.html"
#tags="tags, comma, separated"
#keywords="keywords, comma, separated"
#categories="Category name"
#timestamp="2013-01-01"
#author="author"
#content="custom stuff"

View File

@ -0,0 +1,61 @@
simple tests
------------
first paragraph.
testing surround: _emph_ then **strong** and `code`.
`\`escaped backticks\``.
`x = *y * 6;`
horizontal rule:
- - -
blocks and entities
-------------------
preformatted block:
.'''' .'.'. | |
'''. | ' | | |
'''' ' ' ""
quoted text:
> When in doubt,
> use brute force.
list:
* Make each program do one thing well.
* Expect the output of every program to become the input to another,
as yet unknown, program.
* Design and build software, even operating systems, to be tried early,
ideally within weeks.
* Use tools in preference to unskilled help to lighten a programming task.
list in list:
* a
* b
1. c
2. d
* e
* f
entity: &, <, >
code:
int powerof2(unsigned int n) {
return !((n - 1) & n) && n > 0;
}
links
-----
[suckless](http://suckless.org)
inline html
-----------
<center>
ABC
</center>

14
pages/002-markdown-example.sh Executable file
View File

@ -0,0 +1,14 @@
#!/bin/sh
title="Markdown example"
description="description here"
timecreated="2013-01-01 00:00"
timeupdated="2013-01-01 00:00"
author="Bob"
#id="markdown-example"
#url="${id}.html"
#tags="tags, comma, separated"
#keywords="keywords, comma, separated"
#categories="Category name"
#timestamp="2013-01-02"
#author="author"
#content="custom stuff"