Browse Source

removed haxelib website (now handled on github)

Nicolas Cannasse 12 năm trước cách đây
mục cha
commit
43f63668e2

+ 0 - 4
std/tools/haxelib/.htaccess

@@ -1,4 +0,0 @@
-<FilesMatch "^([_a-z0-9A-Z-])+$">
-	RewriteEngine On
-	RewriteRule (.*) /index.n
-</FilesMatch>

+ 0 - 259
std/tools/haxelib/Site.hx

@@ -1,259 +0,0 @@
-/*
- * Copyright (C)2005-2012 Haxe Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-package tools.haxelib;
-#if haxelib_site
-import tools.haxelib.SiteDb;
-#end
-import haxe.rtti.CType;
-
-class Site {
-
-	static var db : sys.db.Connection;
-
-	static var CWD = neko.Web.getCwd();
-	static var DB_FILE = CWD+"haxelib.db";
-	public static var TMP_DIR = CWD+"tmp";
-	public static var REP_DIR = CWD+Data.REPOSITORY;
-
-	static function setup() {
-		SiteDb.create(db);
-	}
-
-	static function initDatabase() {
-		db = neko.db.Sqlite.open(DB_FILE);
-		neko.db.Manager.cnx = db;
-		neko.db.Manager.initialize();
-	}
-
-	static function run() {
-		if( !sys.FileSystem.exists(TMP_DIR) )
-			sys.FileSystem.createDirectory(TMP_DIR);
-		if( !sys.FileSystem.exists(REP_DIR) )
-			sys.FileSystem.createDirectory(REP_DIR);
-
-		var ctx = new haxe.remoting.Context();
-		ctx.addObject("api",new SiteApi(db));
-		if( haxe.remoting.HttpConnection.handleRequest(ctx) )
-			return;
-		if( Sys.args()[0] == "setup" ) {
-			setup();
-			neko.Lib.print("Setup done\n");
-			return;
-		}
-		var file = null;
-		var sid = null;
-		var bytes = 0;
-		neko.Web.parseMultipart(function(p,filename) {
-			if( p == "file" ) {
-				sid = Std.parseInt(filename);
-				file = sys.io.File.write(TMP_DIR+"/"+sid+".tmp",true);
-			} else
-				throw p+" not accepted";
-		},function(data,pos,len) {
-			bytes += len;
-			file.writeFullBytes(data,pos,len);
-		});
-		if( file != null ) {
-			file.close();
-			neko.Lib.print("File #"+sid+" accepted : "+bytes+" bytes written");
-			return;
-		}
-		display();
-	}
-
-	static function display() {
-		var data = sys.io.File.getContent(CWD + "website.mtt");
-		var page = new haxe.Template(data);
-		var ctx : Dynamic = {};
-		var macros = {
-			download : function( res, p, v ) {
-				return "/"+Data.REPOSITORY+"/"+Data.fileName(res(p).name,res(v).name);
-			}
-		};
-		if( fillContent(ctx) )
-			neko.Lib.print( page.execute(ctx,macros) );
-	}
-
-	static function fillContent( ctx : Dynamic ) {
-		var uri = neko.Web.getURI().split("/");
-		var error = function(msg) { ctx.error = StringTools.htmlEscape(msg); return true; }
-		if( uri[0] == "" )
-			uri.shift();
-		var act = uri.shift();
-		if( act == null || act == "" || act == "index.n" )
-			act = "index";
-		ctx.menuTags = Tag.manager.topTags(10);
-		switch( act ) {
-		case "p":
-			var name = uri.shift();
-			var p = Project.manager.search({ name : name }).first();
-			if( p == null )
-				return error("Unknown project '"+name+"'");
-			ctx.p = p;
-			ctx.owner = p.owner;
-			ctx.version = p.version;
-			ctx.versions = Version.manager.byProject(p);
-			var tags = Tag.manager.search({ project : p.id });
-			if( !tags.isEmpty() ) ctx.tags = tags;
-		case "u":
-			var name = uri.shift();
-			var u = User.manager.search({ name : name }).first();
-			if( u == null )
-				return error("Unknown user '"+name+"'");
-			ctx.u = u;
-			ctx.uprojects = Developer.manager.search({ user : u.id }).map(function(d:Developer) { return d.project; });
-		case "t":
-			var tag = uri.shift();
-			ctx.tag = StringTools.htmlEscape(tag);
-			ctx.tprojects = Tag.manager.search({ tag : tag }).map(function(t) return t.project);
-		case "d":
-			var name = uri.shift();
-			var p = Project.manager.search({ name : name }).first();
-			if( p == null )
-				return error("Unknown project '"+name+"'");
-			var version = uri.shift();
-			var v;
-			if( version == null ) {
-				v = p.version;
-				version = v.name;
-			} else {
-				v = Version.manager.search({ project : p.id, name : version }).first();
-				if( v == null ) return error("Unknown version '"+version+"'");
-			}
-			if( v.documentation == null )
-				return error("Project "+p.name+" version "+version+" has no documentation");
-			var root : TypeRoot = haxe.Unserializer.run(v.documentation);
-			var buf = new StringBuf();
-			var html = new tools.haxedoc.HtmlPrinter("/d/"+p.name+"/"+version+"/","","");
-			html.output = function(str) buf.add(str);
-			var path = uri.join(".").toLowerCase().split(".");
-			if( path.length == 1 && path[0] == "" )
-				path = [];
-			if( path.length == 0 ) {
-				ctx.index = true;
-				html.process(TPackage("root","root",root));
-			} else {
-				var cl = html.find(root,path,0);
-				if( cl == null ) {
-					// we most likely clicked on a class which is part of the haxe core documentation
-					neko.Web.redirect("http://haxe.org/api/"+path.join("/"));
-					return false;
-				}
-				html.process(cl);
-			}
-			ctx.p = p;
-			ctx.v = v;
-			ctx.content = buf.toString();
-		case "index":
-			var vl = Version.manager.latest(10);
-			for( v in vl ) {
-				var p = v.project; // fetch
-			}
-			ctx.versions = vl;
-		case "all":
-			ctx.projects = Project.manager.allByName();
-		case "search":
-			var v = neko.Web.getParams().get("v");
-			var p = Project.manager.search({ name : v }).first();
-			if( p != null ) {
-				neko.Web.redirect("/p/"+p.name);
-				return false;
-			}
-			if( Tag.manager.count({ tag : v }) > 0 ) {
-				neko.Web.redirect("/t/"+v);
-				return false;
-			}
-			ctx.projects = Project.manager.containing(v).map(function(p) return Project.manager.get(p.id));
-			ctx.act_all = true;
-			ctx.search = StringTools.htmlEscape(v);
-		case "rss":
-			neko.Web.setHeader("Content-Type", "text/xml; charset=UTF-8");
-			neko.Lib.println('<?xml version="1.0" encoding="UTF-8"?>');
-			neko.Lib.print(buildRss().toString());
-			return false;
-		default:
-			ctx.error = "Unknown action : "+act;
-			return true;
-		}
-		Reflect.setField(ctx,"act_"+act,true);
-		return true;
-	}
-
-	static function buildRss() : Xml {
-		var createChild = function(root:Xml, name:String){
-			var c = Xml.createElement(name);
-			root.addChild(c);
-			return c;
-		}
-		var createChildWithContent = function(root:Xml, name:String, content:String){
-			var e = Xml.createElement(name);
-			var c = Xml.createPCData(if (content != null) content else "");
-			e.addChild(c);
-			root.addChild(e);
-			return e;
-		}
-		var createChildWithCdata = function(root:Xml, name:String, content:String){
-			var e = Xml.createElement(name);
-			var c = Xml.createCData(if (content != null) content else "");
-			e.addChild(c);
-			root.addChild(e);
-			return e;
-		}
-		Sys.setTimeLocale("en_US.UTF8");
-		var url = "http://"+neko.Web.getClientHeader("Host");
-		var rss = Xml.createElement("rss");
-		rss.set("version","2.0");
-		var channel = createChild(rss, "channel");
-		createChildWithContent(channel, "title", "haxe-libs");
-		createChildWithContent(channel, "link", url);
-		createChildWithContent(channel, "description", "lib.haxe.org RSS");
-		createChildWithContent(channel, "generator", "haxe");
-		createChildWithContent(channel, "language", "en");
-		for (v in Version.manager.latest(10)){
-			var project = v.project;
-			var item = createChild(channel, "item");
-			createChildWithContent(item, "title", StringTools.htmlEscape(project.name+" "+v.name));
-			createChildWithContent(item, "link", url+"/p/"+project.name);
-			createChildWithContent(item, "guid", url+"/p/"+project.name+"?v="+v.id);
-			var date = DateTools.format(Date.fromString(v.date), "%a, %e %b %Y %H:%M:%S %z");
-			createChildWithContent(item, "pubDate", date);
-			createChildWithContent(item, "author", project.owner.name);
-			createChildWithContent(item, "description", StringTools.htmlEscape(v.comments));
-		}
-		return rss;
-	}
-
-	static function main() {
-		var error = null;
-		initDatabase();
-		try {
-			run();
-		} catch( e : Dynamic ) {
-			error = { e : e };
-		}
-		db.close();
-		neko.db.Manager.cleanup();
-		if( error != null )
-			neko.Lib.rethrow(error.e);
-	}
-
-}

+ 0 - 198
std/tools/haxelib/SiteDb.hx

@@ -1,198 +0,0 @@
-/*
- * Copyright (C)2005-2012 Haxe Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-package tools.haxelib;
-
-class User extends neko.db.Object {
-
-	public static var manager = new neko.db.Manager<User>(User);
-
-	public var id : Int;
-	public var name : String;
-	public var fullname : String;
-	public var email : String;
-	public var pass : String;
-
-}
-
-class Project extends neko.db.Object {
-
-	static function RELATIONS() {
-		return [
-			{ key : "owner", prop : "owner", manager : User.manager },
-			{ key : "version", prop : "version", manager : Version.manager },
-		];
-	}
-
-	public static var manager = new ProjectManager(Project);
-
-	public var id : Int;
-	public var name : String;
-	public var description : String;
-	public var website : String;
-	public var license : String;
-	public var downloads : Int;
-	public var owner(dynamic,dynamic) : User;
-	public var version(dynamic,dynamic) : Version;
-
-}
-
-class Tag extends neko.db.Object {
-
-	static function RELATIONS() {
-		return [
-			{ key : "project", prop : "project", manager : Project.manager },
-		];
-	}
-
-	public static var manager = new TagManager(Tag);
-
-	public var id : Int;
-	public var tag : String;
-	public var project(dynamic,dynamic) : Project;
-
-}
-
-class Version extends neko.db.Object {
-
-	static function RELATIONS() {
-		return [{ key : "project", prop : "project", manager : Project.manager }];
-	}
-
-	public static var manager = new VersionManager(Version);
-
-	public var id : Int;
-	public var project(dynamic,dynamic) : Project;
-	public var name : String;
-	public var date : String; // sqlite does not have a proper 'date' type
-	public var comments : String;
-	public var downloads : Int;
-	public var documentation : Null<String>;
-
-}
-
-class Developer extends neko.db.Object {
-
-	static var TABLE_IDS = ["user","project"];
-	static function RELATIONS() {
-		return [
-			{ key : "user", prop : "user", manager : User.manager },
-			{ key : "project", prop : "project", manager : Project.manager },
-		];
-	}
-
-	public static var manager = new neko.db.Manager<Developer>(Developer);
-
-	public var user(dynamic,dynamic) : User;
-	public var project(dynamic,dynamic) : Project;
-
-}
-
-class ProjectManager extends neko.db.Manager<Project> {
-
-	public function containing( word ) : List<{ id : Int, name : String }> {
-		word = quote("%"+word+"%");
-		return results("SELECT id, name FROM Project WHERE name LIKE "+word+" OR description LIKE "+word);
-	}
-
-	public function allByName() {
-		return objects("SELECT * FROM Project ORDER BY name COLLATE NOCASE",false);
-	}
-
-}
-
-class VersionManager extends neko.db.Manager<Version> {
-
-	public function latest( n : Int ) {
-		return objects("SELECT * FROM Version ORDER BY date DESC LIMIT "+n,false);
-	}
-
-	public function byProject( p : Project ) {
-		return objects("SELECT * FROM Version WHERE project = "+p.id+" ORDER BY date DESC",false);
-	}
-
-}
-
-class TagManager extends neko.db.Manager<Tag> {
-
-	public function topTags( n : Int ) {
-		return results("SELECT tag, COUNT(*) as count FROM Tag GROUP BY tag ORDER BY count DESC LIMIT "+n);
-	}
-
-}
-
-class SiteDb {
-
-	public static function create( db : sys.db.Connection ) {
-		db.request("DROP TABLE IF EXISTS User");
-		db.request("
-			CREATE TABLE User (
-				id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
-				name VARCHAR(16) NOT NULL UNIQUE,
-				fullname VARCHAR(50) NOT NULL,
-				pass VARCHAR(32) NOT NULL,
-				email VARCHAR(50) NOT NULL
-			)
-		");
-		db.request("DROP TABLE IF EXISTS Project");
-		db.request("
-			CREATE TABLE Project (
-				id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
-				owner INTEGER NOT NULL,
-				name VARCHAR(32) NOT NULL UNIQUE,
-				license VARCHAR(20) NOT NULL,
-				description TEXT NOT NULL,
-				website VARCHAR(100) NOT NULL,
-				version INT,
-				downloads INT NOT NULL
-			)
-		");
-		db.request("DROP TABLE IF EXISTS Version");
-		db.request("
-			CREATE TABLE Version (
-				id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
-				project INTEGER NOT NULL,
-				downloads INTEGER NOT NULL,
-				date VARCHAR(19) NOT NULL,
-				name VARCHAR(32) NOT NULL,
-				comments TEXT NOT NULL,
-				documentation TEXT NULL
-			)
-		");
-		db.request("DROP TABLE IF EXISTS Developer");
-		db.request("
-			CREATE TABLE Developer (
-				user INTEGER NOT NULL,
-				project INTEGER NOT NULL
-			)
-		");
-		db.request("DROP TABLE IF EXISTS Tag");
-		db.request("
-			CREATE TABLE Tag (
-				id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
-				tag VARCHAR(32) NOT NULL,
-				project INTEGER NOT NULL
-			)
-		");
-		db.request("DROP INDEX IF EXISTS TagSearch");
-		db.request("CREATE INDEX TagSearch ON Tag(tag)");
-	}
-}

+ 0 - 212
std/tools/haxelib/haxelib.css

@@ -1,212 +0,0 @@
-
-/* structure */
-
-body {
-	margin : 0;
-	padding : 0;
-	text-align: center;
-	font-family : "trebuchet ms",sans-serif;
-	font-size : 10.5pt;
-	background : #FFFFFF url("http://haxe.org/img/haxe/bg_main.gif") repeat-x;
-}
-
-.page {
-	margin: 10px auto 10px auto;
-	padding : 5px;
-	width : 750px;
-	background-color : #FFFFFF;
-	border : 1px solid #AAA;
-	-moz-border-radius : 10px;
-}
-
-.menu {
-	text-align : left;
-	float : left;
-	width : 150px;
-}
-
-.content {
-	text-align : left;
-	float : left;
-	width : 600px;
-}
-
-.clear {
-	clear : both;
-}
-
-/* style */
-
-a, a:visited {
-	color : #C35700;
-	text-decoration : none;
-}
-
-a:hover {
-	text-decoration : underline;
-}
-
-h1 {
-	text-align : center;
-	margin-top : 20px;
-}
-
-h1 a, h1 a:hover, h1 a:visited {
-	color : #C35700;
-	text-decoration : none;
-}
-
-.content p {
-	text-align : justify;
-	margin : 0px;
-	padding : 0px 10px 0px 10px;
-}
-
-.menu ul {
-	list-style : none;
-	margin : 5px;
-	padding : 0px;
-}
-
-.versions .date, .versions .project, .versions .name {
-	display : inline;
-}
-
-.versions ul, .projects ul {
-	list-style : circle;
-	margin : 25px;
-	padding : 0px;
-}
-
-.date {
-	color : #555;
-	font-size : 12px;
-}
-
-.versions .name {
-	font-weight : bold;
-}
-
-.versions .download {
-	float : right;
-	margin-top : -22px;
-	margin-right : 30px;
-}
-
-.download {
-	padding : 2px 4px 2px 4px;
-	background-color : #eee;
-	display : inline;
-}
-
-.download a {
-	color : #555;
-	font-size : 12px;
-	text-decoration : none;
-}
-
-.download a:visited {
-	color : #555;
-}
-
-.versions .comments {
-	margin-right : 40px;
-	margin-left : 10px;
-	margin-bottom : 5px;
-	text-align : justify;
-}
-
-.pinfos .description {
-	padding : 10px;
-}
-
-.pinfos .download {
-	margin : 200px;
-}
-
-.label {
-	color : #555;
-	width : 80px;
-	float : left;
-}
-
-.tags a {
-	margin-right : 5px;
-}
-
-form {
-	margin-left : 5px;
-	margin-top : 5px;
-}
-
-input {
-	width : 80px;
-}
-
-/* documentation */
-
-.api .title {
-	font-size: 35;
-	font-weight: bold;
-	text-align: center;
-	background-color : #FFD473;
-	color : white;
-}
-
-.api ul.entry {
-	list-style-type: disc;
-	margin-left : 30px;
-	padding-left : 0px;
-}
-
-.api .package_content {
-	display : none;
-}
-
-.api a {
-	text-decoration : none;
-}
-
-.api a:hover {
-	text-decoration : underline;
-}
-
-.api a.package {
-	color : black;
-}
-
-.api .index {
-}
-
-.api .kwd {
-	color : #09598A;
-	font-weight : bold;
-}
-
-.api .classname {
-	font-size : 30;
-	font-weight : bold;
-}
-
-.api .classdoc {
-	border : 1px dashed #666;
-	margin-left : 20px;
-	margin-right : 20px;
-	padding : 5 5 5 5;
-}
-
-.api .importmod, .api .extends, .api .implements, .api .typedef, .api .platforms {
-	color : #777;
-}
-
-.api dd {
-	margin-top : 10px;
-	font-size : 12pt;
-	color : #444;
-}
-
-.api dt {
-	margin-left : 20px;
-	margin-bottom : 5px;
-	text-align : left;
-}

