Projects page updated.

This commit is contained in:
Niels Serup 2011-08-05 00:50:04 +02:00
parent a63b3ad10d
commit ae33211414
12 changed files with 1035 additions and 447 deletions

View File

@ -7,10 +7,7 @@ _filedir = os.path.dirname(_absfile)
sys.path.insert(0, _filedir)
try:
import mege.wsgi
except ImportError:
pass#sys.path.insert(0, os.path.join(_filedir, 'mege'))
#import mege.wsgi
import mege.wsgi
os.chdir(_filedir)
application = mege.wsgi.create_application()

502
prestatic/general.css Normal file
View File

@ -0,0 +1,502 @@
/* BASICS */
* {
margin: 0;
padding: 0;
}
body {
font-family: 'Dejavu Sans', 'Nimbus Sans', Helvetica, Arial, Verdana, sans-serif;
font-size: 14px;
color: #000;
}
#bodyend {
clear: both;
}
#metadata {
margin: 10px 0;
border-style: dashed;
border-color: #ccc;
border-width: 4px 0 0 0;
background: #aaa url('/static/metadata.png') no-repeat right bottom;
padding: 2px 5px;
color: #fff;
}
#metadata table, #metadata td, #metadata th {
border: None;
margin: 0;
}
#toc {
background-color: #ddd;
border: 2px dotted #aaa;
display: inline-block;
padding: 4px 9px;
margin: 2px 0 10px 4px;
}
#toc li.level1 {
margin-left: 0;
}
#toc li.level2 {
margin-left: 10px;
}
#toc li.level3 {
margin-left: 19px;
}
#toc li.level4 {
margin-left: 27px;
}
#toc li.level5 {
margin-left: 34px;
}
#toc li.level6 {
margin-left: 40px;
}
/* LINKS */
a {
text-decoration: none;
}
a:link, a:visited {
color: #004a7f;
}
a:hover {
color: #200cff;
}
/* HEADINGS */
h1, h2, h3, h4, h5, h6 {
font-family: 'Dejavu Serif', FreeSerif, 'Nimbus Roman', Georgia, serif;
font-weight: normal;
clear: both;
}
h1 {
margin: 16px 0 5px 0;
font-size: 30px;
}
h1:first-child {
margin-top: 0;
}
h2 {
margin: 14px 0 5px 0 ;
font-size: 25px;
background-color: #ddd;
}
h3 {
margin: 9px 0 3px 0;
font-size: 21px;
}
h4 {
margin: 7px 0 2px 0;
font-size: 18px;
font-weight: bold;
}
h5 {
margin-top: 5px 0 1px 0;
font-size: 16px;
font-weight: bold;
}
h6 {
margin: 3px 0 1px 0;
font-size: 14px;
font-weight: bold;
}
/* Misc. elements */
p {
text-align: justify;
margin-top: 10px;
}
p:first-child {
margin-top: 0;
}
div.caption {
clear: both;
margin-bottom: 10px;
}
caption, div.caption > p {
background-color: #ddd;
padding: 3px;
text-align: center;
font-style: italic;
}
div.caption.center-float img {
margin: 0 auto;
}
div.caption.left-float img {
margin: 0;
}
div.caption.center-float {
text-align: center;
}
div.caption.center-float p {
display: inline-block;
}
tt, code, samp, pre, var {
font-family: Inconsolata, 'Dejavu Sans Mono', monospace;
}
pre {
margin-top: 10px;
white-space: pre-wrap;
word-wrap: break-word;
}
img {
border: none;
clear: both;
margin-bottom: 10px;
}
cite, quote {
border-bottom: 1px dashed yellow;
}
blockquote {
margin: 5px 0 5px 20px;
font-size: 15px;
}
acronym, abbreviation {
border-bottom: 1px dashed green;
}
kbd {
background-color: #fff;
padding: 1px 2px;
}
dfn {
font-style: italic;
}
dfn {
font-style: italic;
}
ins {
text-decoration: underline;
}
del {
text-decoration: line-through;
}
hr {
margin: 5px 0;
}
/* Lists */
ul, ol {
margin-top: 5px;
list-style-position: inside;
}
ul > ul, ul > ol, ol > ul, ol > ol {
margin-left: 17px;
margin-bottom: 0;
padding-left: 5px;
}
ul {
list-style-type: disc;
}
ul > ul, ol > ul {
list-style-type: square;
}
ul > * > ul, ol > * > ul {
list-style-type: circle;
}
ul > * * > ul, ol > * * > ul {
list-style-type: disc; ! important
}
ol {
list-style-type: decimal;
}
ol > ol, ul > ol {
list-style-type: upper-alpha;
}
ol > * > ol, ul > * > ol {
list-style-type: lower-alpha;
}
ol > * * > ol, ul > * * > ol {
list-style-type: decimal; ! important
}
/* Definition lists */
dd {
margin-left: 20px;
}
dl > dl {
margin-left: 21px;
padding-left: 5px;
border-left: 4px solid #000;
}
/* Tables */
table {
margin: 5px auto;
border-collapse: collapse;
}
table, thead, tbody, tfoot, td, th {
border-style: inset;
border-color: black;
}
td, th {
margin: 0 5px;
padding: 1px 3px;
border-width: 0 2px 0 0;
}
td:last-child, th:last-child {
border-width: 0;
}
table, tbody {
border-width: 0;
}
thead {
border-width: 0 0 2px 0;
}
tfoot {
border-width: 2px 0 0 0;
}
thead, tfoot {
font-weight: bold;
}
/* Math */
.math {
position: relative;
top: 14px;
}
.block.math {
position: static;
top: 0;
margin: 10px auto 0 auto;
}
/* Formatting-related classes */
.strong {
font-weight: bold;
}
.emph {
font-style: italic;
}
.underline {
text-decoration: underline;
}
.center-align, .center-align > * {
text-align: center; ! important
}
.right-align, .right-align > * {
text-align: right; ! important
}
.left-align, .left-align > * {
text-align: left; ! important
}
.center-float {
margin-right: auto;
margin-left: auto;
}
.right-float {
float: right;
}
.left-float {
float: left;
}
div.right-float, img.right-float, video.right-float, audio.right-float {
margin-left: 10px;
}
div.left-float, img.left-float, video.left-float, audio.left-float {
margin-right: 10px;
}
.block {
display: block;
}
.inline {
display: inline;
}
.noclear, div.caption.noclear {
clear: none; ! important
}
.huge, .huge * {
font-size: 25px; ! important
}
.large, .large * {
font-size: 18px; ! important
}
.medium, .medium * {
font-size: 14px; ! important
}
.small, .small * {
font-size: 11px; ! important
}
.tiny, .tiny * {
font-size: 9px; ! important
}
/* Code highlighting */
.highlight {
padding: 2px 4px;
}
.highlighttable {
margin: 5px 0 5px 0;
}
.highlighttable pre {
margin-top: 0;
}
.highlighttable, .highlighttable .code {
border-width: 0;
}
.linenos {
border-width: 0 1px 0 0;
border-style: solid;
border-size: black;
vertical-align: top;
}
/* Projects boxes */
.projectboxes li {
display: block;
float: left;
margin: 0 10px 10px 0;
width: 230px;
overflow: hidden;
background-color: #000;
}
.projectboxes li a {
display: block;
padding: 2px 3px;
height: 115px;
overflow: hidden;
background-position: 0 20px;
background-repeat: no-repeat;
white-space: nowrap;
text-align: right;
}
.projectboxes li a:link, .projectboxes li a:visited {
color: #ffff00;
font-weight: bold;
}
.projectboxes li a:hover {
background-color: #ffff00;
color: #000;
}
.projectboxes li dfn {
display: block;
padding: 2px 3px;
height: 35px;
overflow: hidden;
font-style: normal;
color: #fff;
background-color: #444;
}
/* Misc. classes */
.warning {
background-color: #ffa400;
font-weight: bold;
padding: 5px 5px 0 5px;
border: 1px outset black;
}
.note {
background-color: #c3cfcf;
font-weight: bold;
padding: 5px 5px 0 5px;
border: 1px outset black;
}
.notice {
background-color: yellow;
}
.notice p, .note p, .warning p {
margin-bottom: 5px;
}

