apotiki 0.5.1 → 0.5.2
raw patch · 8 files changed
+210/−222 lines, 8 files
Files
- System/Apotiki/Templates.hs +197/−0
- apotiki.cabal +1/−2
- apotiki.hs +12/−1
- static/apotiki.js +0/−31
- static/details.html +0/−60
- static/index.html +0/−38
- static/listing.html +0/−32
- static/post.html +0/−58
+ System/Apotiki/Templates.hs view
@@ -0,0 +1,197 @@+module System.Apotiki.Templates where+import Data.List (unlines)++--+-- I am NOT proud of this heredoc implementation.+--++detailsHtml = unlines [ "<div class=\"panel panel-default\">",+ " <div class=\"panel-heading\">",+ " Package: {{repo[arch][name]['Package']}}",+ " </div>",+ " <div class=\"panel-body\">",+ " <div class=\"row\">",+ " <div class=\"col-md-2\"><strong>Package</strong></div>",+ " <div class=\"col-md-10\">{{repo[arch][name]['Package']}}</div>",+ " </div>",+ " <div class=\"row\">",+ " <div class=\"col-md-2\"><strong>Version</strong></div>",+ " <div class=\"col-md-10\">{{repo[arch][name]['Version']}}</div>",+ " </div>",+ " <div class=\"row\">",+ " <div class=\"col-md-2\"><strong>Architecture</strong></div>",+ " <div class=\"col-md-10\">{{repo[arch][name]['Architecture']}}</div>",+ " </div>",+ " <div class=\"row\">",+ " <div class=\"col-md-2\"><strong>Maintainer</strong></div>",+ " <div class=\"col-md-10\">{{repo[arch][name]['Maintainer']}}</div>",+ " </div>",+ " <div class=\"row\">",+ " <div class=\"col-md-2\"><strong>License</strong></div>",+ " <div class=\"col-md-10\">{{repo[arch][name]['License']}}</div>",+ " </div>",+ " <div class=\"row\">",+ " <div class=\"col-md-2\"><strong>Installed Size</strong></div>",+ " <div class=\"col-md-10\">{{repo[arch][name]['Installed-Size']}}</div>",+ " </div>",+ " <div class=\"row\">",+ " <div class=\"col-md-2\"><strong>Priority</strong></div>",+ " <div class=\"col-md-10\">{{repo[arch][name]['Priority']}}</div>",+ " </div>",+ " <div class=\"row\">",+ " <div class=\"col-md-2\"><strong>Depends</strong></div>",+ " <div class=\"col-md-10\">{{repo[arch][name]['Depends']}}</div>",+ " </div>",+ " <div class=\"row\">",+ " <div class=\"col-md-2\"><strong>Homepage</strong></div>",+ " <div class=\"col-md-10\"><a href=\"{{repo[arch][name]['Homepage']}}\">{{repo[arch][name]['Homepage']}}</a></div>",+ " </div>",+ " <div class=\"row\">",+ " <div class=\"col-md-2\"><strong>Vendor</strong></div>",+ " <div class=\"col-md-10\">{{repo[arch][name]['Vendor']}}</div>",+ " </div>",+ " <div class=\"row\">",+ " <div class=\"col-md-2\"><strong>Section</strong></div>",+ " <div class=\"col-md-10\">{{repo[arch][name]['Section']}}</div>",+ " </div>",+ " <div class=\"row\">",+ " <div class=\"col-md-2\"><strong>Description</strong></div>",+ " <div class=\"col-md-10\">",+ " <pre ng-bind=\"repo[arch][name]['Description']\"></pre>",+ " </div>",+ " </div>",+ " </div>",+ "</div>" ]++indexHtml = unlines [ "<!doctype html>",+ "<html lang=\"en\">",+ "",+ " <head>",+ " <title>apotiki debian repository</title>",+ " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">",+ " <link href=\"//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css\" rel=\"stylesheet\">",+ " <script src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.2.8/angular.min.js\"></script>",+ " <script src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.2.8/angular-route.js\"></script>",+ " <script src=\"/apotiki.js\"></script>",+ " </head>",+ "",+ " <body ng-app=\"repo\">",+ " <div class=\"navbar navbar-default\" role=\"navigation\">",+ " <div class=\"container\">",+ " <div class=\"navbar-header\">",+ " <a class=\"navbar-brand\" href=\"#\">apotiki</a>",+ " </div>",+ " <div class=\"navbar-collapse collapse\">",+ " <ul class=\"nav navbar-nav\">",+ " <li><a href=\"#list\">Listing</a></li>",+ " <li><a href=\"/post.html\">Submit</a></li>",+ " </ul>",+ " </div>",+ " </div>",+ " </div>",+ " ",+ " <div class=\"container\">",+ " <div class=\"row\">",+ " <div class=\"col-lg-8 col-lg-offset-2\">",+ " <ng-view></ng-view>",+ " </div>",+ " </div>",+ " </div>",+ " ",+ " </body>",+ " ",+ "</html>" ]++postHtml = unlines [ "<!doctype html>",+ "<html lang=\"en\">",+ " <head>",+ " <title>apotiki debian repository</title>",+ " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">",+ " <link href=\"//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css\" rel=\"stylesheet\">",+ " </head>",+ " <body ng-app=\"repo\">",+ " <div class=\"navbar navbar-default\" role=\"navigation\">",+ " <div class=\"container\">",+ " <div class=\"navbar-header\">",+ " <a class=\"navbar-brand\" href=\"#\">apotiki</a>",+ " </div>",+ " <div class=\"navbar-collapse collapse\">",+ " <ul class=\"nav navbar-nav\">",+ " <li><a href=\"/index.html#list\">Listing</a></li>",+ " <li><a href=\"/post.html\">Submit</a></li>",+ " </ul>",+ " </div>",+ " </div>",+ " </div>",+ " <div class=\"container\">",+ " <div class=\"row\">",+ " <div class=\"col-lg-8 col-lg-offset-2\">",+ "<div class=\"panel panel-default\">",+ " <div class=\"panel-heading\">",+ " <h4>Package</h4>",+ " </div>",+ " <div class=\"panel-body\">",+ " <form method=\"POST\" action=\"/repo\" enctype=\"multipart/form-data\" role=\"form\">",+ " <div class=\"form-group\">",+ " <label>Choose package</label>",+ " <input type=\"file\" name=\"file\" id=\"file\">",+ " <p class=\"help-block\">",+ " Package file will overwrite any previous versions.",+ " </p>",+ " </div>",+ " <button type=\"submit\" class=\"btn btn-default\">Submit</button>",+ " </form>",+ " </div>",+ "</div>",+ " </div>",+ " </div>",+ " </div>",+ " </body>",+ "</html>"]++listingHtml = unlines [ "<div class=\"panel panel-default\">",+ " ",+ " <div class=\"panel-heading\">",+ " <div class=\"row\">",+ " <div class=\"col-sm-2\">",+ " <h4>Package listing</h4>",+ " </div>",+ " <div class=\"col-sm-4 col-sm-offset-6\">",+ " <form class=\"form-inline\">",+ " <input type=\"search\" ng-model=\"searchterm\" class=\"form-control\">",+ " </form>",+ " </div>",+ " </div>",+ " </div>",+ " ",+ " <div class=\"panel-body\">",+ " <table class=\"table table-striped\">",+ " <thead>",+ " <th>Package</th>",+ " <th>Version</th>",+ " <th>Architecture</th>",+ " </thead>",+ " <tbody>",+ " <tr ng-repeat=\"pkg in repolist | filter:searchterm\">",+ " <td><a href=\"#repo/{{pkg['Architecture']}}/{{pkg['Package']}}\">{{pkg['Package']}}</a></td>",+ " <td>{{pkg['Version']}}</td>",+ " <td>{{pkg['Architecture']}}</td>",+ " </tr>",+ " </tbody>",+ " </table>",+ " </div>",+ "</div>" ]++jsApp = unlines [ "var app = angular.module('repo', ['ngRoute']);",+ "app.controller('Apotiki', function($scope, $routeParams, $location, $http) {",+ "$scope.repolist = []; $scope.repo = {};",+ "$scope.refresh = function(){$http.get('/repo').success(function(data){$scope.repo=data;for(var k in data){for (var subk in data[k]){$scope.repolist.push(data[k][subk]);}}});};",+ "if ($routeParams.name) { $scope.name = $routeParams.name; }",+ "if ($routeParams.arch) { $scope.arch = $routeParams.arch; }",+ "$scope.refresh();});",+ "app.config(function($routeProvider) {",+ " $routeProvider",+ " .when('/repo', {templateUrl: 'listing.html', controller: 'Apotiki'})",+ " .when('/repo/:arch/:name', {templateUrl: 'details.html', controller: 'Apotiki'})",+ " .when('/post', {templateUrl: 'post.html'})",+ " .otherwise({redirectTo: '/repo'});});" ]
apotiki.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: apotiki-version: 0.5.1+version: 0.5.2 synopsis: a faster debian repository description: apotiki generates debian repositories fast. its goal is@@ -32,7 +32,6 @@ extra-source-files: README.md System/Apotiki/Debian/*.hs System/Apotiki/*.hs- static/*.js static/*.html library exposed-modules: System.Apotiki.Ar
apotiki.hs view
@@ -4,6 +4,7 @@ import System.Apotiki.Debian.Package import System.Apotiki.Debian.Release import System.Apotiki.Config+import System.Apotiki.Templates import Data.Map (keys) import System.Environment import System.Directory@@ -22,6 +23,7 @@ import System.IO.Error (isDoesNotExistError) import Control.Monad.IO.Class (liftIO) import qualified Data.ByteString as B+import qualified Data.Text.Lazy as T import Network.Wai.Middleware.Static @@ -49,7 +51,16 @@ runCommand config ("web":_) = do setupRepo config scotty 8000 $ do- middleware $ staticPolicy (noDots >-> addBase "static")+ get "/apotiki.js" $ do+ html $ T.pack jsApp+ get "/index.html" $ do+ html $ T.pack indexHtml+ get "/listing.html" $ do+ html $ T.pack listingHtml+ get "/details.html" $ do+ html $ T.pack detailsHtml+ get "/post.html" $ do+ html $ T.pack postHtml get "/" $ do redirect "/index.html" get "/repo" $ do
− static/apotiki.js
@@ -1,31 +0,0 @@-var app = angular.module('repo', ['ngRoute']);--app.controller('Apotiki', function($scope, $routeParams, $location, $http) {-- $scope.repolist = [];- $scope.repo = {};-- $scope.refresh = function () {- $http.get('/repo').success(function (data) {- $scope.repo = data;- for (var k in data) {- for (var subk in data[k]) {- $scope.repolist.push(data[k][subk]);- }- }- });- };-- if ($routeParams.name) { $scope.name = $routeParams.name; }- if ($routeParams.arch) { $scope.arch = $routeParams.arch; }-- $scope.refresh();-});--app.config(function($routeProvider) {- $routeProvider- .when('/repo', {templateUrl: 'listing.html', controller: 'Apotiki'})- .when('/repo/:arch/:name', {templateUrl: 'details.html', controller: 'Apotiki'})- .when('/post', {templateUrl: 'post.html'})- .otherwise({redirectTo: '/repo'});-});
− static/details.html
@@ -1,60 +0,0 @@-<div class="panel panel-default">- - <div class="panel-heading">- Package: {{repo[arch][name]['Package']}}- </div>- - <div class="panel-body">- <div class="row">- <div class="col-md-2"><strong>Package</strong></div>- <div class="col-md-10">{{repo[arch][name]['Package']}}</div>- </div>- <div class="row">- <div class="col-md-2"><strong>Version</strong></div>- <div class="col-md-10">{{repo[arch][name]['Version']}}</div>- </div>- <div class="row">- <div class="col-md-2"><strong>Architecture</strong></div>- <div class="col-md-10">{{repo[arch][name]['Architecture']}}</div>- </div>- <div class="row">- <div class="col-md-2"><strong>Maintainer</strong></div>- <div class="col-md-10">{{repo[arch][name]['Maintainer']}}</div>- </div>- <div class="row">- <div class="col-md-2"><strong>License</strong></div>- <div class="col-md-10">{{repo[arch][name]['License']}}</div>- </div>- <div class="row">- <div class="col-md-2"><strong>Installed Size</strong></div>- <div class="col-md-10">{{repo[arch][name]['Installed-Size']}}</div>- </div>- <div class="row">- <div class="col-md-2"><strong>Priority</strong></div>- <div class="col-md-10">{{repo[arch][name]['Priority']}}</div>- </div>- <div class="row">- <div class="col-md-2"><strong>Depends</strong></div>- <div class="col-md-10">{{repo[arch][name]['Depends']}}</div>- </div>- <div class="row">- <div class="col-md-2"><strong>Homepage</strong></div>- <div class="col-md-10"><a href="{{repo[arch][name]['Homepage']}}">{{repo[arch][name]['Homepage']}}</a></div>- </div>- <div class="row">- <div class="col-md-2"><strong>Vendor</strong></div>- <div class="col-md-10">{{repo[arch][name]['Vendor']}}</div>- </div>- <div class="row">- <div class="col-md-2"><strong>Section</strong></div>- <div class="col-md-10">{{repo[arch][name]['Section']}}</div>- </div>- <div class="row">- <div class="col-md-2"><strong>Description</strong></div>- <div class="col-md-10">- <pre ng-bind="repo[arch][name]['Description']"></pre>- </div>- </div>- </div>- -</div>
− static/index.html
@@ -1,38 +0,0 @@-<!doctype html>-<html lang="en">-- <head>- <title>apotiki debian repository</title>- <meta name="viewport" content="width=device-width, initial-scale=1.0">- <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">- <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.8/angular.min.js"></script>- <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.8/angular-route.js"></script>- <script src="/apotiki.js"></script>- </head>-- <body ng-app="repo">- <div class="navbar navbar-default" role="navigation">- <div class="container">- <div class="navbar-header">- <a class="navbar-brand" href="#">apotiki</a>- </div>- <div class="navbar-collapse collapse">- <ul class="nav navbar-nav">- <li><a href="#list">Listing</a></li>- <li><a href="/post.html">Submit</a></li>- </ul>- </div>- </div>- </div>- - <div class="container">- <div class="row">- <div class="col-lg-8 col-lg-offset-2">- <ng-view></ng-view>- </div>- </div>- </div>- - </body>- -</html>
− static/listing.html
@@ -1,32 +0,0 @@-<div class="panel panel-default">- - <div class="panel-heading">- <div class="row">- <div class="col-sm-2">- <h4>Package listing</h4>- </div>- <div class="col-sm-4 col-sm-offset-6">- <form class="form-inline">- <input type="search" ng-model="searchterm" class="form-control">- </form>- </div>- </div>- </div>- - <div class="panel-body">- <table class="table table-striped">- <thead>- <th>Package</th>- <th>Version</th>- <th>Architecture</th>- </thead>- <tbody>- <tr ng-repeat="pkg in repolist | filter:searchterm">- <td><a href="#repo/{{pkg['Architecture']}}/{{pkg['Package']}}">{{pkg['Package']}}</a></td>- <td>{{pkg['Version']}}</td>- <td>{{pkg['Architecture']}}</td>- </tr>- </tbody>- </table>- </div>-</div>
− static/post.html
@@ -1,58 +0,0 @@-<!doctype html>-<html lang="en">-- <head>- <title>apotiki debian repository</title>- <meta name="viewport" content="width=device-width, initial-scale=1.0">- <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">- </head>-- <body ng-app="repo">- <div class="navbar navbar-default" role="navigation">- <div class="container">- <div class="navbar-header">- <a class="navbar-brand" href="#">apotiki</a>- </div>- <div class="navbar-collapse collapse">- <ul class="nav navbar-nav">- <li><a href="/index.html#list">Listing</a></li>- <li><a href="/post.html">Submit</a></li>- </ul>- </div>- </div>- </div>- - <div class="container">- <div class="row">- <div class="col-lg-8 col-lg-offset-2">--<div class="panel panel-default">- - <div class="panel-heading">- <h4>Package</h4>- </div>- - <div class="panel-body">- <form method="POST" action="/repo" enctype="multipart/form-data" role="form">- <div class="form-group">- <label>Choose package</label>- <input type="file" name="file" id="file">- <p class="help-block">- Package file will overwrite any previous versions.- </p>- </div>- <button type="submit" class="btn btn-default">Submit</button>- </form>- </div>-</div>--- </div>- </div>- </div>- - </body>- -</html>--