Initial commit.

This commit is contained in:
Eitaro Fukamachi 2015-07-18 16:23:00 +09:00
commit b358f02f48
48 changed files with 4061 additions and 0 deletions

8
.gitignore vendored Normal file
View file

@ -0,0 +1,8 @@
*.fasl
*.dx32fsl
*.dx64fsl
*.lx32fsl
*.lx64fsl
*.x86f
*~
.#*

20
README.markdown Normal file
View file

@ -0,0 +1,20 @@
# quickdocs-server
## Usage
## Installation
## Author
* Eitaro Fukamachi (e.arrows@gmail.com)
## Copyright
Copyright (c) 2015 Eitaro Fukamachi (e.arrows@gmail.com)
# License
Licensed under the BSD 2-Clause License.

39
app.lisp Normal file
View file

@ -0,0 +1,39 @@
(ql:quickload :quickdocs-server)
(defpackage quickdocs-server.app
(:use :cl)
(:import-from :lack.builder
:builder)
(:import-from :ppcre
:scan
:regex-replace)
(:import-from :quickdocs-server.web
:*web*)
(:import-from :quickdocs-server.config
:config
:productionp
:*static-directory*))
(in-package :quickdocs-server.app)
(builder
(:static
:path (lambda (path)
(if (ppcre:scan "^(?:/images/|/css/|/js/|/robot\\.txt$|/favicon\\.ico$)" path)
path
nil))
:root *static-directory*)
(if (productionp)
nil
:accesslog)
(if (getf (config) :error-log)
'(:backtrace
:output (getf (config) :error-log))
nil)
:session
(if (productionp)
nil
(lambda (app)
(lambda (env)
(let ((datafly:*trace-sql* t))
(funcall app env)))))
*web*)

0
db/schema.sql Normal file
View file

2
qlfile Normal file
View file

@ -0,0 +1,2 @@
github datafly fukamachi/datafly
github quickdocs-database quickdocs/quickdocs-database

36
quickdocs-server.asd Normal file
View file

@ -0,0 +1,36 @@
(in-package :cl-user)
(defpackage quickdocs-server-asd
(:use :cl :asdf))
(in-package :quickdocs-server-asd)
(defsystem quickdocs-server
:version "0.1"
:author "Eitaro Fukamachi"
:license "BSD 2-Clause"
:depends-on (:clack
:lack
:caveman2
:envy
:cl-ppcre
:quri
:quickdocs-database
;; for @route annotation
:cl-syntax-annot
;; HTML Template
:djula
;; for DB
:datafly
:sxql)
:components ((:module "src"
:components
((:file "main" :depends-on ("config" "view" "db"))
(:file "web" :depends-on ("view" "search"))
(:file "view" :depends-on ("config"))
(:file "search")
(:file "db" :depends-on ("config"))
(:file "config"))))
:description "Web application running at quickdocs.org.")

44
src/config.lisp Normal file
View file