View File

@ -0,0 +1,15 @@
#minilogo {
display: none;
}
#menu {
display: none;
}
.highlighttable .code {
width: 100%;
}
.viewsource {
display: none;
}

View File

@ -10,9 +10,6 @@ page_bg = '#e8efef'
body {
/*@preval 'background-color: ' + page_bg + ';\n'@*/
font-family: 'Dejavu Sans', 'Nimbus Sans', Helvetica, Arial, Verdana, sans-serif;
font-size: 14px;
color: #000;
}
#minilogo {
@ -86,25 +83,6 @@ ul#menulinks {
width: auto;
}
#bodyend {
clear: both;
}
#metadata {
margin: 10px 0;
border-style: dashed;
border-color: #ccc;
border-width: 4px 0 0 0;
background: #aaa url('/static/metadata.png') no-repeat right bottom;
padding: 2px 5px;
color: #fff;
}
#metadata table, #metadata td, #metadata th {
border: None;
margin: 0;
}
#logo {
margin-top: 10px;
background: #111111;
@ -121,419 +99,7 @@ ul#menulinks {
" url('/static/metanohi-logo.png') no-repeat center;\n"@*/
}
#toc {
background-color: #ddd;
border: 2px dotted #aaa;
display: inline-block;
padding: 4px 9px;
margin: 2px 0 10px 4px;
}
#toc li.level1 {
margin-left: 0;
}
#toc li.level2 {
margin-left: 10px;
}
#toc li.level3 {
margin-left: 19px;
}
#toc li.level4 {
margin-left: 27px;
}
#toc li.level5 {
margin-left: 34px;
}
#toc li.level6 {
margin-left: 40px;
}
/* LINKS */
a {
text-decoration: none;
}
a:link, a:visited {
color: #004a7f;
}
a:hover {
color: #200cff;
}
/* HEADINGS */
h1, h2, h3, h4, h5, h6 {
font-family: 'Dejavu Serif', FreeSerif, 'Nimbus Roman', Georgia, serif;
font-weight: normal;
}
h1 {
margin: 16px 0 5px 0;
font-size: 30px;
}
h1:first-child {
margin-top: 0;
}
h2 {
margin: 14px 0 5px 0 ;
font-size: 25px;
background-color: #ddd;
}
h3 {
margin: 9px 0 3px 0;
font-size: 21px;
}
h4 {
margin: 7px 0 2px 0;
font-size: 18px;
font-weight: bold;
}
h5 {
margin-top: 5px 0 1px 0;
font-size: 16px;
font-weight: bold;
}
h6 {
margin: 3px 0 1px 0;
font-size: 14px;
font-weight: bold;
}
/* Misc. elements */
p {
text-align: justify;
margin-top: 10px;
}
p:first-child {
margin-top: 0;
}
div.caption {
clear: both;
margin-bottom: 10px;
}
caption, div.caption > p {
background-color: #ddd;
padding: 3px;
text-align: center;
font-style: italic;
}
div.caption.center-float img {
margin: 0 auto;
}
div.caption.left-float img {
margin: 0;
}
div.caption.center-float {
text-align: center;
}
div.caption.center-float p {
display: inline-block;
}
tt, code, samp, pre, var {
font-family: Inconsolata, 'Dejavu Sans Mono', monospace;
}
pre {
margin-top: 10px;
white-space: pre-wrap;
word-wrap: break-word;
}
img {
border: none;
clear: both;
margin-bottom: 10px;
}
cite, quote {
border-bottom: 1px dashed yellow;
}
blockquote {
margin: 0 0 5px 20px;
font-size: 15px;
}
acronym, abbreviation {
border-bottom: 1px dashed green;
}
kbd {
background-color: #fff;
padding: 1px 2px;
}
dfn {
font-style: italic;
}
dfn {
font-style: italic;
}
ins {
text-decoration: underline;
}
del {
text-decoration: line-through;
}
hr {
margin: 5px 0;
}
/* Lists */
ul, ol {
margin-top: 5px;
list-style-position: inside;
}
ul > ul, ul > ol, ol > ul, ol > ol {
margin-left: 17px;
margin-bottom: 0;
padding-left: 5px;
}
ul {
list-style-type: disc;
}
ul > ul, ol > ul {
list-style-type: square;
}
ul > * > ul, ol > * > ul {
list-style-type: circle;
}
ul > * * > ul, ol > * * > ul {
list-style-type: disc; ! important
}
ol {
list-style-type: decimal;
}
ol > ol, ul > ol {
list-style-type: upper-alpha;
}
ol > * > ol, ul > * > ol {
list-style-type: lower-alpha;
}
ol > * * > ol, ul > * * > ol {
list-style-type: decimal; ! important
}
/* Definition lists */
dd {
margin-left: 20px;
}
dl > dl {
margin-left: 21px;
padding-left: 5px;
border-left: 4px solid #000;
}
/* Tables */
table {
margin: 5px auto;
border-collapse: collapse;
}
table, td, th {
border: 2px inset black;
}
td, th {
margin: 0 5px;
padding: 1px 3px;
}
thead, tfoot {
font-weight: bold;
}
/* Math */
.math {
position: relative;
top: 14px;
}
.block.math {
position: static;
top: 0;
margin: 10px auto 0 auto;
}
/* Formatting-related classes */
.strong {
font-weight: bold;
}
.emph {
font-style: italic;
}
.underline {
text-decoration: underline;
}
.center-align, .center-align > * {
text-align: center; ! important
}
.right-align, .right-align > * {
text-align: right; ! important
}
.left-align, .left-align > * {
text-align: left; ! important
}
.center-float {
margin-right: auto;
margin-left: auto;
}
.right-float {
float: right;
}
.left-float {
float: left;
}
div.right-float, img.right-float, video.right-float, audio.right-float {
margin-left: 10px;
}
div.left-float, img.left-float, video.left-float, audio.left-float {
margin-right: 10px;
}
.block {
display: block;
}
.inline {
display: inline;
}
.noclear, div.caption.noclear {
clear: none; ! important
}
.huge, .huge * {
font-size: 25px; ! important
}
.large, .large * {
font-size: 18px; ! important
}
.medium, .medium * {
font-size: 14px; ! important
}
.small, .small * {
font-size: 11px; ! important
}
.tiny, .tiny * {
font-size: 9px; ! important
}
/* Code highlighting */
.highlight {
padding: 2px 4px;
}
.highlighttable {
margin: 5px 0 5px 0;
}
.highlighttable pre {
margin-top: 0;
}
.highlighttable, .highlighttable .code {
border-width: 0;
}
.highlighttable .code {
width: 600px;
}
.linenos {
border-width: 0 1px 0 0;
border-style: solid;
border-size: black;
vertical-align: top;
}
/* Misc. classes */
.warning {
background-color: #ffa400;
font-weight: bold;
padding: 5px 5px 0 5px;
border: 1px outset black;
}
.note {
background-color: #c3cfcf;
font-weight: bold;
padding: 5px 5px 0 5px;
border: 1px outset black;
}
.notice {
background-color: yellow;
}
.notice p, .note p, .warning p {
margin-bottom: 5px;
}

