diff options
| author | Christian Weiske <cweiske@cweiske.de> | 2012-03-25 21:08:29 +0200 |
|---|---|---|
| committer | Christian Weiske <cweiske@cweiske.de> | 2012-03-25 21:08:29 +0200 |
| commit | 6d0777840e50ce98f3d96629b4e92bbdccd3001c (patch) | |
| tree | 161a753bf54b4fec0c4357b16dc68ff838e20383 | |
| parent | 568bf6f9a487a3dc33ce52e45cd31cfbea2cb79e (diff) | |
| download | phorkie-6d0777840e50ce98f3d96629b4e92bbdccd3001c.tar.gz phorkie-6d0777840e50ce98f3d96629b4e92bbdccd3001c.zip | |
first code that allows you to create pastes and view them
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | README.rst | 37 | ||||
| -rw-r--r-- | data/config.default.php | 6 | ||||
| -rw-r--r-- | data/templates/base.htm | 17 | ||||
| -rw-r--r-- | data/templates/display.htm | 16 | ||||
| -rw-r--r-- | data/templates/index.htm | 25 | ||||
| -rw-r--r-- | www/.htaccess | 5 | ||||
| -rw-r--r-- | www/display.php | 42 | ||||
| -rw-r--r-- | www/index.php | 52 | ||||
| -rw-r--r-- | www/www-header.php | 36 |
10 files changed, 238 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f82ddfd --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +README.html +repos @@ -0,0 +1,37 @@ +************************************ +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`` diff --git a/data/config.default.php b/data/config.default.php index e69de29..ec68622 100644 --- a/data/config.default.php +++ b/data/config.default.php @@ -0,0 +1,6 @@ +<?php +$GLOBALS['phorkie']['cfg'] = array( + 'repos' => __DIR__ . '/../repos/', + 'tpl' => __DIR__ . '/templates/', +); +?>
\ No newline at end of file diff --git a/data/templates/base.htm b/data/templates/base.htm new file mode 100644 index 0000000..f406f00 --- /dev/null +++ b/data/templates/base.htm @@ -0,0 +1,17 @@ +<!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 diff --git a/data/templates/display.htm b/data/templates/display.htm new file mode 100644 index 0000000..1f33b61 --- /dev/null +++ b/data/templates/display.htm @@ -0,0 +1,16 @@ +{% 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 %} diff --git a/data/templates/index.htm b/data/templates/index.htm new file mode 100644 index 0000000..eea509b --- /dev/null +++ b/data/templates/index.htm @@ -0,0 +1,25 @@ + +<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 diff --git a/www/.htaccess b/www/.htaccess index e69de29..f41e1bf 100644 --- a/www/.htaccess +++ b/www/.htaccess @@ -0,0 +1,5 @@ +RewriteEngine On +RewriteBase / +#RewriteCond %{REQUEST_FILENAME} -f + +RewriteRule ^([0-9]+)$ /display.php?id=$1 diff --git a/www/display.php b/www/display.php new file mode 100644 index 0000000..5bd06bb --- /dev/null +++ b/www/display.php @@ -0,0 +1,42 @@ +<?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' + ) + ) +); +?> diff --git a/www/index.php b/www/index.php index e69de29..5276bf2 100644 --- a/www/index.php +++ b/www/index.php @@ -0,0 +1,52 @@ +<?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 diff --git a/www/www-header.php b/www/www-header.php new file mode 100644 index 0000000..28607da --- /dev/null +++ b/www/www-header.php @@ -0,0 +1,36 @@ +<?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 |
