aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Weiske <cweiske@cweiske.de>2012-03-25 21:08:29 +0200
committerChristian Weiske <cweiske@cweiske.de>2012-03-25 21:08:29 +0200
commit6d0777840e50ce98f3d96629b4e92bbdccd3001c (patch)
tree161a753bf54b4fec0c4357b16dc68ff838e20383
parent568bf6f9a487a3dc33ce52e45cd31cfbea2cb79e (diff)
downloadphorkie-6d0777840e50ce98f3d96629b4e92bbdccd3001c.tar.gz
phorkie-6d0777840e50ce98f3d96629b4e92bbdccd3001c.zip
first code that allows you to create pastes and view them
-rw-r--r--.gitignore2
-rw-r--r--README.rst37
-rw-r--r--data/config.default.php6
-rw-r--r--data/templates/base.htm17
-rw-r--r--data/templates/display.htm16
-rw-r--r--data/templates/index.htm25
-rw-r--r--www/.htaccess5
-rw-r--r--www/display.php42
-rw-r--r--www/index.php52
-rw-r--r--www/www-header.php36
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
diff --git a/README.rst b/README.rst
index e69de29..ea8a940 100644
--- a/README.rst
+++ b/README.rst
@@ -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