View File

@ -20,14 +20,15 @@ if page.is_dynamic:
<meta name='keywords'
content='programming, hacking, nqpz, portfolio' />
<meta name='generator' content='http://metanohi.org/projects/mege/' />
<link rel='stylesheet' type='text/css' media='screen, tv'
<link rel='stylesheet' type='text/css' href='/static/general.css' />
<link rel='stylesheet' type='text/css' media='screen, tv, handheld'
href='/static/screen.css' />
<link rel='stylesheet' type='text/css' media='print'
href='/static/print.css' />
<!-- <link rel='stylesheet' type='text/css' media='handheld' -->
<!-- href='/static/handheld.css' /> -->
<link rel='stylesheet' type='text/css' media='tty'
href='/static/tty.css' />
<link rel='stylesheet' type='text/css' media='handheld'
href='/static/handheld.css' />
<link rel='stylesheet' type='text/css' media='print'
href='/static/print.css' />
<link href='/atom.xml' type='application/atom+xml' rel='alternate'
title='metanohi atom feed' />
<link rel='schema.DCTERMS' href='http://purl.org/dc/terms/' />
@ -89,7 +90,7 @@ for x in('projects', 'writings', 'about', 'sitemap'):
<!--@eval run_macros(page.metadata_html)@-->
<!--@exec
if page.is_dynamic:
print("<p><a href='{}' rel='nofollow'>View source</a></p>".format(page.sourcepath), end='')@-->
print("<p><a href='{}' rel='nofollow' class='viewsource'>View source</a></p>".format(page.sourcepath), end='')@-->
</div>
</div>
<div id='logo'>