+ 6 - 1
std/tools/haxelib/haxelib.hxproj

@@ -35,7 +35,12 @@
   </compileTargets>
   <!-- Paths to exclude from the Project Explorer tree -->
   <hiddenPaths>
-    <!-- example: <hidden path="..." /> -->
+    <hidden path="haxelib.n" />
+    <hidden path="haxelib.sh" />
+    <hidden path="index.n" />
+    <hidden path="files" />
+    <hidden path="tmp" />
+    <hidden path="haxelib.exe" />
   </hiddenPaths>
   <!-- Executed before build -->
   <preBuildCommand>haxe haxelib.hxml</preBuildCommand>

+ 0 - 5
std/tools/haxelib/site.hxml

@@ -1,5 +0,0 @@
--neko index.n
--main tools.haxelib.Site
--dce no
--D haxelib-site
--lib hx2compat

+ 0 - 179
std/tools/haxelib/website.mtt

@@ -1,179 +0,0 @@
-<html>
-
-<head>
-<title>lib.haxe.org</title>
-<link type="application/rss+xml" rel="alternate" title="RSS feed" href="/rss"/>
-<link href="/haxelib.css" type="text/css" rel="stylesheet"/>
-</head>
-
-<body>
-
-<h1><a href="/">lib.haxe.org</a></h1>
-
-<div class="page">
-
-<div class="menu">
-	<div class="title">Search :</div>
-	<form action="/search" method="POST">
-		<input name="v"/>
-	</form>
-	<div class="title">Top tags :</div>
-	<ul>
-	::foreach menuTags::
-	<li><a href="/t/::tag::">::tag::</a> (::count::)</li>
-	::end::
-	</ul>
-</div>
-
-
-<div class="content">
-
-::if error::
-
-<div class="error">
-	::error::
-</div>
-
-::elseif act_index::
-
-<h2>Welcome</h2>
-
-<p>
-	This website is listing all the libraries available through the <code>haxelib</code> haXe package manager.
-	Please visit <a href="http://haxe.org/haxelib">the haxelib page</a> on haXe website to learn more about haxelib.
-</p>
-
-<h2>Latest releases</h2>
-
-<div class="versions">
-<ul>
-	::foreach versions::
-	<li>
-		<div class="date">::date:: </div>
-		<div class="project"><a href="/p/::(__project.name)::">::(__project.name)::</a> </div>
-		<div class="name">::name:: </div>
-		<div class="download"><a href="$$download(__project,__current__)">Download</a></div>
-		<div class="comments">::comments::</div>
-	</li>
-	::end::
-</ul>
-</div>
-
-<a href="/all">Browse Projects</a>
-
-::elseif act_p::
-
-<h2>::(p.name)::</h2>
-
-<div class="pinfos">
-	<div class="description">::(p.description)::</div>
-	::if tags::<div class="tags"><div class="label">Tags</div> ::foreach tags::<a href="/t/::tag::">::tag::</a>::end::</div>::end::
-	<div class="url"><div class="label">Website</div> <a href="::(p.website)::">::(p.website)::</a></div>
-	<div class="version"><div class="label">Version</div> ::(version.name)::</div>
-	<div class="owner"><div class="label">Owner</div> <a href="/u/::(owner.name)::">::(owner.name)::</a></div>
-	<div class="license"><div class="label">License</div> ::(p.license)::</div>
-	::if (version.documentation)::<div class="doc"><a href="/d/::(p.name)::">Documentation</a></div>::end::
-	<div class="download"><a href="$$download(p,version)">Download</a></div>
-</div>
-
-<h2>History</h2>
-
-<div class="versions">
-<ul>
-	::foreach versions::
-	<li>
-		<div class="date">::date:: </div>
-		<div class="name">::name:: </div>
-		<div class="download"><a href="$$download(p,__current__)">Download</a></div>
-		<div class="comments">::comments::</div>
-	</li>
-	::end::
-</ul>
-</div>
-
-::elseif act_u::
-
-<h2>::(u.name)::</h2>
-
-<div class="uinfos">
-	<div class="name"><div class="label">Name</div> ::(u.fullname)::</div>
-	<div class="email"><div class="label">Email</div> ::(u.email)::</div>
-</div>
-
-<h2>Projects</h2>
-
-<div class="projects">
-<ul>
-::foreach uprojects::
-	<li><a href="/p/::name::">::name::</a></li>
-::end::
-</ul>
-</div>
-
-::elseif act_t::
-
-<h2>Tag ::tag::</h2>
-
-<p>
-	Here's the list of projects using this tag :
-</p>
-
-<div class="projects">
-<ul>
-::foreach tprojects::
-	<li>
-		<a href="/p/::name::">::name::</a>
-		<div class="description">::description::</div>
-	</li>
-::end::
-</ul>
-</div>
-
-::elseif act_all::
-
-<h2>::if search::Search Results for '::search::'::else::All Projects::end:::</h2>
-
-<div class="projects">
-<ul>
-::foreach projects::
-	<li>
-		<a href="/p/::name::">::name::</a>
-		<div class="description">::description::</div>
-	</li>
-::end::
-</ul>
-</div>
-
-::elseif act_d::
-
-<h2>::(p.name):: ::(v.name):: Documentation</h2>
-
-<script type="text/javascript">
-	function toggle(id) {
-		var e = document.getElementById(id);
-		e.isopen = !e.isopen;
-		e.style.display = e.isopen?"block":"none";
-		return false;
-	}
-</script>
-
-<div class="api">
-::content::
-</div>
-
-::else::
-
-<p>
-	No content for this action
-</p>
-
-::end::
-
-</div>
-
-<div class="clear"></div>
-
-</div>
-
-</body>
-</html>