--- /dev/null
+README.html
+repos
+************************************
+Phorkie - PHP and Git based pastebin
+************************************
+
+URLs
+====
+
+``/``
+ Index page. Shows form for new paste
+``/[0-9]+``
+ Display page for paste
+``/[0-9]/edit``
+ Edit the paste
+``/[0-9]+/raw/(.+)``
+ Display raw file contents
+``/[0-9]/delete``
+ Delete the paste
+``/search(/.+)?``
+ Search for term
+``/list(/[0-9])?``
+ List all pastes
+
+
+Internal directory layout
+=========================
+::
+
+ repos/
+ 1/ - git repository for paste #1
+ .git/
+ description - Description for the repository
+ 2/ - git repository for paste #2
+
+
+Search
+======
+Use ``ack-grep``
+<?php
+$GLOBALS['phorkie']['cfg'] = array(
+ 'repos' => __DIR__ . '/../repos/',
+ 'tpl' => __DIR__ . '/templates/',
+);
+?>
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html>
+<html>
+ <head>
+ <!--<link rel="stylesheet" href="phorkie.css" />-->
+ <title>{% block title %}{% endblock %} - Phorkie</title>
+ </head>
+ <body>
+ <nav>
+ <ul>
+ <a href="/">New paste</a>
+ <a href="/list">List all</a>
+ <a href="/search">Search</a>
+ </ul>
+ </nav>
+ <article>{% block content %}{% endblock %}</article>
+ </body>
+</html>
\ No newline at end of file
--- /dev/null
+{% extends "base.htm" %}
+{% block title %}{{description}}{% endblock %}
+
+{% block content %}
+<h1>{{description}}</h1>
+<p><a href="{{links.edit}}">edit</a></p>
+{% for file in files %}
+<div>
+ <h2>{{file.filename}}</h2>
+ <p>
+ <a href="{{file.raw}}">raw</a>
+ </p>
+ <pre>{{file.content}}</pre>
+</div>
+{% endfor %}
+{% endblock %}
--- /dev/null
+
+<form method="post" action="/">
+ <p>
+ <label for="description">Description</label>
+ <input type="text" name="description" id="description" value="{{description}}"/>
+ </p>
+ <p>
+ <label for="filename_1">Filename</label>
+ <input type="text" name="file[1][name]" id="filename_1" value="{{ file[1]['name'] }}"/>
+ </p>
+ <p>
+ <label for="type_1">Type</label>
+ <select name="file[1][type]" id="type_1">
+ <option value="css">CSS</option>
+ <option value="php">PHP</option>
+ <option value="xml">XML</option>
+ </select>
+ </p>
+ <p>
+ <textarea name="file[1][content]" id="content_1">{{ file[1]['content'] }}</textarea>
+ </p>
+ <p>
+ <input type="submit" value="Go"/>
+ </p>
+</form>
\ No newline at end of file
+RewriteEngine On
+RewriteBase /
+#RewriteCond %{REQUEST_FILENAME} -f
+
+RewriteRule ^([0-9]+)$ /display.php?id=$1
--- /dev/null
+<?php
+/**
+ * Display paste contents
+ *
+ */
+require_once 'www-header.php';
+
+if (!isset($_GET['id'])) {
+ errout(400, 'Paste ID missing');
+}
+if (!is_numeric($_GET['id'])) {
+ errout(400, 'Paste ID not numeric');
+}
+$id = (int)$_GET['id'];
+$repoDir = $GLOBALS['phorkie']['cfg']['repos'] . '/' . $id;
+if (!is_dir($repoDir)) {
+ errout(404, 'Paste not found');
+}
+
+$files = glob($repoDir . '/*');
+$tplFiles = array();
+foreach ($files as $file) {
+ $tplFile = array();
+ $tplFile['filename'] = basename($file);
+ $tplFile['type'] = get_type_from_file($file);
+ //FIXME: highlight
+ $tplFile['content'] = file_get_contents($file);
+ $tplFile['raw'] = '/' . $id . '/raw/' . $tplFile['filename'];
+ $tplFiles[] = $tplFile;
+}
+
+render(
+ 'display',
+ array(
+ 'description' => file_get_contents($repoDir . '/.git/description'),
+ 'files' => $tplFiles,
+ 'links' => array(
+ 'edit' => '/' . $id . '/edit'
+ )
+ )
+);
+?>
+<?php
+/**
+ * Show paste creation form
+ *
+ * Elements:
+ * - description
+ * - file name (default: default.php)
+ * - content
+ *
+ * Creates and redirects to display page
+ */
+require_once 'www-header.php';
+
+if (isset($_POST['file'])) {
+ //save
+ $repoDir = $GLOBALS['phorkie']['cfg']['repos'];
+ $n = count(glob($repoDir . '/*', GLOB_ONLYDIR));
+ $dir = $repoDir . '/' . $n . '/';
+ mkdir($dir, 0777);//FIXME
+ $vc = new VersionControl_Git($dir);
+ $vc->initRepository();
+ file_put_contents($dir . '.git/description', $_POST['description']);
+
+ foreach ($_POST['file'] as $num => $arFile) {
+ if ($arFile['name'] != '') {
+ $fname = $arFile['name'];
+ } else {
+ $fname = 'phork' . $num . '.' . $arFile['type'];
+ }
+ $fpath = $dir . $fname;
+ file_put_contents($fpath, $arFile['content']);
+ //fixme: let the class do that when it is able to
+ $command = $vc->getCommand('add')
+ ->addArgument($fname)
+ ->execute();
+ }
+ $command = $vc->getCommand('commit')
+ ->setOption('message', 'initial paste')
+ ->execute();
+ //redirect to phork
+ redirect($n);
+}
+
+$phork = array(
+ '1' => array(
+ 'filename' => '',
+ 'content' => '',
+ 'type' => ''
+ )
+);
+render('index', array('file' => $phork, 'description' => ''));
+?>
\ No newline at end of file
--- /dev/null
+<?php
+require_once __DIR__ . '/../data/config.default.php';
+require_once 'VersionControl/Git.php';
+require_once 'Twig/Autoloader.php';
+Twig_Autoloader::register();
+
+$loader = new Twig_Loader_Filesystem($GLOBALS['phorkie']['cfg']['tpl']);
+$twig = new Twig_Environment(
+ $loader,
+ array(
+ //'cache' => '/path/to/compilation_cache',
+ 'debug' => true
+ )
+);
+
+function render($tplname, $vars)
+{
+ $template = $GLOBALS['twig']->loadTemplate($tplname . '.htm');
+ echo $template->render($vars);
+}
+function redirect($target)
+{
+ header('Location: /' . $target);
+ exit();
+}
+function errout($statusCode, $message)
+{
+ header('HTTP/1.0 ' . $statusCode);
+ echo $message;
+ exit();
+}
+function get_type_from_file($file)
+{
+ return substr($file, strrpos($file, '.') + 1);
+}
+?>
\ No newline at end of file