View File

@ -0,0 +1,11 @@
#minilogo {
display: none;
}
#menu {
display: none;
}
.highlighttable .code {
width: 100%;
}

View File

@ -32,6 +32,7 @@ redirect {evolution,projects/evolution} http://projects.metanohi.name/evolution/
redirect {snake,projects/snake} http://projects.metanohi.name/snake/
redirect {words,projects/words} http://projects.metanohi.name/words/
redirect {cln,cli} projects/cln/
redirect nanonote projects/nanonote/
redirect writings/Na.html writings/na
redirect writings/digital-sikring.html writings/digital-sikring

View File

@ -39,6 +39,13 @@ If you take something from metanohi that is not under a public-domain-like
license, you are required to attribute Niels Serup and metanohi. When doing
that, write something like "Niels Serup, [[http://metanohi.name/][metanohi.name]]".
A few pages, like [[/projects/][this one]], have a lot of Python code for in-page evaluation
and execution. This might not be the most secure thing to allow, but since only
one person can change it, it is deemed safe enough. Any such nontrivial code is
licensed under the same license as [[/projects/mege/][mege]], i.e. AGPLv3+, unless otherwise
noted. This might seem like overkill in some situations, but with only one
license in use, simplicity is achieved.
** Source
If you wish to use [[/projects/mege/][mege]] for a website, you may wish to use metanohi as a
@ -59,6 +66,11 @@ Get the subsites:
metanohi was created in 2009 as a spinoff of earlier projects with equally
undefined purposes.
*Note:* While most of the content from the old metanohi has been ported to this
improved version, the modification times have not been saved. This is why old
projects from 2009 and 2010 appear to have been created in July or
August, 2011.
*** "Why the name?"
There are several reasons:

View File

@ -2,12 +2,189 @@
#&summary
Where all the prominent projects are listed.
#&
#+license: bysa
#+license: cc0
#&fullpage
#&toc
* Projects
<boxes go here>
These are my projects, new and old.
#++exec
#+BEGIN_SRC python3
top_projs = (
'desurveil',
'aeltei',
('roptoligs', 'roptoligs', 'RPG project with planned modules and games',
'http://roptoligs.metanohi.name/'),
'sadbipws',
('suum', 'SUUM', 'Webcomic drawn in the art style of <em>banal naivism</em>',
'http://suum.metanohi.name/'),
'alart',
'forbi',
'shadowloss',
'alp',
'electruth',
'kvigall',
'naghni',
'forestquest',
'dililatum',
'noncrawl',
'enigma',
'wordwork',
'simplechat',
('nohix', 'nohiX', 'Small web experiments, some of them useful', 'http://nohix.metanohi.name/'),
'movact',
'wontofor',
'totxt',
('natur', "Niels' Nature", 'Watch Niels as he spouts nonsense about nature', 'http://nature.metanohi.name/'),
('films', 'nohifilms', "Niels' films", 'http://films.metanohi.name/'),
)
other_projs = (
'nanonote',
('pdfsplit', 'A small Python script to split PDF files on a page-basis',
'http://projects.metanohi.name/misc/pdfsplit.tar.gz'),
('poemgen', 'A poem generator using Identi.ca blog posts as its source',
'http://projects.metanohi.name/poemgen/'),
'dotbox',
'vit',
'qvikconfig',
'htmlentitiesdecode',
('gadon', 'Creates scary cirle animations reminiscent of heartbeats',
'http://projects.metanohi.name/misc/gadon.tgz'),
('colchs', 'A simple GTK color chooser',
'http://projects.metanohi.name/misc/colchs.tgz'),
('wikiaq', 'A quiz system using Wikipedia articles',
'http://projects.metanohi.name/misc/wikiaq-0.1.tar.gz'),
('BiBBoB 0.1.1', "A simple sound wave generator (older versions: \
<a href='http://projects.metanohi.name/misc/bibbob-0.1.tar.gz'>BiBBoB 0.1</a>)",
'http://projects.metanohi.name/misc/bibbob-0.1.1.tar.gz'),
('data2wav', 'Converts all data to sound (and back again)',
'http://projects.metanohi.name/misc/data2wav.tgz'),
('pitivi-smil', "A workaround to make PiTiVi XPTV files get rendered using \
Kino. No support for PiTiVi's more advanced features.",
'http://projects.metanohi.name/misc/pitivi-smil.tgz'),
('googolplex', 'A program that attempts to print one googolplex. \
If saved to a file, this requires 1 googol + 1 bytes.',
'http://projects.metanohi.name/misc/googolplex.c'),
('Japanese web apps', 'Javascript/CSS experiments with a theme',
'http://projects.metanohi.name/jap/'),
('data2png', 'Save data as a png file, and restore the data from the png file.',
'http://projects.metanohi.name/misc/data2png.tar.gz'),
('stanimate', 'A bash script to aid in the creation of stop motion films.',
'http://projects.metanohi.name/misc/stanimate.gz'),
('mssrnm (mass rename)', 'A bash script to rename a bunch of files into files \
"001.jpg", "002.jpg", "003.jpg", etc.',
'http://projects.metanohi.name/misc/mmsrnm.gz'),
)
old_top_projs = (
('words', 'words', 'Words and sentences. Not a blog.', 'http://words.metanohi.name/'),
('pictures', 'Pictures', 'Pictures uploaded by me', 'http://pictures.metanohi.name/'),
('eonaton', 'Eon Aton', 'An underdeveloped RPG-style JS system and a story', 'http://projects.metanohi.name/eonaton/'),
'zita',
'cln',
('algo', 'Algo', 'A JavaScript window manager', 'http://projects.metanohi.name/algo/'),
'an5w',
('canvas', 'Experimenting with canvas', 'Old HTML canvas element experiments', 'http://projects.metanohi.name/canvas/'),
('bsq', 'Brainy Stickman Quiz', 'Sidescroller/quiz based on the HTML canvas element', 'http://projects.metanohi.name/bsq/'),
('snake', 'JavaScript Snake', 'Arrow keys to move, PageUp and PageDown to adjust speed.', 'http://projects.metanohi.name/snake/'),
('gt3000', 'GT 3000', 'Retro JS mini racing game.', 'http://projects.metanohi.name/gt3000/'),
('sq', "Satan's Quest", 'Retro RPG-style JS minigame. You are Gabruel.', 'http://projects.metanohi.name/sq/'),
('evolution', 'Evolution', 'Notice the intelligence.', 'http://projects.metanohi.name/evolution/'),
)
other_old_projs = (
'bito',
'nalgh',
('Graphical web experiments',
"Some of them'll work, while some of them might crash your browser.",
'http://projects.metanohi.name/x/'),
('cheatbibtex', '''\
Provides an alternative way of dealing with BiBTeX bibliographies. Use BiBLaTeX
instead of cheatbibtex (cheatbibtex isn't that great, while BiBLaTeX is quite
the LaTeX package).''', 'http://projects.metanohi.name/misc/cheatbibtex-0.1.tar.gz'),
('dsktp', 'A JS wm like Algo',
'http://projects.metanohi.name/dsktp/'),
('webCLI', 'A CLI lookalike in JavaScript with XML',
'http://projects.metanohi.name/webcli/'),
('lapyrint', 'A stupid maze solver. Includes example labyrinths.',
'http://projects.metanohi.name/misc/lapyrint.tar.gz'),
('problist', "Probalistic list generator (isn't as intelligent as it sounds).",
'http://projects.metanohi.name/misc/problist.tar.gz'),
('The Life of a Snowman', "Life can be cruel towards snowmen. This is proof.",
'http://projects.metanohi.name/snowman/'),
('Katten Pedro (Pedro the Cat)', "A comic I drew during a vacation in Mallorca.",
'http://projects.metanohi.name/pedro/'),
('Misc.', 'Very old stuff.',
'http://projects.metanohi.name/misc/'),
)
#################################
boxtemplate = '''\
<li>
<a href='{url}' style='background-image: url(img/{name}.png);'>
{title}
</a>
<dfn>{description}</dfn>
</li>
'''
listtemplate = '''\
<dt><a href='{url}'>{title}</a></dt>
<dd>{description}</dd>
'''
def getparts(name, no_name=False):
if isinstance(name, tuple):
if no_name:
title, desc, url = name
else:
name, title, desc, url = name
else:
orgpath = misc.get_org_path(os.path.join(page.pathdir, name))
url = './{name}'.format(name=name)
if orgpath.endswith('index.org'):
url += '/'
a = htmlgen.org_to_abstract(orgpath, isfile=True, only_metadata=True)
title, desc = a.title, a.summary
if no_name:
return title, desc, url
else:
return name, title, desc, url
def boxprojs(projs):
print("<ul class='projectboxes'>")
for name in projs:
name, title, desc, url = getparts(name)
print(boxtemplate.format(name=name, url=url, title=title, description=desc))
print('</ul>')
def listprojs(projs):
print("<dl>")
for name in projs:
title, desc, url = getparts(name, True)
print(listtemplate.format(url=url, title=title, description=desc))
print('</dl>')
#+END_SRC
** Relatively new
<@exec boxprojs(top_projs) @>
*** Others
<@exec listprojs(other_projs) @>
#+mark: old
** Old
<@exec boxprojs(old_top_projs) @>
*** Others
<@exec listprojs(other_old_projs) @>

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