@ -0,0 +1,44 @@
(in-package :cl-user)
(defpackage quickdocs-server.config
(:use :cl)
(:import-from :envy
:config-env-var
:defconfig)
(:export :config
:*application-root*
:*static-directory*
:*template-directory*
:appenv
:developmentp
:productionp))
(in-package :quickdocs-server.config)
(setf (config-env-var) "APP_ENV")
(defparameter *application-root* (asdf:system-source-directory :quickdocs-server))
(defparameter *static-directory* (merge-pathnames #P"static/" *application-root*))
(defparameter *template-directory* (merge-pathnames #P"templates/" *application-root*))
(defconfig :common
`(:databases ((:maindb :sqlite3 :database-name ":memory:"))))
(defconfig |development|
'())
(defconfig |production|
'())
(defconfig |test|
'())
(defun config (&optional key)
(envy:config #.(package-name *package*) key))
(defun appenv ()
(asdf::getenv (config-env-var #.(package-name *package*))))
(defun developmentp ()
(string= (appenv) "development"))
(defun productionp ()
(string= (appenv) "production"))

22
src/db.lisp Normal file
View file

@ -0,0 +1,22 @@
(in-package :cl-user)
(defpackage quickdocs-server.db
(:use :cl)
(:import-from :quickdocs-server.config
:config)
(:import-from :datafly
:*connection*
:connect-cached)
(:export :connection-settings
:db
:with-connection))
(in-package :quickdocs-server.db)
(defun connection-settings (&optional (db :maindb))
(cdr (assoc db (config :databases))))
(defun db (&optional (db :maindb))
(apply #'connect-cached (connection-settings db)))
(defmacro with-connection (conn &body body)
`(let ((*connection* ,conn))
,@body))

30
src/main.lisp Normal file
View file

@ -0,0 +1,30 @@
(in-package :cl-user)
(defpackage quickdocs-server
(:use :cl)
(:import-from :quickdocs-server.config
:config)
(:import-from :clack
:clackup)
(:export :start
:stop))
(in-package :quickdocs-server)
(defvar *appfile-path*
(asdf:system-relative-pathname :quickdocs-server #P"app.lisp"))
(defvar *handler* nil)
(defun start (&rest args &key server port debug &allow-other-keys)
(declare (ignore server port debug))
(when *handler*
(restart-case (error "Server is already running.")
(restart-server ()
:report "Restart the server"
(stop))))
(setf *handler*
(apply #'clackup *appfile-path* args)))
(defun stop ()
(prog1
(clack:stop *handler*)
(setf *handler* nil)))

87
src/search.lisp Normal file
View file

@ -0,0 +1,87 @@
(in-package :cl-user)
(defpackage quickdocs-server.search
(:use :cl
:sxql
:quickdocs-database)
(:import-from :datafly
:retrieve-all)
(:import-from :alexandria
:ensure-list))
(in-package :quickdocs-server.search)
(syntax:use-syntax :annot)
@export
(defun search-projects (query &optional (ql-dist-version
(preference "ql-dist-version")))
;; TODO: sort
(if (and query
(/= 0 (length query)))
(remove-duplicates
(append
(ensure-list (search-exact-project query ql-dist-version))
(search-by-categories query ql-dist-version)
(search-by-name query ql-dist-version)
(search-by-description query ql-dist-version))
:test #'eql
:key #'project-id
:from-end t)
(search-all-projects ql-dist-version)))
@export
(defun search-all-projects (&optional (ql-dist-version
(preference "ql-dist-version")))
(retrieve-all
(select :*
(from :project)
(where (:= :ql_dist_version ql-dist-version)))
:as 'project))
(defun search-exact-project (query ql-dist-version)
(retrieve-project query :ql-dist-version ql-dist-version))
(defun search-by-categories (query ql-dist-version)
(let* ((scanner (ppcre:create-scanner
(format nil "\\b~A\\b" (ppcre:quote-meta-chars query)) :case-insensitive-mode t))
(rows (retrieve-all
(select (:project_name :category)
(from :cliki_project_category)
(where (:like :category (format nil "%~(~A~)%" query)))
(group-by :category))))
(rows (remove-if-not
(lambda (row)
(ppcre:scan scanner (getf row :category)))
rows)))
(if rows
(retrieve-all
(select :*
(from :project)
(where (:and (:= :ql_dist_version ql-dist-version)
(:in :name (mapcar (lambda (row)
(getf row :project-name))
rows)))))
:as 'project)
nil)))
(defun search-by-name (query ql-dist-version)
(let ((queries (ppcre:split "\\s+" (string-downcase query))))
(retrieve-all
(select :*
(from :project)
(where `(:and (:= :ql_dist_version ,ql-dist-version)
,@(mapcar
(lambda (query) `(:like :name ,(format nil "%~A%" query)))
queries))))
:as 'project)))
(defun search-by-description (query ql-dist-version)
(let ((queries (ppcre:split "\\s+" (string-downcase query))))
(retrieve-all
(select :project.*
(from :cliki)
(left-join :project :on (:= :cliki.project_name :project.name))
(where `(:and (:= :ql_dist_version ,ql-dist-version)
,@(mapcar
(lambda (query) `(:like (:lower :body) ,(format nil "%~A%" query)))
queries))))
:as 'project)))

83
src/view.lisp Normal file
View file

@ -0,0 +1,83 @@
(in-package :cl-user)
(defpackage quickdocs-server.view
(:use :cl)
(:import-from :quickdocs-server.config
:*template-directory*)
(:import-from :caveman2
:*response*
:response-headers)
(:import-from :djula
:add-template-directory
:compile-template*
:render-template*
:*djula-execute-package*)
(:import-from :datafly
:encode-json)
(:export :render
:render-json))
(in-package :quickdocs-server.view)
(djula:add-template-directory *template-directory*)
(defparameter *template-registry* (make-hash-table :test 'equal))
(defun render (template-path &optional env)
(let ((template (gethash template-path *template-registry*)))
(unless template
(setf template (djula:compile-template* (princ-to-string template-path)))
(setf (gethash template-path *template-registry*) template))
(apply #'djula:render-template*
template nil
env)))
(defun render-json (object)
(setf (getf (response-headers *response*) :content-type) "application/json")
(encode-json object))
;;
;; Execute package definition
(defpackage quickdocs-server.djula
(:use :cl)
(:import-from :quickdocs-server.config
:config
:appenv
:developmentp
:productionp)
(:import-from :caveman2
:url-for))
(setf djula:*djula-execute-package* (find-package :quickdocs-server.djula))
;;
;; Custom filters
(djula::def-filter :symbol (it)
(quickdocs-serializer:symb-name it))
(djula::def-filter :lambda-list (it)
(labels ((maptree (fn obj)
(if (consp obj)
(cons (maptree fn (car obj))
(and (cdr obj)
(maptree fn (cdr obj))))
(funcall fn obj)))
(princ-for-html (item)
(djula::escape-for-html (format nil "~(~A~)" item))))
(maptree (lambda (item)
(typecase item
(quickdocs-serializer:symb
(format nil "<span class=\"symbol-name\">~A</span>"
(princ-for-html
(quickdocs-serializer:symb-name item))))
((and symbol
(not keyword))
(if (eq (symbol-package item) (find-package :cl))
(format nil "<span class=\"keyword\">~A</span>"
(princ-for-html item))
(format nil "<span class=\"symbol-name\">~A</span>"
(princ-for-html item))))
(otherwise (princ-for-html item))))
it)))

132
src/web.lisp Normal file
View file

@ -0,0 +1,132 @@
(in-package :cl-user)
(defpackage quickdocs-server.web
(:use :cl
:caveman2
:quickdocs-server.config
:quickdocs-server.view
:quickdocs-server.db
:datafly
:sxql
:quickdocs-database)
(:import-from :quickdocs-server.search
:search-projects)
(:import-from :lack.component
:call)
(:import-from :datafly
:*connection*
:connect-cached)
(:export :*web*))
(in-package :quickdocs-server.web)
;; for @route annotation
(syntax:use-syntax :annot)
;;
;; Application
(defclass <web> (<app>) ())
(defvar *web* (make-instance '<web>))
(defmethod lack.component:call :around ((app <web>) env)
(let ((datafly:*connection*
(datafly:connect-cached :mysql :username "root" :database-name "quickdocs")))
(call-next-method)))
(clear-routing-rules *web*)
;;
;; Routing rules
(defroute "/" ()
(render #P"index.html"
(list :ql-dist-version (preference "ql-dist-version"))))
@route GET "/:project-name/"
(defun project-page (&key project-name)
(let ((project (retrieve-project project-name)))
(unless project
(throw-code 404))
(let ((dependencies
(mapcar (lambda (dep)
(list :name (project-name dep)
:description (project-description dep)))
(project-dependencies project)))
(dependees
(mapcar (lambda (dep)
(list :name (project-name dep)
:description (project-description dep)))
(project-dependees project))))
(render #P"project.html"
`(:project-name ,project-name
:ql-dist-version ,(project-ql-dist-version project)
:homepage ,(project-homepage-url project)
:repos-url ,(project-repos-url project)
:archive-url ,(project-archive-url project)
:readme ,(let ((readme (project-readme project)))
(when readme (project-readme-converted readme)))
:authors ,(project-authors project)
:maintainers ,(project-maintainers project)
:licenses ,(project-licenses project)
:categories ,(project-categories project)
:dependencies-count ,(length dependencies)
:dependencies ,dependencies
:dependees-count ,(length dependees)
:dependees ,dependees)))))
@route GET "/:project-name/api"
(defun project-api-reference (&key project-name)
(let ((project (retrieve-project project-name)))
(unless project
(throw-code 404))
(render #P"api.html"
`(:project-name ,project-name
:ql-dist-version ,(project-ql-dist-version project)
:homepage ,(project-homepage-url project)
:repos-url ,(project-repos-url project)
:archive-url ,(project-archive-url project)
:systems ,(mapcar (lambda (system)
(list :name (system-name system)
:description (system-description system)
:packages
(mapcar (lambda (package)
(setf (getf package :symbols)
(mapcar (lambda (symbol)
(setf (getf symbol :type)
(string-downcase (getf symbol :type)))
(setf (getf symbol :name)
(quickdocs-serializer:symb-name
(getf symbol :name)))
symbol)
(getf package :symbols)))
package)
(system-extracted-info-packages
(system-extracted-info system)))))
(project-systems project))))))
@route GET "/search"
(defun search-page (&key |q|)
(let ((projects (search-projects |q| (preference "ql-dist-version"))))
(render #P"search.html"
(list
:projects (mapcar (lambda (project)
(list :name (project-name project)
:release-version (project-release-version project)
:description (project-description project)))
projects)
:query |q|))))
@route GET "/:project-name"
(defun redirect-to-project (&key project-name)
(redirect (format nil "/~A/" (quri:url-encode project-name)) 301)
"")
;;
;; Error pages
(defmethod on-exception ((app <web>) (code (eql 404)))
(declare (ignore app))
(merge-pathnames #P"_errors/404.html"
*template-directory*))

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
static/css/LigatureSymbols/.DS_Store vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,33 @@
@charset "UTF-8";
@font-face {
font-family: 'LigatureSymbols';
src: url('LigatureSymbols-2.11.eot');
src: url('LigatureSymbols-2.11.eot?#iefix') format('embedded-opentype'),
url('LigatureSymbols-2.11.woff') format('woff'),
url('LigatureSymbols-2.11.ttf') format('truetype'),
url('LigatureSymbols-2.11.svg#LigatureSymbols') format('svg');
src: url('LigatureSymbols-2.11.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
.lsf, .lsf-icon:before {
font-family: 'LigatureSymbols';
-webkit-text-rendering: optimizeLegibility;
-moz-text-rendering: optimizeLegibility;
-ms-text-rendering: optimizeLegibility;
-o-text-rendering: optimizeLegibility;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-font-smoothing: antialiased;
-ms-font-smoothing: antialiased;
-o-font-smoothing: antialiased;
font-smoothing: antialiased;
}
.lsf-icon:before {
content:attr(title);
margin-right:0.3em;
font-size:130%;
}

7
static/css/error.css Normal file
View file

@ -0,0 +1,7 @@
@charset "UTF-8";
#global-header .search-form {
display: none;
}
.error-message {
text-align: center;
}

380
static/css/index.css Normal file
View file

@ -0,0 +1,380 @@
@charset "UTF-8";
@charset "UTF-8";
html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
font,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}
body {
color: #333;
line-height: 150%;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
#content h1,
#content h2,
#content h3,
#content h4,
#content h5,
#content h6 {
margin: 20px 0 10px;
}
a:link {
color: #005585;
text-decoration: none;
}
a:visited {
color: #485270;
}
a:hover {
color: #b83800;
text-decoration: underline;
}
pre {
margin: 15px 0;
font-family: Consolas, "Liberation Mono", Courier, monospace;
}
code {
font-family: Consolas, "Liberation Mono", Courier, monospace;
}
ul {
margin: 15px 0;
padding-left: 30px;
}
.logo {
font-family: Baskerville, "Baskerville Win95BT", "Times New Roman", Times, serif;
}
@charset "UTF-8";
#global-header {
width: 100%;
height: 39px;
color: white;
background-color: #1d304e;
text-shadow: 1px 1px 3px black;
}
#global-header .logo {
padding: 6px 15px;
}
#global-header .logo a {
font-size: 24px;
color: white;
}
#global-header .logo a:hover {
text-decoration: none;
}
#global-header .search-form {
position: absolute;
top: 5px;
right: 15px;
}
#global-header .search-form input[type="text"] {
width: 300px;
height: 26px;
padding-left: 4px;
box-sizing: border-box;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
}
#global-header .search-form input[type="submit"] {
width: 26px;
height: 26px;
border: none;
color: white;
background-color: #6fbf42;
cursor: pointer;
font-size: 20px;
vertical-align: middle;
font-weight: normal;
margin-left: -6px;
}
@charset "UTF-8";
/**
* Footer
*/
#global-footer {
position: relative;
width: 800px;
text-align: center;
padding: 50px 0;
margin: 0 auto;
}
#global-footer .lisp-logo {
position: absolute;
top: 35px;
right: 0;
width: 150px;
height: 50px;
background-image: url(/images/lisp-logo150x50.png);
}
body {
min-width: 1100px;
}
.catch {
position: relative;
max-width: 1180px;
height: 350px;
margin: 100px auto;
}
.catch .catch-copy {
padding: 80px 80px;
font-size: 200%;
line-height: 140%;
font-weight: 500;
letter-spacing: -1px;
}
.catch .catch-copy strong {
font-weight: bold;
}
.catch .screen-shot {
position: absolute;
right: 0;
top: -40px;
}
.search-libraries {
text-align: center;
background-color: #333;
box-shadow: 0 0 80px 10px rgba(1, 2, 4, 0.5) inset;
margin: 0 auto;
padding: 30px 80px;
color: white;
}
.search-libraries h2 {
font-size: 150%;
line-height: 130%;
}
.search-libraries .search-form input[type="text"] {
width: 350px;
height: 25px;
padding-left: 5px;
border-radius: 4px;
border: 1px solid #BCBCBC;
}
.search-libraries .search-form input[type="submit"] {
margin: 0;
width: 29px;
height: 29px;
border: none;
border-radius: 4px;
color: white;
background-color: #6fbf42;
cursor: pointer;
font-size: 20px;
vertical-align: bottom;
}
.search-libraries .categories {
height: 135px;
width: 840px;
margin: 0 auto;
}
.search-libraries .categories h3 {
color: #efefef;
text-align: left;
margin-bottom: 5px !important;
}
.search-libraries .categories ul {
margin-top: 0;
padding: 0;
list-style: none;
}
.search-libraries .categories ul li {
float: left;
}
.search-libraries .categories ul li a {
display: inline-block;
width: 180px;
margin: 5px;
height: 24px;
padding: 10px;
background-color: #395e98;
border-radius: 4px;
color: #efefef;
}
.search-libraries .categories ul li a:hover {
transition-duration: 0.1s;
-moz-transition-duration: 0.1s;
-webkit-transition-duration: 0.1s;
-o-transition-duration: 0.1s;
background-color: #4069ab;
text-decoration: none;
}
.teasers {
margin: 0 auto 80px;
padding: 0 80px;
}
.teasers .teaser {
width: 540px;
margin: 0 auto;
position: relative;
padding-left: 60px;
}
.teasers .teaser p {
margin-bottom: 15px;
}
.teasers .teaser .teaser-icon {
font-size: 300%;
position: absolute;
top: 8px;
left: 0;
}
hr.soften {
width: 800px;
border: 0;
height: 1px;
background-color: rgba(0, 0, 0, 0.1);
background: -webkit-gradient(linear, left top, right top, color-stop(0, rgba(0, 0, 0, 0)), color-stop(50%, rgba(0, 0, 0, 0.1)), color-stop(100%, rgba(0, 0, 0, 0)));
background: -moz-linear-gradient(center top, rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0) 100%);
background: -ms-linear-gradient(center top, rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0) 100%);
background: -o-linear-gradient(center top, rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0) 100%);
background: linear-gradient(center top, rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0) 100%);
-pie-background: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=rgba(0, 0, 0, 0),endColorstr=rgba(0, 0, 0, 0));
border-top: 1px solid #eee;
border-bottom: 1px solid #fff;
}
.contribution {
width: 800px;
margin: 0 auto;
padding: 20px;
text-align: center;
}
.contribution h2 {
font-size: 160%;
}
.contribution p {
text-align: left;
margin: 0 20px;
color: #888;
}
.contribution .contribute-button {
display: inline-block;
padding: 10px 15px;
color: #fff;
background: #426fbf;
background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #7b9bd2), color-stop(1, #426fbf));
background: -ms-linear-gradient(top, #7b9bd2, #426fbf);
background: -moz-linear-gradient(center top, #7b9bd2 0%, #426fbf 100%);
background: -o-linear-gradient(#7b9bd2, #426fbf);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7b9bd2', endColorstr='#426fbf', GradientType=0);
border-radius: 4px;
font-size: 110%;
text-shadow: 0 -1px 1px #34599a, 0 1px 1px #688ccc;
}
.contribution .contribute-button:hover {
text-decoration: none;
background: #3b64ad;
background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #688ccc), color-stop(1, #3b64ad));
background: -ms-linear-gradient(top, #688ccc, #3b64ad);
background: -moz-linear-gradient(center top, #688ccc 0%, #3b64ad 100%);
background: -o-linear-gradient(#688ccc, #3b64ad);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#688ccc', endColorstr='#3b64ad', GradientType=0);
}
.contribution .contribute-button .logo {
font-family: Baskerville, "Baskerville Win95BT", "Times New Roman", Times, serif;
font-size: 110%;
}
.dist-version {
color: #888;
margin: 0 0 25px;
}
#global-footer {
position: relative;
margin-top: 30px;
width: 100%;
background: #ddebb9;
background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #e7f1cd), color-stop(1, #ddebb9));
background: -ms-linear-gradient(top, #e7f1cd, #ddebb9);
background: -moz-linear-gradient(center top, #e7f1cd 0%, #ddebb9 100%);
background: -o-linear-gradient(#e7f1cd, #ddebb9);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e7f1cd', endColorstr='#ddebb9', GradientType=0);
}
#global-footer .back-to-top-link {
text-decoration: none;
display: inline-block;
position: absolute;
top: -18px;
right: 80px;
padding: 5px 12px;
border-radius: 4px;
font-size: 80%;
color: white;
background-color: #f09200;
transition-duration: 0.1s;
-moz-transition-duration: 0.1s;
-webkit-transition-duration: 0.1s;
-o-transition-duration: 0.1s;
}
#global-footer .back-to-top-link:hover {
background-color: #ff9b00;
}
#global-footer .lisp-logo {
position: absolute;
top: 60px;
right: 50px;
width: 100px;
height: 71px;
background-image: url(/images/lisp-logo-transparent.png);
}

670
static/css/main.css Normal file
View file

@ -0,0 +1,670 @@
@charset "UTF-8";
@charset "UTF-8";
html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
font,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}
body {
color: #333;
line-height: 150%;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
#content h1,
#content h2,
#content h3,
#content h4,
#content h5,
#content h6 {
margin: 20px 0 10px;
}
a:link {
color: #005585;
text-decoration: none;
}
a:visited {
color: #485270;
}
a:hover {
color: #b83800;
text-decoration: underline;
}
pre {
margin: 15px 0;
font-family: Consolas, "Liberation Mono", Courier, monospace;
}
code {
font-family: Consolas, "Liberation Mono", Courier, monospace;
}
ul {
margin: 15px 0;
padding-left: 30px;
}
.logo {
font-family: Baskerville, "Baskerville Win95BT", "Times New Roman", Times, serif;
}
@charset "UTF-8";
#global-header {
width: 100%;
height: 39px;
color: white;
background-color: #1d304e;
text-shadow: 1px 1px 3px black;
}
#global-header .logo {
padding: 6px 15px;
}
#global-header .logo a {
font-size: 24px;
color: white;
}
#global-header .logo a:hover {
text-decoration: none;
}
#global-header .search-form {
position: absolute;
top: 5px;
right: 15px;
}
#global-header .search-form input[type="text"] {
width: 300px;
height: 26px;
padding-left: 4px;
box-sizing: border-box;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
}
#global-header .search-form input[type="submit"] {
width: 26px;
height: 26px;
border: none;
color: white;
background-color: #6fbf42;
cursor: pointer;
font-size: 20px;
vertical-align: middle;
font-weight: normal;
margin-left: -6px;
}
@charset "UTF-8";
/**
* Footer
*/
#global-footer {
position: relative;
width: 800px;
text-align: center;
padding: 50px 0;
margin: 0 auto;
}
#global-footer .lisp-logo {
position: absolute;
top: 35px;
right: 0;
width: 150px;
height: 50px;
background-image: url(/images/lisp-logo150x50.png);
}
@charset "UTF-8";
.information {
border: 1px solid #cccccc;
background-color: #f1f1f1;
line-height: 200%;
padding: 15px;
}
.information dt {
color: #666;
font-weight: bold;
font-size: 90%;
}
.information dd {
color: #888;
font-size: 80%;
}
.readme-body {
margin: 0 10px 10px;
padding: 0 15px 15px;
line-height: 1.6;
}
.readme-body .plain-text {
white-space: pre-wrap;
}
.readme-body h1 {
font-size: 28px !important;
}
.readme-body h2 {
font-size: 24px !important;
border-bottom: 1px solid #ccc;
}
.readme-body h3 {
font-size: 18px !important;
}
.readme-body p {
margin: 10px 0;
}
.readme-body pre code {
padding: 0 !important;
}
.readme-body code {
background-color: #eee;
padding: 2px;
border-radius: 3px;
font-size: 90%;
}
.readme-body pre {
padding: 15px;
border-radius: 5px;
color: white;
background-color: black;
}
.readme-body pre code {
background-color: transparent;
}
.dependencies,
.depending {
position: relative;
width: 390px;
float: left;
border: 1px solid #cccccc;
border-radius: 3px;
background-color: #ffffff;
margin-bottom: 40px;
line-height: 1.5;
font-size: 90%;
}
.dependencies h3,
.depending h3 {
margin: 0 !important;
padding: 5px 12px;
background-color: #f2f2f2;
font-size: 95% !important;
}
.dependencies .count,
.depending .count {
position: absolute;
top: 5px;
right: 8px;
color: #888;
background-color: #ffffff;
border: 1px solid #d9d9d9;
border-radius: 10px;
display: inline-block;
padding: 0 5px;
font-size: 80%;
}
.dependencies ul,
.depending ul {
list-style: none;
margin: 0;
padding: 0;
}
.dependencies ul li,
.depending ul li {
border-top: 1px solid #cccccc;
width: 100%;
height: 50px;
display: table;
}
.dependencies ul li a,
.depending ul li a {
display: table-cell;
vertical-align: middle;
height: 100%;
padding: 0px 15px;
text-decoration: none;
}
.dependencies ul li a:hover .name,
.depending ul li a:hover .name {
text-decoration: underline;
}
.dependencies ul li .description,
.depending ul li .description {
display: block;
margin-left: 10px;
font-size: 80%;
color: #AAA;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 340px;
}
.dependencies .none,
.depending .none {
display: block;
margin: 20px 20px;
color: #888;
}
.dependencies .load-more,
.depending .load-more {
font-size: 85%;
height: 25px;
cursor: pointer;
color: #888;
text-align: center;
background-color: #fafafa;
}
.dependencies .load-more:hover,
.depending .load-more:hover {
background-color: #f7f7f7;
}
.dependencies .load-more:hover a,
.depending .load-more:hover a {
color: #777;
}
.depending {
margin-left: 10px;
}
.links {
clear: both;
}
@charset "UTF-8";
.search-results-summary {
margin-left: 30px;
color: #888;
}
.search-results-summary strong {
color: #666;
}
.search-result-container {
padding: 0 30px;
}
.search-result-container .search-result {
position: relative;
padding: 15px;
list-style: none;
clear: both;
line-height: 100%;
width: 100%;
height: 71px;
box-sizing: border-box;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
}
.search-result-container .search-result .project-name {
font-size: 130%;
}
.search-result-container .search-result .ql-version {
margin-left: 10px;
font-style: italic;
color: #999;
font-size: 80%;
}
.search-result-container .search-result .download-count {
position: absolute;
top: 15px;
right: 25px;
color: #2075a5;
}
.search-result-container .search-result .description {
margin: 5px 0.5em 0;
color: #AAA;
font-size: 90%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.search-result-container .search-result:nth-child(2n+1) {
background-color: #f1f1f1;
}
@charset "UTF-8";
.toc-systems header {
margin-left: 10px;
}
.toc-systems header h2 {
font-size: 120% !important;
}
.toc-systems dl {
margin-left: 220px;
}
.toc-systems dl dd {
margin-left: 20px;
}
.toc-systems dl .one-line-description {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
color: #777;
font-size: 90%;
}
.system {
padding-left: 220px;
margin-top: 35px;
padding-bottom: 40px;
border-top: 1px dotted #CCC;
}
.toc {
position: absolute;
left: 10px;
margin-top: 20px;
}
.toc h3 {
font-size: 100% !important;
margin: 0 auto 5px !important;
}
.toc ul {
margin-top: 0;
font-size: 90%;
padding: 0;
width: 200px;
}
.toc ul.toc-systems {
list-style: none;
}
.toc ul.toc-packages {
list-style: inherit;
}
.toc ul li {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.api {
padding-left: 10px;
}
.api .package {
border-top: 1px dotted #CCC;
}
.api ul {
padding-left: 3px;
list-style: none;
}
.api ul li {
margin: 30px 0;
}
.api code.symbol-name {
font-weight: bold;
color: #444;
font-size: 120%;
}
.api .lambda-list {
display: inline-block;
margin-left: 8px;
color: #555;
}
.api .lambda-list .symbol-name {
font-size: 95%;
font-weight: normal;
}
.api .lambda-list .keyword {
color: #777;
font-style: italic;
font-size: 90%;
}
.api .initial-value {
color: #777;
font-size: 95%;
display: inline-block;
margin-left: 8px;
}
.api .initial-value.unbound {
font-style: italic;
}
.api dl {
margin: 8px 0 0 15px;
font-size: 90%;
}
.api dl .docstring {
margin-top: 0;
line-height: 1.3;
font-size: 100%;
background: none;
border: none;
}
.api .symbol {
position: relative;
}
.api .symbol-type {
position: absolute;
left: -78px;
display: inline-block;
padding-right: 10px;
font-size: 85%;
text-align: right;
width: 60px;
border-right: 3px solid;
}
.api .symbol-type.class {
border-color: rgba(224, 153, 82, 0.7);
}
.api .symbol-type.function {
border-color: rgba(77, 119, 203, 0.7);
}
.api .symbol-type.method {
border-color: rgba(46, 83, 157, 0.7);
}
.api .symbol-type.macro {
border-color: rgba(153, 51, 204, 0.7);
}
.api .symbol-type.variable {
border-color: rgba(52, 178, 125, 0.7);
}
.api .symbol-type.constant {
border-color: rgba(98, 209, 162, 0.7);
}
.api .symbol-type.type {
border-color: #AAA;
}
.api .slot-list .label {
font-style: italic;
color: #555;
}
.api .docstring {
margin: 5px 0 10px;
font-size: 90%;
color: #333;
line-height: 1.5;
}
.api .docstring pre {
white-space: pre-wrap;
margin: 0;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.api .description {
margin: 15px 0 10px 10px !important;
}
.error {
margin-bottom: 20px;
padding: 15px;
font-size: 100%;
border: 1px solid #fbeed5;
color: #c09853;
background-color: #fcf8e3;
border-radius: 4px;
}
.error .error-detail {
margin-bottom: 0;
overflow: scroll;
}
section {
margin-bottom: 40px;
}
#content {
position: relative;
width: 800px;
margin: 30px auto;
}
#content h1 {
font-size: 32px;
}
#content h2 {
font-size: 20px;
}
#content h3 {
font-size: 32px;
margin: 10px 0 20px;
}
/**
* Header
*/
header {
margin: 10px 0 30px;
}
header h2 {
float: left;
font-size: 40px !important;
margin: 0 !important;
}
header .subtitle {
display: inline-block;
margin: 3px 0 0 10px;
font-style: italic;
color: #ccc;
}
header .header-links {
position: absolute;
top: -7px;
right: 0;
}
header .header-links a {
display: inline-block;
padding: 10px 15px;
border-radius: 4px;
color: white;
background: #6fbf42;
background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #6fbf42), color-stop(1, #4e872e));
background: -ms-linear-gradient(top, #6fbf42, #4e872e);
background: -moz-linear-gradient(center top, #6fbf42 0%, #4e872e 100%);
background: -o-linear-gradient(#6fbf42, #4e872e);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#6fbf42', endColorstr='#4e872e', GradientType=0);
text-decoration: none;
}
header .search-query {
display: inline-block;
margin: 6px 0 0 10px;
color: #888;
font-size: 25px;
}
header .search-query strong {
color: #333;
}
.error-message {
text-align: left;
}
.breadcrumb-header-container {
position: fixed;
top: 10px;
left: 10px;
padding: 0;
margin: 0;
font-size: 80%;
list-style: none;
transition-duration: 0.2s;
-moz-transition-duration: 0.2s;
-webkit-transition-duration: 0.2s;
-o-transition-duration: 0.2s;
opacity: 0.5;
}
.breadcrumb-header-container:hover {
opacity: 0.7 !important;
}
.breadcrumb-header-container li {
display: inline-block;
float: left;
margin: 0;
padding: 0;
}
.breadcrumb-header-container li.package-name.current:before {
content: ">";
color: #ccc;
}
.breadcrumb-header-container a {
height: 25px;
padding: 0 10px;
text-decoration: none;
color: #555;
transition-duration: 0.2s;
-moz-transition-duration: 0.2s;
-webkit-transition-duration: 0.2s;
-o-transition-duration: 0.2s;
}
.breadcrumb-header-container a.top-link {
font-size: 140%;
}
.breadcrumb-header-container a:hover {
color: black;
}
.pager-link-container {
position: fixed;
top: 10px;
right: 20px;
font-size: 80%;
}
.pager-link-container .pager-link {
cursor: pointer;
text-decoration: none;
opacity: 0.5;
transition-duration: 0.2s;
-moz-transition-duration: 0.2s;
-webkit-transition-duration: 0.2s;
-o-transition-duration: 0.2s;
color: #555;
margin-left: 5px;
}
.pager-link-container .pager-link:hover {
opacity: 1;
}

55
static/css/project.css Normal file
View file

@ -0,0 +1,55 @@
@charset "UTF-8";
.information {
border: 1px solid #ccc;
border-top: 3px solid #BBB;
background-color: #f1f1f1;
line-height: 200%;
padding: 15px;
}
.information dt {
color: #666;
font-weight: bold;
font-size: 90%;
}
.information dd {
color: #888;
font-size: 80%;
}
.readme-body {
margin: 0 10px 10px;
padding: 0 15px 15px;
line-height: 1.6;
}
.readme-body .plain-text {
white-space: pre-wrap;
}
.readme-body h1 {
font-size: 28px !important;
}
.readme-body h2 {
font-size: 24px !important;
border-bottom: 1px solid #ccc;
}
.readme-body h3 {
font-size: 18px !important;
}
.readme-body p {
margin: 10px 0;
}
.readme-body pre code {
padding: 0 !important;
}
.readme-body code,
.readme-body pre {
color: white;
background-color: black;
}
.readme-body code {
padding: 2px;
border-radius: 3px;
font-size: 90%;
}
.readme-body pre {
padding: 15px;
border-radius: 5px;
}

BIN
static/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

38
static/html/50x.html Normal file
View file

@ -0,0 +1,38 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<link rel="shortcut icon" href="/favicon.ico" />
<title>Quickdocs</title>
<link rel="stylesheet" type="text/css" href="/css/LigatureSymbols/style.css" />
<link rel="stylesheet" type="text/css" href="/css/main.css" />
<link rel="stylesheet" type="text/css" href="/css/error.css" />
</head>
<body>
<div id="container">
<div id="global-header">
<h1 class="logo"><a href="/">Quickdocs</a></h1>
<form class="search-form" method="get" action="/search">
<input type="text" name="q" value="" placeholder="Search for projects" />
<input type="submit" class="lsf" value="search" />
</form>
</div>
<div id="content">
<div class="error-message">
<h2>Quickdocs.org is under maintainance. Sorry.</h2>
<img src="/images/lisplogo_alien.png" width="531px" height="325px" title="Made with secret alien technology" />
</div>
</div>
<div id="global-footer">
&copy; 2013-2015 <a href="http://8arrow.org/">Eitaro Fukamachi</a>
<div class="lisp-logo"></div>
</div>
</div>
</body>
</html>

BIN
static/images/github.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

View file

@ -0,0 +1,495 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="744.09448819"
height="1052.3622047"
id="svg2"
sodipodi:version="0.32"
inkscape:version="0.42"
sodipodi:docbase="C:\home\logo_page"
sodipodi:docname="lisplogo_alien.svg"
inkscape:export-filename="C:\home\lisplogo_alien.png"
inkscape:export-xdpi="258.45999"
inkscape:export-ydpi="258.45999">
<defs
id="defs4">
<linearGradient
id="linearGradient8707">
<stop
style="stop-color:#8de17a;stop-opacity:1.0000000;"
offset="0.00000000"
id="stop8709" />
<stop
style="stop-color:#a3f590;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop8711" />
</linearGradient>
<linearGradient
id="linearGradient7973">
<stop
id="stop7975"
offset="0.00000000"
style="stop-color:#71bc60;stop-opacity:1.0000000;" />
<stop
id="stop7977"
offset="1.0000000"
style="stop-color:#77ce64;stop-opacity:0.42352942;" />
</linearGradient>
<linearGradient
id="linearGradient6509">
<stop
style="stop-color:#7a73de;stop-opacity:1.0000000;"
offset="0.00000000"
id="stop6511" />
<stop
id="stop6517"
offset="0.50000000"
style="stop-color:#a2c8e9;stop-opacity:0.98039216;" />
<stop
style="stop-color:#7a73de;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop6513" />
</linearGradient>
<linearGradient
id="linearGradient5773">
<stop
style="stop-color:#000000;stop-opacity:0.00000000;"
offset="0.00000000"
id="stop5775" />
<stop
id="stop5781"
offset="0.50000000"
style="stop-color:#616161;stop-opacity:1.0000000;" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop5777" />
</linearGradient>
<linearGradient
id="linearGradient5037">
<stop
id="stop5039"
offset="0.00000000"
style="stop-color:#d6d1f9;stop-opacity:1.0000000;" />
<stop
id="stop5041"
offset="1.0000000"
style="stop-color:#9687fa;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient4303">
<stop
style="stop-color:#d6d1f9;stop-opacity:1.0000000;"
offset="0.00000000"
id="stop4305" />
<stop
style="stop-color:#9687fa;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop4307" />
</linearGradient>
<linearGradient
id="linearGradient2115">
<stop
style="stop-color:#d2f1cb;stop-opacity:1.0000000;"
offset="0.00000000"
id="stop2117" />
<stop
style="stop-color:#cdf9c3;stop-opacity:0.42268041;"
offset="1.0000000"
id="stop2119" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2115"
id="linearGradient2121"
x1="272.79681"
y1="476.64795"
x2="254.12024"
y2="535.94427"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4303"
id="radialGradient4309"
cx="300.83069"
cy="447.85394"
fx="300.83069"
fy="447.85394"
r="78.713470"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.960976,0.000000,15.90946)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5037"
id="linearGradient5045"
x1="225.84930"
y1="641.64783"
x2="253.46617"
y2="543.98328"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5773"
id="linearGradient5779"
x1="80.912460"
y1="670.96942"
x2="301.00812"
y2="670.96942"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6509"
id="linearGradient6515"
x1="456.66621"
y1="428.55343"
x2="579.09352"
y2="428.55343"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient7973"
id="linearGradient7979"
gradientUnits="userSpaceOnUse"
x1="209.93025"
y1="609.15863"
x2="272.07062"
y2="554.45270" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient8707"
id="linearGradient8713"
x1="202.42282"
y1="630.79425"
x2="201.15987"
y2="501.72241"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.8321488"
inkscape:cx="280.98857"
inkscape:cy="458.91807"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:window-width="759"
inkscape:window-height="779"
inkscape:window-x="1"
inkscape:window-y="0" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:url(#linearGradient5779);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;opacity:0.16666667"
d="M 67.144386,666.93597 C 74.120426,681.02585 87.234595,682.74658 102.89660,679.43686 C 111.72000,677.57228 140.39281,675.65602 160.44893,683.50406 C 180.50504,691.35211 204.88673,682.15623 233.66290,680.41222 C 262.43906,678.66821 271.19356,686.99208 290.37767,677.40003 C 309.56178,667.80797 354.03404,665.19196 329.61790,656.47191 C 305.20176,647.75186 219.74527,649.49587 187.48108,653.85589 C 155.21690,658.21592 83.712481,637.28780 71.504411,642.51983 C 58.555797,648.06924 64.528371,654.72790 67.144386,666.93597 z "
id="path2123"
sodipodi:nodetypes="csssssszc" />
<path
style="fill:#8ed97d;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3e7e42;stroke-width:2.9830000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
d="M 142.76766,550.12665 C 136.15502,574.26631 130.95896,630.57333 127.69749,652.88979 C 126.89916,652.62576 126.03531,652.46271 125.14665,652.50195 C 121.07030,652.68196 117.93038,656.25924 118.11662,660.47614 C 118.30285,664.69302 121.74452,667.94836 125.82086,667.76832 C 128.64019,667.64379 130.93357,665.85431 132.07147,663.39453 C 133.29062,666.04330 135.99007,667.85099 139.08140,667.71446 C 143.15772,667.53442 146.33369,664.06501 146.15367,659.98866 C 145.97364,655.91230 142.50558,652.76757 138.42924,652.94760 C 138.41852,652.94808 138.40872,652.94846 138.39802,652.94898 C 138.90516,649.31332 148.99544,582.24518 150.21242,575.50724 C 151.46757,568.55800 150.73287,521.04944 142.76766,550.12665 z "
id="path7191"
sodipodi:nodetypes="ccssscssscss" />
<path
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 70.112026,725.23378 C 196.77942,746.08337 316.58355,743.97138 438.34231,722.65281"
id="path3574"
sodipodi:nodetypes="cc" />
<path
style="opacity:1.0000000;color:#000000;fill:url(#linearGradient6515);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:3.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.00000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
d="M 456.66621,444.89871 C 475.28118,450.63386 493.51137,438.88145 504.22314,445.63641 C 514.93490,452.39137 524.28502,462.05589 541.13718,460.51176 C 557.80512,458.98451 579.09352,450.95426 579.09352,450.95426 C 579.09352,450.95426 558.17039,441.92846 549.14440,431.66233 C 540.11839,421.39621 535.83465,410.77594 519.99221,405.10761 C 498.47786,397.40990 479.61491,401.48012 470.70087,396.43061 C 459.46347,406.21159 456.66621,444.89871 456.66621,444.89871 z "
id="path3572"
sodipodi:nodetypes="csscsscc" />
<path
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:4.8630000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
d="M 476.70033,405.01034 L 467.44645,438.27363 L 484.10745,436.34116"
id="path3586"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:4.8630000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
d="M 498.25829,406.72852 L 492.61695,436.08784"
id="path3588"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:4.8630000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
d="M 523.32646,417.67134 C 519.81816,412.52468 506.68473,404.66125 505.33079,415.73168 C 503.97684,426.80214 525.41239,424.10169 520.11053,437.40330 C 515.79042,448.24184 501.89764,433.67985 501.89764,433.67985"
id="path3590"
sodipodi:nodetypes="cssc" />
<path
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:4.8630000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
d="M 525.36140,451.00300 L 531.36075,423.06948 C 531.36075,423.06948 545.14439,433.11252 542.29152,439.77667 C 538.41438,448.83345 528.95141,436.27401 528.95141,436.27401"
id="path3592"
sodipodi:nodetypes="ccsc" />
<path
style="fill:url(#linearGradient8713);fill-opacity:1.0;fill-rule:evenodd;stroke:#3e7e42;stroke-width:2.9830000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
d="M 270.51899,473.63452 C 186.03183,473.32884 117.33411,508.62334 108.09375,537.32081 C 100.42250,561.14521 89.846437,628.73395 85.603534,650.88478 C 84.817635,650.58579 83.961816,650.38478 83.072284,650.38478 C 78.991969,650.38476 75.697281,653.82002 75.697284,658.04103 C 75.697282,662.26202 78.991971,665.66604 83.072284,665.66603 C 85.894372,665.66601 88.264466,663.97946 89.509784,661.57228 C 90.610880,664.27225 93.227950,666.19729 96.322284,666.19728 C 100.40259,666.19726 103.72853,662.87136 103.72853,658.79103 C 103.72853,654.71070 100.40259,651.41602 96.322284,651.41603 C 96.311560,651.41603 96.301744,651.41598 96.291034,651.41603 C 96.958087,647.80628 107.04943,590.82074 111.61669,581.08887 C 114.61685,574.69618 238.84164,568.85811 240.75000,574.72706 C 243.50651,583.20447 236.27814,637.10872 234.63478,658.67013 C 234.24628,658.61772 233.88360,658.50053 233.47853,658.51388 C 229.40043,658.64826 226.21453,662.20141 226.35353,666.42013 C 226.49253,670.63886 229.90044,673.92950 233.97853,673.79513 C 236.79908,673.70217 239.09441,671.92951 240.25978,669.48263 C 241.44920,672.14488 244.13588,673.99079 247.22853,673.88888 C 251.30663,673.75452 254.51915,670.31075 254.38478,666.23263 C 254.25042,662.15453 250.83789,658.97325 246.75978,659.10763 C 246.41000,659.11916 246.09186,659.23567 245.75978,659.29513 C 246.92433,642.74667 255.09873,576.54431 259.42392,571.64309 C 262.37946,568.29392 287.10830,566.78265 287.88858,572.13930 C 288.57332,576.84027 300.27776,647.89279 298.96818,655.28002 C 291.03140,655.02048 285.29440,664.47746 289.74349,668.25018 C 293.91482,671.78736 300.98301,672.97801 303.34529,665.55805 C 308.04368,673.55644 315.38495,669.99998 317.88153,666.13649 C 320.02882,662.81352 317.73746,656.01493 307.96818,654.90502 C 311.81199,638.22268 303.11619,563.96683 304.46875,561.97706 C 306.02930,559.68134 313.84474,546.65990 314.62500,537.47706 C 314.73280,536.20836 314.71985,533.92375 314.56250,531.16456 C 338.96788,535.84741 355.35651,538.98893 366.14040,533.06486 C 381.40207,524.68094 384.27702,518.47614 399.81250,508.25831 C 419.15908,495.53388 433.67678,503.16068 442.94710,501.26058 C 452.21743,499.36053 447.92808,486.96815 453.52398,477.50280 C 459.59978,467.22571 432.04243,459.98752 425.71986,468.08875 C 417.85160,478.17050 419.26202,485.20207 412.17309,487.66407 C 402.87743,490.89246 382.69140,503.22203 376.08702,507.88257 C 364.89903,515.77764 354.86141,522.38042 334.84375,514.75831 C 320.03993,507.37383 323.22898,490.84653 303.81250,482.63331 C 294.38984,477.78969 285.27126,473.96796 277.93750,472.69581 C 277.55554,472.60932 277.17096,472.55316 276.78125,472.47706 C 276.32712,472.41403 275.87541,472.36098 275.43750,472.32081 C 273.72290,472.04335 272.38271,473.70349 270.51899,473.63452 z "
id="path1306"
sodipodi:nodetypes="cscssscssscsscssscssscssczczcsscssssssscccscc" />
<path
transform="matrix(0.989097,0.147266,-0.270564,0.962702,0.000000,0.000000)"
style="fill:#e0773e;fill-opacity:1.0000000;stroke:#000000;stroke-width:2.7335560;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
d="M 560.34112,321.05953 C 562.60643,321.05953 564.62104,322.68769 564.62104,326.88038 L 563.99561,441.61088 C 563.99561,445.80357 562.59362,447.05283 560.32831,447.05283 C 558.06301,447.05283 555.81761,445.80357 555.81761,441.61088 L 556.44304,326.88038 C 556.44304,322.68769 558.07582,321.05953 560.34112,321.05953 z "
id="rect2844"
sodipodi:nodetypes="cccsccc" />
<path
style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 246.14310,509.11110 C 241.02119,526.84076 255.00793,532.35666 255.00793,532.35666 C 255.00793,532.35666 260.52383,535.90259 264.85774,537.08457 C 269.19166,538.26655 286.67508,543.28995 288.10330,523.88582 C 281.45468,522.01436 246.14310,509.11110 246.14310,509.11110 z "
id="path9395"
sodipodi:nodetypes="ccscc" />
<path
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 281.99642,521.91586 L 278.25349,538.46354"
id="path10849" />
<path
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 275.88954,520.33989 L 271.75261,538.46354"
id="path10851" />
<path
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 270.17664,517.97593 L 266.03972,536.69058"
id="path10853" />
<path
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 264.66075,516.00597 L 260.52383,534.72061 L 264.66075,516.00597 z "
id="path10855" />
<path
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 258.94785,514.03601 L 255.00793,532.35666"
id="path10857" />
<path
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 254.02295,512.26304 L 250.28002,528.21974"
id="path10859" />
<path
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 249.49203,510.09608 L 246.53709,522.30985"
id="path10861" />
<path
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 286.52734,531.37168 C 273.91957,530.97769 253.43196,524.08282 244.96112,517.18795"
id="path10863"
sodipodi:nodetypes="cs" />
<path
style="opacity:1.0000000;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3e7e42;stroke-width:2.9830000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.00000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
d="M 314.73918,531.21038 C 287.29383,524.26287 246.50860,508.88870 246.50860,508.88870 C 246.50860,508.88870 236.65196,531.11393 269.32519,538.14820 C 287.57448,542.07710 288.12150,524.25744 288.12150,524.25744"
id="path1334"
sodipodi:nodetypes="ccsc" />
<path
style="opacity:1.0000000;color:#000000;fill:#9af286;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3e7e42;stroke-width:2.9830000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.00000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
d="M 448.05225,488.20443 C 457.54479,489.43116 460.35916,478.75382 457.08417,473.68765 C 454.09991,469.07122 443.84736,464.04902 441.23893,470.41365 C 439.28318,475.18573 444.45174,477.89625 448.76518,477.45148"
id="path1319"
sodipodi:nodetypes="csss" />
<path
style="fill:#9af286;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3e7e42;stroke-width:2.9830000;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1.0000000;opacity:1.0000000;color:#000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0;visibility:visible;display:inline;overflow:visible"
d="M 444.43069,493.83066 C 440.55788,491.80306 435.16203,492.23114 437.58543,485.56144 C 439.37673,480.63139 445.27629,484.41451 453.18149,489.82225 C 461.08670,495.22998 452.88813,501.92241 443.28704,501.09310"
id="path1317"
sodipodi:nodetypes="csss" />
<path
style="opacity:1.0000000;color:#000000;fill:#9af286;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3e7e42;stroke-width:2.9830000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.00000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
d="M 419.57651,478.78648 C 422.82017,473.02082 423.77214,467.20062 427.28746,465.99345 C 430.68152,464.82794 438.80518,458.88944 441.72524,460.45869 C 444.64525,462.02795 446.97626,467.63368 437.59210,472.14545 C 433.11706,474.29699 432.92789,479.97163 429.29171,482.22177"
id="path1315"
sodipodi:nodetypes="csssz" />
<path
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 204.67588,506.38984 C 204.67588,506.38984 224.38821,503.17905 222.72522,491.92631 C 221.32745,482.46817 207.13035,484.57698 199.99263,486.37428 C 200.44519,492.10976 201.21034,495.26298 194.65310,498.02106 C 201.24775,497.88549 202.75869,499.84733 204.67588,506.38984 z "
id="path15231"
sodipodi:nodetypes="csccc" />
<path
sodipodi:nodetypes="csccc"
id="path15959"
d="M 206.84427,528.80171 C 206.84427,528.80171 226.81416,528.50375 226.81212,517.12879 C 226.81042,507.56792 212.45756,507.58106 205.13390,508.31684 C 204.74411,514.05693 205.04063,517.28808 198.15093,519.05910 C 204.69469,519.88794 205.90297,522.04938 206.84427,528.80171 z "
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
<path
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 207.00459,552.07477 C 207.00459,552.07477 226.93742,553.32665 227.81769,541.98581 C 228.55758,532.45361 214.24694,531.35343 206.88827,531.51894 C 206.05443,537.21150 206.09943,540.45592 199.09312,541.68721 C 205.55288,543.02112 206.58987,545.26977 207.00459,552.07477 z "
id="path15961"
sodipodi:nodetypes="csccc" />
<path
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 206.34375 554.53125 C 205.13901 560.15699 204.97815 563.41757 197.90625 564.18750 C 203.30431 565.67653 204.70298 567.72897 205.00000 572.43750 C 211.46987 572.34077 217.37346 572.34767 222.50000 572.46875 C 224.58495 571.12494 226.12602 569.15846 226.53125 566.34375 C 227.89366 556.88047 213.69748 554.84789 206.34375 554.53125 z "
id="path15963" />
<path
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 196.03125 482.84375 C 187.52447 485.04283 179.42599 487.56587 171.87500 490.34375 C 176.36725 491.29017 177.56746 493.45549 178.37500 498.96875 C 178.37500 498.96874 198.12565 498.39857 198.12500 487.68750 C 198.12488 485.59722 197.29605 484.04852 196.03125 482.84375 z "
id="path15965" />
<path
sodipodi:nodetypes="csccc"
id="path15967"
d="M 182.55810,519.59489 C 182.55810,519.59489 202.29393,519.08874 202.32211,508.37771 C 202.34579,499.37485 188.16167,499.54934 180.92217,500.32491 C 180.52175,505.73438 180.80622,508.77360 173.99283,510.51910 C 180.45745,511.22563 181.64578,513.24729 182.55810,519.59489 z "
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
<path
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 184.40776,541.79081 C 184.40776,541.79081 204.14359,541.28466 204.17177,530.57363 C 204.19545,521.57077 190.01133,521.74526 182.77183,522.52083 C 182.37141,527.93030 182.65588,530.96952 175.84249,532.71502 C 182.30711,533.42155 183.49544,535.44321 184.40776,541.79081 z "
id="path15971"
sodipodi:nodetypes="csccc" />
<path
sodipodi:nodetypes="csccc"
id="path15973"
d="M 184.54511,562.87630 C 184.54511,562.87630 204.25568,563.99547 205.16493,553.32306 C 205.92917,544.35267 191.77877,543.35968 184.50001,543.53705 C 183.65592,548.89525 183.68940,551.94757 176.75551,553.12663 C 183.14009,554.36259 184.15808,556.47516 184.54511,562.87630 z "
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
<path
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 182.96875 564.81250 C 182.32423 568.90383 182.11368 571.62362 179.00000 573.21875 C 187.45278 572.83281 195.60321 572.57296 203.34375 572.43750 C 201.75888 565.52893 189.59312 564.65108 182.96875 564.81250 z "
id="path15975" />
<path
sodipodi:nodetypes="csccc"
id="path15977"
d="M 159.98437,513.05560 C 159.98437,513.05560 179.54898,510.41269 178.41571,499.76174 C 177.46318,490.80938 164.07633,494.00942 156.96360,495.56532 C 157.15202,500.98633 157.06958,502.48804 150.48559,504.96194 C 156.98871,504.96342 158.38922,506.84433 159.98437,513.05560 z "
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
<path
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 162.14231,533.71013 C 162.14231,533.71013 181.70692,531.06722 180.57365,520.41627 C 179.62112,511.46391 165.53952,513.17520 158.42679,514.73110 C 158.61521,520.15211 159.22752,523.14257 152.64353,525.61647 C 159.14665,525.61795 160.54716,527.49886 162.14231,533.71013 z "
id="path15979"
sodipodi:nodetypes="csccc" />
<path
sodipodi:nodetypes="csccc"
id="path15981"
d="M 161.73793,553.35464 C 161.73793,553.35464 181.48022,553.38736 181.80074,542.68108 C 182.07015,533.68222 167.88654,533.46950 160.62858,534.04718 C 160.08065,539.44372 160.28207,542.48957 153.42357,544.04844 C 159.86650,544.93116 160.99920,546.98451 161.73793,553.35464 z "
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
<path
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 160.85077,573.63589 C 160.85077,573.63589 180.55493,574.86270 181.52246,564.19542 C 182.33569,555.22933 168.19092,554.15908 160.91130,554.29668 C 160.03796,559.65019 160.05477,562.70265 153.11454,563.84381 C 159.49228,565.11464 160.49870,567.23275 160.85077,573.63589 z "
id="path15983"
sodipodi:nodetypes="csccc" />
<path
sodipodi:nodetypes="csccc"
id="path15987"
d="M 141.03633,527.19872 C 141.03633,527.19872 159.26152,523.13440 157.31335,513.12248 C 155.67587,504.70724 142.54253,507.45143 135.96590,509.49341 C 136.59135,514.62008 137.41560,517.40771 131.41325,520.27830 C 137.54385,519.76200 139.01949,521.43450 141.03633,527.19872 z "
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
<path
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 141.31895,546.24122 C 141.31895,546.24122 159.85370,543.97419 158.89150,533.81997 C 158.08275,525.28513 144.74435,526.73505 137.99989,528.12573 C 138.12224,533.28896 138.67062,536.14371 132.41687,538.41507 C 138.56859,538.49928 139.87404,540.30775 141.31895,546.24122 z "
id="path15989"
sodipodi:nodetypes="csccc" />
<path
sodipodi:nodetypes="csccc"
id="path15991"
d="M 140.64248,564.70916 C 140.64248,564.70916 159.29210,563.77735 159.06068,553.58027 C 158.86616,545.00940 145.45812,545.49891 138.63128,546.40227 C 138.38299,551.56098 138.72521,554.44771 132.32465,556.26467 C 138.45449,556.78989 139.62687,558.68734 140.64248,564.70916 z "
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
<path
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 139.81250 565.50000 C 139.07109 570.61119 139.13895 573.52338 132.59375 574.71875 C 134.51034 575.07033 135.80011 575.55551 136.84375 576.18750 C 143.66955 575.48857 151.25972 574.88782 159.43750 574.34375 C 159.75612 566.05514 146.61893 565.25757 139.81250 565.50000 z "
id="path15995" />
<path
sodipodi:nodetypes="csccc"
id="path15997"
d="M 120.55759,539.29735 C 120.55759,539.29735 138.57310,536.58485 137.29636,527.11255 C 136.22320,519.15085 123.25243,520.93302 116.71571,522.44950 C 117.00680,527.27769 117.63697,529.93188 111.60849,532.25691 C 117.61570,532.13961 118.95000,533.79049 120.55759,539.29735 z "
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
<path
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 120.00330,557.06167 C 120.00330,557.06167 138.19701,556.11039 137.84559,546.55890 C 137.55019,538.53063 124.46769,539.04557 117.81465,539.92050 C 117.63579,544.75414 118.00539,547.45696 111.77972,549.18595 C 117.76996,549.65221 118.93774,551.42479 120.00330,557.06167 z "
id="path15999"
sodipodi:nodetypes="csccc" />
<path
sodipodi:nodetypes="csccc"
id="path16003"
d="M 120.31158,575.55827 C 120.31158,575.55827 138.50529,574.60699 138.15387,565.05550 C 137.85847,557.02723 124.77597,557.54217 118.12293,558.41710 C 117.94407,563.25074 118.31367,565.95356 112.08800,567.68255 C 118.07824,568.14881 119.24602,569.92139 120.31158,575.55827 z "
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
<path
id="path16013"
d="M 196.03125 482.84375 C 187.52447 485.04283 179.42599 487.56587 171.87500 490.34375 C 176.36725 491.29017 177.56746 493.45549 178.37500 498.96875 C 178.37500 498.96874 198.12565 498.39857 198.12500 487.68750 C 198.12488 485.59722 197.29605 484.04852 196.03125 482.84375 z "
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
<path
style="fill:url(#linearGradient2121);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2.9830000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;opacity:0.85000000;color:#000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0;visibility:visible;display:inline;overflow:visible"
d="M 118.59268,523.92715 C 107.25662,543.11126 111.61664,542.23925 121.20870,539.62324 C 130.80075,537.00722 199.68915,522.18314 209.28120,524.79915 C 218.87326,527.41517 232.82534,523.92715 235.44135,513.46309 C 238.05737,502.99903 238.77435,497.54307 250.24821,501.98922 C 269.16027,509.31769 305.20175,516.07910 319.15383,518.69512 C 333.10591,521.31113 348.80200,533.51920 371.47413,520.43913 C 394.14627,507.35905 412.54953,496.39061 421.17842,489.91895 C 422.92243,488.61095 428.62957,475.76353 430.50800,471.34729 C 431.44721,469.13918 439.39286,464.86685 438.95096,463.74334 C 438.50906,462.61984 433.93678,464.55570 429.23763,467.66914 C 424.38217,470.88614 421.27227,486.21977 415.16824,488.83579 C 409.06420,491.45180 389.78624,502.12702 381.93820,508.23106 C 374.09015,514.33509 353.16203,526.54316 339.20995,519.56712 C 325.25787,512.59108 320.02584,499.51101 308.68977,491.66296 C 297.35371,483.81492 248.52143,468.11882 190.09709,487.30294 C 131.67276,506.48705 129.05674,513.46309 118.59268,523.92715 z "
id="path1387"
sodipodi:nodetypes="csssssssszssssssc" />
<path
id="path16018"
d="M 139.81250 565.50000 C 139.07109 570.61119 139.13895 573.52338 132.59375 574.71875 C 134.51034 575.07033 135.80011 575.55551 136.84375 576.18750 C 143.66955 575.48857 151.25972 574.88782 159.43750 574.34375 C 159.75612 566.05514 146.61893 565.25757 139.81250 565.50000 z "
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
<path
id="path16023"
d="M 182.96875 564.81250 C 182.32423 568.90383 182.11368 571.62362 179.00000 573.21875 C 187.45278 572.83281 195.60321 572.57296 203.34375 572.43750 C 201.75888 565.52893 189.59312 564.65108 182.96875 564.81250 z "
style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
<path
sodipodi:nodetypes="csccscssscssscss"
id="path16026"
d="M 277.93750,472.69581 C 277.55554,472.60932 277.17096,472.55316 276.78125,472.47706 C 276.32712,472.41403 275.87541,472.36098 275.43750,472.32081 C 273.72290,472.04335 272.38271,473.70349 270.51899,473.63452 C 186.03183,473.32884 117.33411,508.62334 108.09375,537.32081 C 100.42250,561.14521 89.846437,628.73395 85.603534,650.88478 C 84.817635,650.58579 83.961816,650.38478 83.072284,650.38478 C 78.991969,650.38476 75.697281,653.82002 75.697284,658.04103 C 75.697282,662.26202 78.991971,665.66604 83.072284,665.66603 C 85.894372,665.66601 88.264466,663.97946 89.509784,661.57228 C 90.610880,664.27225 93.227950,666.19729 96.322284,666.19728 C 100.40259,666.19726 103.72853,662.87136 103.72853,658.79103 C 103.72853,654.71070 100.40259,651.41602 96.322284,651.41603 C 96.311560,651.41603 96.301744,651.41598 96.291034,651.41603 C 96.958087,647.80628 107.04943,590.82074 111.61669,581.08887 C 114.61685,574.69618 238.84164,568.85811 240.75000,574.72706"
style="fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3e7e42;stroke-width:2.9830000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000" />
<path
style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.4350000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke-dasharray:none"
d="M 264.36900,453.69048 C 254.12520,453.88747 248.21531,462.55530 252.94322,469.64717 C 257.67113,476.73904 275.79479,475.75405 278.15875,468.46519 C 280.52270,461.17633 270.47589,452.90249 264.36900,453.69048 z "
id="path7197"
sodipodi:nodetypes="cssc" />
<path
id="path7933"
d="M 267.08631,465.48980 C 272.73936,464.34915 271.50467,460.81573 269.28413,458.04415 C 267.06360,455.27256 261.79147,456.90613 261.90136,460.20656 C 262.01124,463.50699 262.96803,465.05075 267.08631,465.48980 z "
style="fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
<path
style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.4350000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke-dasharray:none"
d="M 297.07874,475.12108 C 299.24958,464.52072 293.46063,459.97771 284.05361,459.22055 C 274.64658,458.46337 263.06871,463.00639 267.41041,470.57806 C 271.75211,478.14976 290.56616,488.75011 297.07874,475.12108 z "
id="path1323" />
<path
style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.4350000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke-dasharray:none"
d="M 242.39530,460.52578 C 233.60908,465.79612 232.79847,476.25561 240.42934,480.05267 C 248.06021,483.84972 263.28824,473.97327 261.70998,466.47495 C 260.13171,458.97663 247.29944,456.80228 242.39530,460.52578 z "
id="path7199"
sodipodi:nodetypes="cssc" />
<path
style="fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 243.68431,469.83581 C 245.28249,475.37691 248.70337,473.85799 251.28448,471.41867 C 253.86561,468.97936 251.80723,463.85812 248.52678,464.23699 C 245.24633,464.61586 243.78580,465.69544 243.68431,469.83581 z "
id="path7935" />
<path
style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.4350000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke-dasharray:none"
d="M 271.68386,472.17278 C 265.53310,466.49400 252.86981,463.08675 249.25172,469.90126 C 245.63364,476.71576 247.80448,490.34482 260.82959,489.58764 C 273.85471,488.83047 277.83459,477.85155 271.68386,472.17278 z "
id="path1321"
sodipodi:nodetypes="czzz" />
<path
style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.4350000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke-dasharray:none"
d="M 277.96176,469.45019 C 270.27891,470.04118 265.35400,478.90602 271.06689,482.84594 C 276.77978,486.78587 288.59956,486.78587 289.58454,479.30001 C 290.56952,471.81415 284.26564,469.25320 277.96176,469.45019 z "
id="path7195" />
<path
style="fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 262.20205,471.61714 C 256.48916,470.82916 256.48916,474.57209 257.67114,477.92102 C 258.85311,481.26996 264.36901,481.46696 265.35399,478.31502 C 266.33897,475.16308 265.94498,473.39011 262.20205,471.61714 z "
id="path7927" />
<path
id="path7929"
d="M 283.40203,472.86341 C 278.97987,472.29768 278.97987,474.98495 279.89481,477.38933 C 280.80972,479.79372 285.07940,479.93516 285.84184,477.67220 C 286.60427,475.40925 286.29931,474.13633 283.40203,472.86341 z "
style="fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.74548370px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
<path
style="fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 287.01749,462.95586 C 281.94580,465.70104 284.16055,468.71839 287.09502,470.71872 C 290.02948,472.71907 294.59267,469.61404 293.52166,466.49028 C 292.45064,463.36653 291.08393,462.17038 287.01749,462.95586 z "
id="path7931" />
<path
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 157.32993,388.01687 C 240.06214,383.69759 287.32367,387.19261 345.54264,390.07213"
id="path3573"
sodipodi:nodetypes="cs" />
<path
style="fill:url(#linearGradient7979);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2.9830000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;opacity:0.52777778;color:#000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.00000000;visibility:visible;display:inline;overflow:visible"
d="M 299.17307,535.22016 C 307.72087,538.63929 303.44697,563.42791 290.62527,565.13747 C 277.80356,566.84703 191.47076,569.41137 176.08472,570.26615 C 160.69868,571.12093 119.66923,576.24961 119.66923,576.24961 C 119.66923,576.24961 113.68577,571.12093 112.83099,565.99225 C 111.97621,560.86357 169.24648,551.46099 189.76120,550.60621 C 210.27593,549.75143 248.25830,537.79821 253.86971,540.34885 C 272.67489,548.89665 294.04439,536.92972 299.17307,535.22016 z "
id="path7245"
sodipodi:nodetypes="csscsssc" />
<path
style="fill:#86d973;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 453.19526,478.54252 C 450.22096,478.65268 448.56857,478.21204 448.01777,480.08475 C 447.46697,481.95746 449.44984,485.48255 450.66159,485.81303 C 451.87335,486.14351 455.50860,483.72001 455.72892,482.06762 C 455.94924,480.41523 454.95780,479.20348 453.19526,478.54252 z "
id="path8715" />
<path
style="fill:#86d973;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
d="M 451.76319,491.54131 C 449.56000,490.21940 445.15363,489.66861 444.49267,490.54988 C 443.83172,491.43116 447.35681,491.98195 446.58570,493.74450 C 445.81459,495.50705 444.27236,495.28673 443.72156,496.05784 C 443.17076,496.82896 442.17933,498.15087 443.28092,498.92199 C 444.38251,499.69310 452.20382,498.26103 452.86478,497.15944 C 453.52573,496.05784 455.61876,493.41402 451.76319,491.54131 z "
id="path8717" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

5
static/js/jquery-1.9.1.min.js vendored Normal file

File diff suppressed because one or more lines are too long

170
static/js/quickdocs.js Normal file
View file

@ -0,0 +1,170 @@
var Quickdocs = Quickdocs || {};
(function($, Quickdocs) {
if (Quickdocs.init) return;
Quickdocs.init = $.Deferred(function() { $(this.resolve); }).promise();
Quickdocs.getCurrentScrollEl = function(jqObj) {
var scrollTop = $(document).scrollTop();
return _.chain($(jqObj))
.filter(function(el) { return scrollTop > $(el).position().top; })
.last()
.value();
};
Quickdocs.breadcrumbTimer_ = undefined;
Quickdocs.updateBreadcrumbHeader = function() {
var el = Quickdocs.getCurrentScrollEl('.system');
if (el) {
var $el = $(el);
var breadcrumb = $('.breadcrumb-header-container');
breadcrumb.children('.system-name, .package-name').remove();
var currentSystem = $el.find('header h1').text();
var systemLink = $('<li class="system-name">')
.append($('<a href="#system-' + currentSystem + '">')
.text(currentSystem));
breadcrumb.append(systemLink);
var packageEl = Quickdocs.getCurrentScrollEl($el.find('.package'));
if (packageEl) {
var currentPackage = $(packageEl).find('h2').text();
var packageLink = $('<li class="package-name">')
.append($('<a href="#package-' + currentPackage + '">')
.text(currentPackage));
packageLink.addClass('current');
breadcrumb.append(packageLink);
}
else {
systemLink.addClass('current');
}
$('.breadcrumb-header-container').show().css({ opacity: 0.7 });
$('.pager-link-container').show();
if (Quickdocs.breadcrumbTimer_ !== undefined) {
clearTimeout(Quickdocs.breadcrumbTimer_);
}
Quickdocs.breadcrumbTimer_ = setTimeout(function() {
$('.breadcrumb-header-container').css({ opacity: 0.5 }, 100);
Quickdocs.breadcrumbTimer_ = undefined;
}, 200);
}
else {
$('.breadcrumb-header-container').hide();
$('.pager-link-container').hide();
}
};
$(document).on('scroll', Quickdocs.updateBreadcrumbHeader);
Quickdocs.smoothScrollTo = function(el, opt_speed) {
var speed = opt_speed || 300;
var $el = $(el);
if ($el.length !== 0) {
var position = $el.offset().top;
$(/safari/i.test(navigator.userAgent) ? 'body' : 'html').animate({
scrollTop: position
}, speed, 'swing', function() {
var id = $el.attr('id');
if (!id) {
id = $el.find('h1,h2').attr('id');
}
if (id && window.history && window.history.pushState) {
history.pushState({}, null, '#'+id);
}
});
}
};
$(document).on('click', 'a[href^=#]', function(e) {
e.preventDefault();
var href = $(this).attr("href");
href = href.replace(/\./g, '\\.');
var target = $(href == "#" || href == "" ? 'html' : href);
Quickdocs.smoothScrollTo(target);
});
$(document).on('click', '.error-open-detail', function(e) {
var detail = $(this).hide().closest('.error').find('.error-detail');
var height = detail.height();
detail.css({
height: 0
}).show().animate({'height': height}, 200);
});
Quickdocs.getPrevComponent = function(el) {
var $el = $(el);
if ($el.hasClass('package')) {
var prev = $el.prev('.package');
if (prev.length === 0) {
return $el.closest('.system');
}
return prev;
}
else if ($el.hasClass('system')) {
var prev = $el.prev('.system');
if (prev.length === 0) {
return $('#global-header');
}
return prev;
}
return $el;
};
Quickdocs.getNextComponent = function(el) {
var $el = $(el);
if ($el.hasClass('package')) {
var next = $el.next('.package');
if (next.length === 0) {
next = $el.closest('.system').next('.system');
if (next.length === 0) {
return $('#global-footer');
}
}
return next;
}
else if ($el.hasClass('system')) {
var next = $el.find('.package').first();
if (next.length === 0) {
return $('#global-footer');
}
return next;
}
return $el;
};
$(document).on('click', '.pager-link', function(e) {
var target = $(e.target);
var current = $('.breadcrumb-header-container .current a').attr('href');
current = current.replace(/\./g, '\\.');
if (target.attr('title') === 'up') {
var scrollTo = Quickdocs.getPrevComponent($(current).closest('.package, .system'));
Quickdocs.smoothScrollTo(scrollTo);
}
else if (target.attr('title') === 'down') {
var scrollTo = Quickdocs.getNextComponent($(current).closest('.package, .system'));
Quickdocs.smoothScrollTo(scrollTo);
}
});
Quickdocs.init.done(function() {
$('.folding-list').each(function(i, list) {
var rows = $(list).children('li');
if (rows.length > 3) {
rows.slice(3).hide();
var loadMore = $('<a class="lsf">down</a>').on('click', function() {
var parent = $(this).closest('li');
parent.siblings('li:hidden').fadeIn();
parent.hide();
});
$('<li class="load-more">').append(loadMore).appendTo(list);
}
});
});
}).call(this, jQuery, Quickdocs);

1
static/js/underscore-min.js vendored Normal file

File diff suppressed because one or more lines are too long

BIN
static/lisp-logo300x100.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,36 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<link rel="shortcut icon" href="/favicon.ico" />
<title>Quickdocs</title>
<link rel="stylesheet" type="text/css" href="/css/LigatureSymbols/style.css" />
<link rel="stylesheet" type="text/css" href="/css/main.css" />
<link rel="stylesheet" type="text/css" href="/css/error.css" />
</head>
<body>
<div id="container">
<div id="global-header">
<h1 class="logo"><a href="/">Quickdocs</a></h1>
<form class="search-form" method="get" action="/search">
<input type="text" name="q" value="" placeholder="Search for projects" />
<input type="submit" class="lsf" value="search" />
</form>
</div>
<div id="content">
<div class="error-message">
<h2>Page not found</h2>
</div>
</div>
<div id="global-footer">
&copy; 2013-2015 <a href="http://8arrow.org/">Eitaro Fukamachi</a>
<div class="lisp-logo"></div>
</div>
</div>
</body>
</html>

123
templates/api.html Normal file
View file

@ -0,0 +1,123 @@
{% extends "layouts/default.html" %}
{% block title %}{{ project-name }} | Quickdocs{% endblock %}
{% block css %}
<link rel="stylesheet" type="text/css" media="screen" href="/css/main.css">
{% endblock %}
{% block content %}
<header>
<h2 class="project-name"><a href="/{{ project-name }}/">{{ project-name }}</a></h2>
<span class="subtitle">API Reference</span>
{% include "partials/header-links.html" %}
</header>
<nav class="toc-systems">
<header><h2>Systems</h2></header>
<dl>
{% for system in systems %}
<dt><a href="#system-{{ system.name }}">{{ system.name }}</a></dt>
{% if system.description %}
<dd class="one-line-description">{{ system.description }}</dd>
{% endif %}
{% endfor %}
</dl>
</nav>
{% for system in systems %}
<article class="system">
<nav class="toc">
<h3>Package Index</h3>
<ul class="toc-packages">
{% for package in system.packages %}
<li><a href="#package-{{ package.name }}" title="{{ package.name }}">{{ package.name }}</a></li>
{% endfor %}
</ul>
</nav>
<header>
<h1 id="system-{{ system.name }}">{{ system.name }}</h1>
{% if system.description %}
<p class="description">{{ system.description }}</p>
{% endif %}
</header>
<div class="api">
{% for package in system.packages %}
<section class="package">
<h2 id="package-{{ package.name }}">{{ package.name }}</h2>
{% if package.docstring %}
<div class="docstring"><pre>{{ package.docstring }}</pre></div>
{% endif %}
<ul>
{% for symbol in package.symbols %}
{% if symbol.externalp %}
<li class="symbol">
<span class="symbol-type label {{ symbol.type }}">{{ symbol.type | capfirst }}</span>
<code class="symbol-name">
{% if symbol.setfp %}
(setf {{ symbol.name }})
{% else %}
{{ symbol.name }}
{% endif %}
</code>
{% if symbol.lambda-list %}
<span class="lambda-list">
{{ symbol.lambda-list | lambda-list | safe }}
</span>
{% endif %}
{% if symbol.initial-value %}
{% endif %}
<div class="docstring">{{ symbol.docstring }}</div>
{% if symbol.type == "class" %}
{% if symbol.slots %}
<dl class="slot-list">
{% for slot in symbol.slots %}
<dt>
<code class="symbol-name">{{ slot.name | symbol }}</code>
{% if slot.accessors %}
<span class="label">Accessor</span>:
{% for accessor in slot.accessors %}
<code class="symbol-name">{{ accessor }}</code>{% if not forloop.last %} {% endif %}
{% endfor %}
{% endif %}
{% if slot.readers %}
<span class="label">Reader</span>:
{% for reader in slot.readers %}
<code class="symbol-name">{{ reader }}</code>{% if not forloop.last %} {% endif %}
{% endfor %}
{% endif %}
{% if slot.writers %}
<span class="label">Writer</span>:
{% for writer in slot.writer %}
<code class="symbol-name">{{ writer }}</code>{% if not forloop.last %} {% endif %}
{% endfor %}
{% endif %}
</dt>
{% if slot.docstring %}
<dd>{{ slot.docstring }}</dd>
{% endif %}
{% endfor %}
</dl>
{% else %}
No slots
{% endif %}
{% endif %}
</li>
{% endif %}
{% endfor %}
</ul>
</section>
{% endfor %}
</div>
</article>
{% endfor %}
{% include "partials/footer.html" %}
<ul class="breadcrumb-header-container" style="display: none">
<li><a href="#global-header" class="top-link lsf">home</a></li>
</ul>
<div class="pager-link-container" style="display: none">
<a class="pager-link lsf-icon" title="up">Prev</a>
<a class="pager-link lsf-icon" title="down">Next</a>
</div>
{% endblock %}

70
templates/index.html Normal file
View file

@ -0,0 +1,70 @@
{% extends "layouts/default.html" %}
{% block title %}Quickdocs{% endblock %}
{% block css %}
<link rel="stylesheet" type="text/css" media="screen" href="/css/index.css">
{% endblock %}
{% block content %}
<section class="search-libraries">
<h2>Library Documentation Hosting<br/>for Common Lisp</h2>
<div class="categories">
<h3>Search by Category</h3>
<ul>
<li><a href="/search?q=web" class="lsf-icon" title="web">Web development</a></li>
<li><a href="/search?q=graphics" class="lsf-icon" title="image">Graphics</a></li>
<li><a href="/search?q=GUI" class="lsf-icon" title="tile">GUI</a></li>
<li><a href="/search?q=system+programming" class="lsf-icon" title="setup">System &amp; Low-level</a></li>
<li><a href="/search?q=test" class="lsf-icon" title="check">Testing framework</a></li>
<li><a href="/search?q=database" class="lsf-icon" title="server">Database</a></li>
<li><a href="/search?q=utilities" class="lsf-icon" title="twinkle">Utility Collection</a></li>
<li><a href="/search?q=concurrency" class="lsf-icon" title="shuffle">Concurrency</a></li>
</ul>
</div>
</section>
<section class="catch">
<div class="catch-copy">
<strong>Ready</strong> and <strong>Up-to-Date</strong><br/>
Documentation<br/>
for All Common Lisp Projects.
</div>
<img class="screen-shot" src="/images/screen-shot.png" />
</section>
<section class="teasers">
<div class="teaser">
<div class="lsf teaser-icon">network</div>
<h3>Same place, same appearance</h3>
<p>Don't waste your time looking around for documentation; all CL documentation is here, with the same appearance.</p>
</div>
<div class="teaser">
<div class="lsf teaser-icon">time</div>
<h3>Always up-to-date</h3>
<p>All documentation is generated automatically, moments after the monthly Quicklisp updates.</p>
</div>
<div class="teaser">
<div class="lsf teaser-icon">code</div>
<h3>Code is eloquent</h3>
<p>Other documentation generators destroy code structure and context. They split symbols by their types and simply arrange them in alphabetical order.</p>
<p>While such documentation may be easy to use as an index, it is not suitable for a quick look at or overview of a library.</p>
<p>Quickdocs respects the code and keeps its structure.</p>
</div>
</section>
<hr class="soften" />
<section class="contribution">
<h2>Contributing to Quickdocs</h2>
<p>Quickdocs is an open source project that is hosted on GitHub. Feel free to send pull requests, bug reports or suggestions.</p>
<a href="https://github.com/fukamachi/quickdocs" class="contribute-button" title="See Quickdocs on GitHub">See <strong class="logo">Quickdocs</strong> on <img src="/images/github.png" width="55px" height="15px" alt="GitHub" /></a>
</section>
<footer id="global-footer">
<a href="#global-header" class="back-to-top-link lsf-icon" title="arrowup">Back to Top</a>
<div class="dist-version">
Quicklisp: {{ ql-dist-version }}
</div>
<small>&copy; 2013-2015 <a href="http://8arrow.org/">Eitaro Fukamachi</a></small>
<div class="lisp-logo"></div>
</footer>
{% endblock %}

View file

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" type="text/css" href="/css/LigatureSymbols/style.css" />
{% block css %}{% endblock %}
<script type="text/javascript" src="/js/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="/js/underscore-min.js"></script>
<script type="text/javascript" src="/js/quickdocs.js"></script>
</head>
<body>
<div id="container">
{% include "partials/header.html" %}
<div id="content">
{% block content %}{% endblock %}
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,4 @@
<footer id="global-footer">
<small>&copy; 2013-2015 <a href="http://8arrow.org/">Eitaro Fukamachi</a></small>
<div class="lisp-logo"></div>
</footer>

View file

@ -0,0 +1,9 @@
<aside class="header-links">
{% if homepage %}
<a href="{{ homepage }}" class="lsf-icon" title="web">Website</a>
{% endif %}
{% if repos-url %}
<a href="{{ repos-url }}" class="lsf-icon" title="file">Source Code</a>
{% endif %}
<a href="{{ archive-url }}" class="lsf-icon" title="download">Download</a>
</aside>

View file

@ -0,0 +1,7 @@
<div id="global-header">
<h1 class="logo"><a href="/">Quickdocs</a></h1>
<form class="search-form" method="get" action="/search">
<input type="text" name="q" value="{{ query }}" placeholder="Search for projects" />
<input type="submit" class="lsf" value="search" />
</form>
</div>

98
templates/project.html Normal file
View file

@ -0,0 +1,98 @@
{% extends "layouts/default.html" %}
{% block title %}{{ project-name }} | Quickdocs{% endblock %}
{% block css %}
<link rel="stylesheet" type="text/css" media="screen" href="/css/main.css">
{% endblock %}
{% block content %}
<header>
<h2 class="project-name"><a href="/{{ project-name }}/">{{ project-name }}</a></h2>
<span class="subtitle ql-version">{{ ql-dist-version }}</span>
{% include "partials/header-links.html" %}
</header>
<article>
{% if readme %}
<section class="readme">
<div class="readme-body">{{ readme | safe }}</div>
</section>
{% endif %}
{% if authors or maintainers or licenses or categories %}
<section class="information">
<dl>
{% if authors %}
<dt>Author</dt>
<dd>{{ authors | join:", " }}</dd>
{% endif %}
{% if maintainers %}
<dt>Maintainer</dt>
<dd>{{ maintainers | join:", " }}</dd>
{% endif %}
{% if licenses %}
<dt>License</dt>
<dd>{{ licenses | join:", " }}</dd>
{% endif %}
{% if categories %}
<dt>Categories</dt>
<dd>
{% for category in categories %}
<a href="/search?q={{ category }}">{{ category }}</a>{% if not forloop.last %}, {% endif %}
{% endfor %}
</dd>
{% endif %}
</dl>
</section>
{% endif %}
<aside class="dependencies">
<h3>Requirements</h3>
<span class="count">{{ dependencies-count }}</span>
{% if dependencies %}
<ul class="folding-list">
{% for dependency in dependencies %}
<li>
<a href="/{{ dependency.name }}">
<span class="name">{{ dependency.name }}</span>
<span class="description">{{ dependency.description }}</span>
</a>
</li>
{% endfor %}
</ul>
{% else %}
<em class="none">None.</em>
{% endif %}
</aside>
<aside class="depending">
<h3>Required by</h3>
<span class="count">{{ dependees | length }}</span>
{% if dependees %}
<ul class="folding-list">
{% for dependee in dependees %}
<li>
<a href="/{{ dependee.name }}">
<span class="name">{{ dependee.name }}</span>
<span class="description">{{ dependee.description }}</span>
</a>
</li>
{% endfor %}
</ul>
{% endif %}
</aside>
<aside class="links">
<h3>Links</h3>
<ul>
<li><a href="/{{ project-name }}/api">API Reference</a></li>
{% if homepage %}
<li><a href="{{ homepage }}">Website</a></li>
{% endif %}
{% if repos-url %}
<li><a href="{{ repos-url }}">Source Code</a></li>
{% endif %}
</ul>
</aside>
</article>
{% include "partials/footer.html" %}
{% endblock %}

38
templates/search.html Normal file
View file

@ -0,0 +1,38 @@
{% extends "layouts/default.html" %}
{% block title %}Search Results | Quickdocs{% endblock %}
{% block css %}
<link rel="stylesheet" type="text/css" media="screen" href="/css/main.css">
{% endblock %}
{% block content %}
<header>
{% if query == "" %}
<h2>All {{ projects | length }} Projects</h2>
{% else %}
<h2>Search Results</h2>
<div class="search-query">for <strong>{{ query }}</strong></span>
{% endif %}
<br />
</header>
{% if query != "" %}
<p class="search-results-summary"><strong>{{ projects | length }}</strong> projects are found.</p>
{% endif %}
{% if projects %}
<ul class="search-result-container">
{% for project in projects %}
<li class="search-result">
<span class="project-name">
<a href="/{{ project.name }}/">{{ project.name }}</a>
</span>
<span class="ql-version">
{{ project.release-version }}
</span>
<p class="description">{{ project.description }}</p>
</li>
{% endfor %}
</ul>
{% endif %}
{% include "partials/footer.html" %}
{% endblock %}