View File

@ -0,0 +1,16 @@
#+title: My NanoNote
#&summary
I have a NanoNote.
#&
#+license: bysa
* My NanoNote
#&img;url=glorious-nanonote.jpg, alt=Glorious NanoNote, center
I own a [[http://sharism.cc/][NanoNote]]. I think it's
cool (though I haven't found much use for it yet). The default NanoNote
distro comes with an [[http://openwrt.org/][OpenWRT]]-based. It's also possible to run Debian on it
(with only 32 MiB RAM..), but it's slow.
(Originally, this page was meant to have a purpose.)

290
site/writings/na.org Normal file
View File

@ -0,0 +1,290 @@
#+title: Na
#&summary
A new spoken and written language in development.
#&
#+license: bysa
#&toc
* Na
** Introduction
Na is a probalistic language. The more details you use when explaining an
event, the more probable it is that the recipient understands you. This is not
very different from typical languages ("a blue building" is more precise than
"a building"), but the new thing in Na is that this guesswork is everywhere.
** Alphabet
Optimally, Na should have its own alphabet. To aid in its spreading, a subset
of the Latin alphabet has been chosen instead:
: . A E I O B D F G K L N S T V
All of these letters are pronounced as "short sounds", i.e. "A" is not
pronounced as "AAY", but just "AE". This is the same for all wovels. There are
two types of correct syllables: those of the form <consonant><wovel> and those
of the form <wovel>: "LO" is legal, "LOO", "LLA", "LOI", "AV", and "AEV" are
not. Aside from letters, only the period (".") character and space between
characters are used. No commas, no colons, no semicolons, nothing else. Also,
there is no difference between uppercase and lowercase letters. Sentences are
read left-to-right (numbers are written right-to-left; more about that later).
With only 4 wovels and 10 consonants pronouncations can be very varied and
still correct. According to the rules laid out above there are 40 different
single-syllable words, 40^2 = 1,600 two-syllable words, 40^3 = 64,000
three-syllable words, 40^4 = 2,560,000 four-syllable words, etc. At ten
syllables (an extreme case) there are 10,485,760,000,000,000 different
10-syllable words and a total number of 10,754,625,641,025,640
any-number-of-syllables-less-or-equal-to-10 words.
*** TODO IPA/SAMPA
The author of this document is not very familiar with IPA, SAMPA, or any other
phonetic alphabet.
** Goals
Na wants to be a useful language somewhat usable by people. Na has been
designed to be fairly global, but since the creator of Na is fluent only in
Germanic languages (Danish and English), and because the Latin alphabet is
used, Na is non-global. Nevertheless, it /wants/ to be global.
** Basics
Na has no nouns, no verbs, no adjectives, no adverbiums, no pronouns, etc. In
Na, the core of everything is a word more or less equivalent to the English
word "existence". This word is *BA*. All other words are based on this base
word (in object oriented programming language terminology, this is equivalent
to subclassing classes).
The groups at the first levels of heritance are:
+ Existence :: BA
+ Number :: BE
+ Real number :: BEBA
+ Integer :: BEBE
+ Fraction :: BEBI
+ Imaginary number :: BEBO
+ Complex number :: BEDA
+ Symbol :: BI
+ Letter :: BIBA
+ Shape :: BO
+ Relation :: DA
+ Identity :: DE
+ Absolute combiner :: DO
+ Identifier :: FA
+ Relative combiner :: FE
TODO: Improve on groups.
These have been chosen not because of perfection, but because Na was designed
for human beings (who are not perfect). Nevertheless, these groups should
suffice for the time being.
*Note:* These groups are few on purpose. Many words fit into several
groups. Groups are only good for basic things; more complex meanings do not
have to be placed in any group.
Na uses a combination of numbers, identifiers and further subclassing to
achieve (some) usability. In Na, what is written as one sentence in
e.g. English, can often become more than one sentence. To make a statement in
Na, one splits one's sentence into Na sentences, the first ones consisting of
definitions and assignments (named variables), and the final one consisting of
everything put together in the right order. Often, the order does not matter,
and the purpose of the final sentence is really just to point out what
definitions you have chosen to use, and that you are done.
For example, to write "I see a table." in Na, you first extract the objects (in
Na, everything is an object) from the sentence. This gives us:
+ I, the subject
+ see, the verb
+ a table, the object
In Na, this is simplified further into:
+ I
+ to see
+ table, 1
The only two possible sense-making combinations using all the words would be to
say "I see a table" or "The table sees me". To stress that the first version is
wanted, we first combine "I" and "to see", which we then combine with a
definition of "table, 1". Finally, we throw the definitions together, so that
people will understand that the sentence is over.
To specify "I", we use one of the members from the identity (*DE*) group. "to
see" is also an abstraction, because the "I" can see in different ways (if it's
a camera, it doesn't use a human brain to see, for example). Other,
non-generalized terms are also available, but they are not part of the
abstraction group.
To create a variable to hold "table, 1", you combine the number 1 with a
generic table defined using the shape (*BO*) group.
A sentence where you combine words into a new word has this structure:
: <word 1> <word 2>[ <word 3>[...]] DO <new word>.
This is an absolute combination. It is also possible to make relative
combinations where word mixes are not saved in new words:
: <word 1> <word 2>[...] FE <word(s)>[ ...].
In these relative cases, the words before an FE mark are evaluated when FE is
reached. If FE is left out from such sentences, everything will be evaluated at
once. Programmers might find it helpful to think of FE as a stack resetter.
When you do not use the *DO* or *FE* combiner, you state something:
: <word 1>[ <word 2>[...]].
In real languages, this is the equivalent of actually expressing something ---
combines do not express anything, they merely aid in preparing for later
expressions.
** Example 1: I see a table
One can write "I see a table." in two ways: the absolute way with *DO* or the
relative way with *FE*.
Words for "I", "to see", and "table" have not yet been made, but we assume they
are BIGUHA, NULASE, and GAVOTI, respectively. The integer 1 is FA BEBE B.
*** Absolute way
+ Step 1 :: Combine "I" and "to see" into a sentence using combinations from
different groups. Give it a name, e.g. VAVO.
+ Step 2 :: Combine the number 1 from the integer (*BEBE*) group with the table
from the shape group. Give it a name, e.g. GALO.
+ Step 3 :: a) Write VAVO GALO, or b) combine VAVO and GALO into e.g. VALO
(could be any word) and go to step four.
+ Step 4 :: Write VALO.
So:
: biguha nulase do vavo. gavoti fa bebe b do galo. vavo galo do valo. valo.
or, shorter:
: biguha nulase do vavo. gavoti fa bebe b do galo. vavo galo.
The advantage of the first variation is that VALO can be reused again and again
until people have forgotten what its temporary meaning is. For example, if you
are telling a story where the main character often sees a table, you could do
this:
: valo. valo. valo. valo. valo.
It is not necessary to define new combinations all the time. Na comes with a
small built-in set of combinations which is required learning for all Na
speakers. These built-in definitions should be used whenever possible,
eventually in subclassed or changed forms, to make it easier to write --- and
especially speak --- Na.
*** Relative way
The relative way is a bit simpler, shorter and easier to say:
: biguha nulase fa bebe b fe gavoti.
In fact, this relative sentence can be made into an absolute sentence:
: biguha nulase fa bebe b fe gavoti do valo. valo.
*** Notes
In speech the relative way is much more useful than the absolute one. Both are
useful, though.
** Identifiers
Some of the groups can be used as identifiers. When an identifier is used one
or more arguments are expected. The integer identifier requires one argument
(the number), the real number identifier requires two arguments (before and
after the point), and the letter identifier requires one argument. To use a
group as an identifier, prefix it with *FA*.
** Numbers
Numbers in Na are duodecimal, i.e. base 12. The alphabet is used as numbers. A
is used for zero, the consonants range from 1 to 10, and O is used for 11. When
specifying a number, it should be prefixed with *FA BEBA* (real numbers) or any
other name from a subclassed number identifier, and it should be written with
the least important bit first (LSB). To pronounce a number, speak the letters
of the number one by one.
Examples:
+ FA BEBE GB = 16
+ FA BEBE D = 2
+ FA BEBA D AT = 2.108
TODO: Improve this strange system
** Example 2: We transported the ship into another dimension
This sentence is a bit tricky. We start by splitting the sentence into
meaningful parts:
+ we transport (in the past)
+ <something specific> ship
+ into
+ another dimension
Again, base words have not been defined yet, so we assume that "we (generic)"
(we do not know if it is an exclusive or inclusive we) is GELO, "transport" is
LOLOTI, the past is BATATO, something specific is SESE, "ship" is MOLOTE,
"into" is NIKO, "another" is KOBO, and "dimension" is TILE.
It appears that it is actually quite easy to create a relative sentence now:
: batato gelo loloti fe sese molote niko fe fe tile kobo.
Notice the two FE in the end. Without the second FE, the sentence could also
mean "We transported another dimension into the ship.". It would not be wrong
to omit the FE, but it would create an ambigious sentence (which can be
useful).
Remember that the following sentence means excactly the same as the previous:
: loloti batato gelo fe niko molote sese fe fe kobo tile.
Word order is only important in the case of identifiers and their arguments.
** Example 3: 33+2.4i
33+2.4i is a complex number. The x+yi notation doesn't fit well in Na. Instead,
the *FA BEDA* identifier is used (33+2.4i = 33.0+2.4i):
: fa beda td a d g.
Again, this is not perfect.
** TODO Foreign words
Foreign words present a problem in Na.
** TODO Built-ins
~1000 words needed to begin with.
** Miscellaneous
Since there are only 16 characters (14 letters, the period, and space), one
character can be stored in only 4 bits, and 2 characters can be stored in one
byte.
Because of the infinitely many relatively different ways to say the same thing,
texts and speech can be varied a great deal. This could be quite useful in
e.g. poems.