├── views ├── me │ └── default.html ├── article │ ├── draft.html │ ├── by_catalog.html │ ├── read.html │ ├── add.html │ └── edit.html ├── inc │ └── paginator.html ├── index.html ├── catalog │ ├── add.html │ └── edit.html ├── layout │ ├── admin.html │ └── default.html └── login │ └── login.html ├── static ├── favicon.ico ├── fonts │ ├── icons.eot │ ├── icons.otf │ ├── icons.ttf │ ├── icons.woff │ ├── basic.icons.eot │ ├── basic.icons.ttf │ ├── basic.icons.woff │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.ttf │ └── glyphicons-halflings-regular.woff ├── images │ ├── code.png │ ├── guy.jpg │ ├── social │ │ ├── rss.png │ │ ├── email.png │ │ ├── weibo.png │ │ ├── douban.png │ │ ├── facebook.png │ │ ├── github.png │ │ ├── google.png │ │ ├── linkedin.png │ │ ├── pinboard.png │ │ ├── twitter.png │ │ ├── coderwall.png │ │ ├── delicious.png │ │ ├── pinterest.png │ │ └── stackoverflow.png │ ├── loader-large.gif │ ├── loader-mini.gif │ ├── loader-small.gif │ ├── loader-medium.gif │ ├── loader-mini-inverted.gif │ ├── loader-large-inverted.gif │ ├── loader-medium-inverted.gif │ └── loader-small-inverted.gif ├── font │ ├── FontAwesome.otf │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.ttf │ └── fontawesome-webfont.woff ├── javascript │ ├── jquery.cookie.js │ ├── autosize.js │ ├── md5.js │ ├── jstorage.min.js │ ├── app.min.js │ ├── bootstrap.min.js │ └── prettify.js └── css │ ├── prettify.css │ ├── vibrant-ink.css │ ├── tomorrow-night-eighties.css │ ├── markdown.css │ ├── g.css │ ├── bootstrap-theme.min.css │ └── ee22d.css ├── .gitignore ├── start_in_paas ├── main.go ├── controllers ├── admin_controller.go ├── me_controller.go ├── login_controller.go ├── main_controller.go ├── api_controller.go ├── base_controller.go ├── catalog_controller.go └── article_controller.go ├── README.md ├── g ├── qiniu.go ├── cache.go ├── cfg.go ├── markdown.go └── g.go ├── conf └── app.conf ├── LICENSE ├── db.sql ├── routers └── router.go └── models ├── models.go ├── catalog └── catalog.go └── blog └── blog.go /views/me/default.html: -------------------------------------------------------------------------------- 1 | 这是后台页面 -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/favicon.ico -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.exe 2 | *.exe~ 3 | *.iml 4 | .idea 5 | *.swap 6 | beego-blog 7 | /static/uploads 8 | -------------------------------------------------------------------------------- /static/fonts/icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/fonts/icons.eot -------------------------------------------------------------------------------- /static/fonts/icons.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/fonts/icons.otf -------------------------------------------------------------------------------- /static/fonts/icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/fonts/icons.ttf -------------------------------------------------------------------------------- /static/fonts/icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/fonts/icons.woff -------------------------------------------------------------------------------- /static/images/code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/code.png -------------------------------------------------------------------------------- /static/images/guy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/guy.jpg -------------------------------------------------------------------------------- /start_in_paas: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | 3 | sed -i -e "s/8999/$VCAP_APP_PORT/g" conf/app.conf 4 | ./beego-blog -------------------------------------------------------------------------------- /static/font/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/font/FontAwesome.otf -------------------------------------------------------------------------------- /static/fonts/basic.icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/fonts/basic.icons.eot -------------------------------------------------------------------------------- /static/fonts/basic.icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/fonts/basic.icons.ttf -------------------------------------------------------------------------------- /static/images/social/rss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/social/rss.png -------------------------------------------------------------------------------- /views/article/draft.html: -------------------------------------------------------------------------------- 1 | {{range .Blogs}} 2 | {{.Title}}
3 | {{end}} -------------------------------------------------------------------------------- /static/fonts/basic.icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/fonts/basic.icons.woff -------------------------------------------------------------------------------- /static/images/loader-large.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/loader-large.gif -------------------------------------------------------------------------------- /static/images/loader-mini.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/loader-mini.gif -------------------------------------------------------------------------------- /static/images/loader-small.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/loader-small.gif -------------------------------------------------------------------------------- /static/images/social/email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/social/email.png -------------------------------------------------------------------------------- /static/images/social/weibo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/social/weibo.png -------------------------------------------------------------------------------- /static/images/loader-medium.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/loader-medium.gif -------------------------------------------------------------------------------- /static/images/social/douban.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/social/douban.png -------------------------------------------------------------------------------- /static/images/social/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/social/facebook.png -------------------------------------------------------------------------------- /static/images/social/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/social/github.png -------------------------------------------------------------------------------- /static/images/social/google.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/social/google.png -------------------------------------------------------------------------------- /static/images/social/linkedin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/social/linkedin.png -------------------------------------------------------------------------------- /static/images/social/pinboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/social/pinboard.png -------------------------------------------------------------------------------- /static/images/social/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/social/twitter.png -------------------------------------------------------------------------------- /static/font/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/font/fontawesome-webfont.eot -------------------------------------------------------------------------------- /static/font/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/font/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /static/images/social/coderwall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/social/coderwall.png -------------------------------------------------------------------------------- /static/images/social/delicious.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/social/delicious.png -------------------------------------------------------------------------------- /static/images/social/pinterest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/social/pinterest.png -------------------------------------------------------------------------------- /static/font/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/font/fontawesome-webfont.woff -------------------------------------------------------------------------------- /static/images/loader-mini-inverted.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/loader-mini-inverted.gif -------------------------------------------------------------------------------- /static/images/social/stackoverflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/social/stackoverflow.png -------------------------------------------------------------------------------- /static/images/loader-large-inverted.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/loader-large-inverted.gif -------------------------------------------------------------------------------- /static/images/loader-medium-inverted.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/loader-medium-inverted.gif -------------------------------------------------------------------------------- /static/images/loader-small-inverted.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/images/loader-small-inverted.gif -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/beego-blog/master/static/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "github.com/astaxie/beego" 5 | "github.com/ulricqin/beego-blog/g" 6 | _ "github.com/ulricqin/beego-blog/routers" 7 | ) 8 | 9 | func main() { 10 | g.InitEnv() 11 | beego.Run() 12 | } 13 | -------------------------------------------------------------------------------- /controllers/admin_controller.go: -------------------------------------------------------------------------------- 1 | package controllers 2 | 3 | type AdminController struct { 4 | BaseController 5 | } 6 | 7 | func (this *AdminController) CheckLogin() { 8 | if !this.IsAdmin { 9 | this.Redirect("/login", 302) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /controllers/me_controller.go: -------------------------------------------------------------------------------- 1 | package controllers 2 | 3 | type MeController struct { 4 | AdminController 5 | } 6 | 7 | func (this *MeController) Default() { 8 | this.Layout = "layout/admin.html" 9 | this.TplName = "me/default.html" 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | beego-blog 2 | ========== 3 | 4 | ulricqin's blog use beego framework 5 | 6 | ## install 7 | 8 | ``` 9 | mkdir -p $GOPATH/src/github.com/ulricqin 10 | cd $GOPATH/src/github.com/ulricqin 11 | git clone https://github.com/UlricQin/beego-blog.git 12 | go get github.com/ulricqin/beego-blog/... 13 | cd beego-blog && modify conf/app.conf 14 | bee run 15 | ``` 16 | 17 | ## admin 18 | 19 | ``` 20 | url: /me 21 | username: UlricQin 22 | password: a 23 | ``` -------------------------------------------------------------------------------- /g/qiniu.go: -------------------------------------------------------------------------------- 1 | package g 2 | 3 | import ( 4 | "github.com/qiniu/api.v6/io" 5 | "github.com/qiniu/api.v6/rs" 6 | ) 7 | 8 | func UploadFile(localFile string, destName string) (addr string, err error) { 9 | policy := new(rs.PutPolicy) 10 | policy.Scope = QiniuScope 11 | uptoken := policy.Token(nil) 12 | 13 | var ret io.PutRet 14 | var extra = new(io.PutExtra) 15 | err = io.PutFile(nil, &ret, uptoken, destName, localFile, extra) 16 | if err != nil { 17 | return 18 | } 19 | addr = "http://" + QiniuScope + ".qiniudn.com/" + destName 20 | return 21 | } 22 | -------------------------------------------------------------------------------- /conf/app.conf: -------------------------------------------------------------------------------- 1 | appname = beego-blog 2 | httpport = 8999 3 | runmode = dev 4 | 5 | log_level = debug 6 | 7 | db_user = root 8 | db_pass = 1234 9 | db_host = 127.0.0.1 10 | db_port = 3306 11 | db_name = beego_blog 12 | db_max_idle_conn = 30 13 | db_max_open_conn = 200 14 | 15 | blog_cache_expire = 36000 16 | catalog_cache_expire = 36000 17 | 18 | blog_logo = /static/images/guy.jpg 19 | blog_title = UlricQin's Blog 20 | blog_resume = 与其在悬崖上展览千年,不如在爱人肩头痛哭一晚 21 | root_name = UlricQin 22 | root_email = ulric.qin@gmail.com 23 | root_pass = 0cc175b9c0f1b6a831c399e269772661 24 | root_portrait = http://www.gravatar.com/avatar/53e51081371aabe00ec2eb0892683036?s=90&d=mm 25 | 26 | qiniu_scope = beego-blog 27 | qiniu_access_key = FBTj343W2dLepJ8_Q1nyTLkMxaqWSTdX9XjGxeyJ 28 | qiniu_secret_key = SV7AmWELo3pDyEPKNAufT0geOPFvkrbCw-khBrwE 29 | -------------------------------------------------------------------------------- /g/cache.go: -------------------------------------------------------------------------------- 1 | package g 2 | 3 | import "time" 4 | 5 | const ( 6 | blogPrefix = "b_" 7 | catalogPrefix = "c_" 8 | ) 9 | 10 | func BlogCachePut(key string, val interface{}) error { 11 | return Cache.Put(blogPrefix+key, val, time.Duration(blogCacheExpire)*time.Second) 12 | } 13 | 14 | func CatalogCachePut(key string, val interface{}) error { 15 | return Cache.Put(catalogPrefix+key, val, time.Duration(catalogCacheExpire)*time.Second) 16 | } 17 | 18 | func BlogCacheGet(key string) interface{} { 19 | return Cache.Get(blogPrefix + key) 20 | } 21 | 22 | func CatalogCacheGet(key string) interface{} { 23 | return Cache.Get(catalogPrefix + key) 24 | } 25 | 26 | func CatalogCacheDel(key string) error { 27 | return Cache.Delete(catalogPrefix + key) 28 | } 29 | 30 | func BlogCacheDel(key string) error { 31 | return Cache.Delete(blogPrefix + key) 32 | } 33 | 34 | 35 | -------------------------------------------------------------------------------- /views/inc/paginator.html: -------------------------------------------------------------------------------- 1 | {{if gt .paginator.PageNums 1}} 2 | 25 | {{end}} 26 | -------------------------------------------------------------------------------- /views/article/by_catalog.html: -------------------------------------------------------------------------------- 1 |
2 | {{range .Blogs}} 3 |
4 |

5 | 6 |

7 |
{{.Views}}
8 | 9 | 17 | 18 | {{substr .Content.Content 0 300}}... 19 | 20 |
21 | {{end}} 22 |
23 | 24 | {{template "inc/paginator.html" .}} -------------------------------------------------------------------------------- /g/cfg.go: -------------------------------------------------------------------------------- 1 | package g 2 | 3 | import ( 4 | "github.com/qiniu/api.v6/conf" 5 | ) 6 | 7 | var ( 8 | RootEmail string 9 | RootName string 10 | RootPass string 11 | RootPortrait string 12 | BlogTitle string 13 | BlogResume string 14 | BlogLogo string 15 | QiniuAccessKey string 16 | QiniuSecretKey string 17 | QiniuScope string 18 | UseQiniu bool 19 | ) 20 | 21 | func initCfg() { 22 | RootName = Cfg.String("root_name") 23 | RootEmail = Cfg.String("root_email") 24 | RootPass = Cfg.String("root_pass") 25 | RootPortrait = Cfg.String("root_portrait") 26 | BlogTitle = Cfg.String("blog_title") 27 | BlogResume = Cfg.String("blog_resume") 28 | BlogLogo = Cfg.String("blog_logo") 29 | QiniuAccessKey = Cfg.String("qiniu_access_key") 30 | QiniuSecretKey = Cfg.String("qiniu_secret_key") 31 | QiniuScope = Cfg.String("qiniu_scope") 32 | UseQiniu = QiniuAccessKey != "" && QiniuSecretKey != "" && QiniuScope != "" 33 | conf.ACCESS_KEY = QiniuAccessKey 34 | conf.SECRET_KEY = QiniuSecretKey 35 | } 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Ulric Qin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /views/index.html: -------------------------------------------------------------------------------- 1 | 4 | 5 |
6 |
7 | {{range .Catalogs}} 8 |
9 | {{.Name}} 10 |
11 |

{{.Name}}

12 | 13 |

14 | {{.Resume}} 15 | {{if $.IsAdmin}} 16 |

17 | (Edit|Del) 18 |
19 | {{end}} 20 |

21 |
22 | 23 |
24 | {{end}} 25 |
26 |
27 | -------------------------------------------------------------------------------- /db.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS `bb_catalog` ( 2 | `id` bigint AUTO_INCREMENT NOT NULL PRIMARY KEY, 3 | `ident` varchar(255) NOT NULL UNIQUE, 4 | `name` varchar(255) NOT NULL, 5 | `resume` varchar(255) NOT NULL, 6 | `display_order` integer NOT NULL, 7 | `img_url` varchar(255) NOT NULL 8 | ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; 9 | 10 | CREATE TABLE IF NOT EXISTS `bb_blog` ( 11 | `id` bigint AUTO_INCREMENT NOT NULL PRIMARY KEY, 12 | `ident` varchar(255) NOT NULL UNIQUE, 13 | `title` varchar(255) NOT NULL, 14 | `keywords` varchar(255), 15 | `catalog_id` bigint NOT NULL, 16 | `blog_content_id` bigint NOT NULL UNIQUE, 17 | `blog_content_last_update` bigint NOT NULL, 18 | `type` tinyint NOT NULL, 19 | `status` tinyint NOT NULL, 20 | `views` bigint NOT NULL, 21 | `created` datetime NOT NULL 22 | ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; 23 | CREATE INDEX `bb_blog_catalog_id` ON `bb_blog` (`catalog_id`); 24 | 25 | 26 | CREATE TABLE IF NOT EXISTS `bb_blog_content` ( 27 | `id` bigint AUTO_INCREMENT NOT NULL PRIMARY KEY, 28 | `content` longtext NOT NULL 29 | ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; 30 | -------------------------------------------------------------------------------- /controllers/login_controller.go: -------------------------------------------------------------------------------- 1 | package controllers 2 | 3 | import ( 4 | "github.com/ulricqin/beego-blog/g" 5 | ) 6 | 7 | type LoginController struct { 8 | BaseController 9 | } 10 | 11 | func (this *LoginController) Login() { 12 | this.TplName = "login/login.html" 13 | } 14 | 15 | func (this *LoginController) DoLogin() { 16 | name := this.GetString("name") 17 | if name == "" { 18 | this.Ctx.WriteString("name is blank") 19 | return 20 | } 21 | password := this.GetString("password") 22 | if password == "" { 23 | this.Ctx.WriteString("password is blank") 24 | return 25 | } 26 | 27 | if g.RootName != name { 28 | this.Ctx.WriteString("name is incorrect") 29 | return 30 | } 31 | 32 | if g.RootPass != password { 33 | this.Ctx.WriteString("password is incorrect") 34 | return 35 | } 36 | 37 | this.Ctx.SetCookie("bb_name", name, 2592000, "/") 38 | this.Ctx.ResponseWriter.Header().Add("Set-Cookie", "bb_password="+password+"; Max-Age=2592000; Path=/; httponly") 39 | 40 | this.Ctx.WriteString("") 41 | } 42 | 43 | func (this *LoginController) Logout() { 44 | this.Ctx.SetCookie("bb_name", g.RootName, 0, "/") 45 | this.Ctx.ResponseWriter.Header().Add("Set-Cookie", "bb_password="+g.RootPass+"; Max-Age=0; Path=/; httponly") 46 | this.Ctx.WriteString("logout") 47 | } 48 | -------------------------------------------------------------------------------- /routers/router.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "github.com/astaxie/beego" 5 | "github.com/ulricqin/beego-blog/controllers" 6 | ) 7 | 8 | func init() { 9 | 10 | beego.AutoRouter(&controllers.ApiController{}) 11 | 12 | beego.Router("/", &controllers.MainController{}) 13 | beego.Router("/article/:ident", &controllers.MainController{}, "get:Read") 14 | beego.Router("/catalog/:ident", &controllers.MainController{}, "get:ListByCatalog") 15 | 16 | beego.Router("/login", &controllers.LoginController{}, "get:Login;post:DoLogin") 17 | beego.Router("/logout", &controllers.LoginController{}, "get:Logout") 18 | 19 | beego.Router("/me", &controllers.MeController{}, "get:Default") 20 | beego.Router("/me/catalog/add", &controllers.CatalogController{}, "get:Add;post:DoAdd") 21 | beego.Router("/me/catalog/edit", &controllers.CatalogController{}, "get:Edit;post:DoEdit") 22 | beego.Router("/me/catalog/del", &controllers.CatalogController{}, "get:Del") 23 | beego.Router("/me/article/add", &controllers.ArticleController{}, "get:Add;post:DoAdd") 24 | beego.Router("/me/article/edit", &controllers.ArticleController{}, "get:Edit;post:DoEdit") 25 | beego.Router("/me/article/del", &controllers.ArticleController{}, "get:Del") 26 | beego.Router("/me/article/draft", &controllers.ArticleController{}, "get:Draft") 27 | } 28 | -------------------------------------------------------------------------------- /g/markdown.go: -------------------------------------------------------------------------------- 1 | package g 2 | 3 | import ( 4 | "github.com/slene/blackfriday" 5 | ) 6 | 7 | func RenderMarkdown(mdStr string) string { 8 | htmlFlags := 0 9 | htmlFlags |= blackfriday.HTML_USE_XHTML 10 | // htmlFlags |= blackfriday.HTML_USE_SMARTYPANTS 11 | // htmlFlags |= blackfriday.HTML_SMARTYPANTS_FRACTIONS 12 | // htmlFlags |= blackfriday.HTML_SMARTYPANTS_LATEX_DASHES 13 | htmlFlags |= blackfriday.HTML_SKIP_HTML 14 | htmlFlags |= blackfriday.HTML_SKIP_STYLE 15 | htmlFlags |= blackfriday.HTML_SKIP_SCRIPT 16 | htmlFlags |= blackfriday.HTML_GITHUB_BLOCKCODE 17 | htmlFlags |= blackfriday.HTML_OMIT_CONTENTS 18 | htmlFlags |= blackfriday.HTML_COMPLETE_PAGE 19 | renderer := blackfriday.HtmlRenderer(htmlFlags, "", "") 20 | 21 | // set up the parser 22 | extensions := 0 23 | extensions |= blackfriday.EXTENSION_NO_INTRA_EMPHASIS 24 | extensions |= blackfriday.EXTENSION_TABLES 25 | extensions |= blackfriday.EXTENSION_FENCED_CODE 26 | extensions |= blackfriday.EXTENSION_AUTOLINK 27 | extensions |= blackfriday.EXTENSION_STRIKETHROUGH 28 | extensions |= blackfriday.EXTENSION_HARD_LINE_BREAK 29 | extensions |= blackfriday.EXTENSION_SPACE_HEADERS 30 | extensions |= blackfriday.EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK 31 | 32 | body := blackfriday.Markdown([]byte(mdStr), renderer, extensions) 33 | 34 | return string(body) 35 | } 36 | -------------------------------------------------------------------------------- /static/javascript/jquery.cookie.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery Cookie Plugin v1.4.0 3 | * https://github.com/carhartl/jquery-cookie 4 | * 5 | * Copyright 2013 Klaus Hartl 6 | * Released under the MIT license 7 | */ 8 | (function(c){"function"===typeof define&&define.amd?define(["jquery"],c):c(jQuery)})(function(c){function m(b){return f.raw?b:encodeURIComponent(b)}function n(b,e){var a;if(f.raw)a=b;else a:{var d=b;0===d.indexOf('"')&&(d=d.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{d=decodeURIComponent(d.replace(l," "));a=f.json?JSON.parse(d):d;break a}catch(g){}a=void 0}return c.isFunction(e)?e(a):a}var l=/\+/g,f=c.cookie=function(b,e,a){if(void 0!==e&&!c.isFunction(e)){a=c.extend({},f.defaults, 9 | a);if("number"===typeof a.expires){var d=a.expires,g=a.expires=new Date;g.setDate(g.getDate()+d)}return document.cookie=[m(b),"=",m(f.json?JSON.stringify(e):String(e)),a.expires?"; expires="+a.expires.toUTCString():"",a.path?"; path="+a.path:"",a.domain?"; domain="+a.domain:"",a.secure?"; secure":""].join("")}a=b?void 0:{};for(var d=document.cookie?document.cookie.split("; "):[],g=0,l=d.length;g 2 |
3 | 4 | 5 |
6 | 7 |
8 |
9 |
10 | 11 | 12 |
13 | 14 |
15 |
16 |
17 | 18 | 19 |
20 | 21 |
22 |
23 |
24 | 25 | 26 |
27 | 28 |
29 |
30 |
31 | 32 | 33 |
34 | 35 |
36 |
37 |
38 |
39 | 40 |
41 |
42 | 43 | -------------------------------------------------------------------------------- /models/models.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // package main 4 | 5 | import ( 6 | "github.com/astaxie/beego/orm" 7 | _ "github.com/go-sql-driver/mysql" 8 | "time" 9 | ) 10 | 11 | type Catalog struct { 12 | Id int64 13 | Ident string `orm:"unique"` 14 | Name string 15 | Resume string 16 | DisplayOrder int 17 | ImgUrl string 18 | } 19 | 20 | type Blog struct { 21 | Id int64 22 | Ident string `orm:"unique"` 23 | Title string 24 | Keywords string `orm:"null"` 25 | CatalogId int64 `orm:"index"` 26 | Content *BlogContent `orm:"-"` 27 | BlogContentId int64 `orm:"unique"` 28 | BlogContentLastUpdate int64 29 | Type int8 /*0:original, 1:translate, 2:reprint*/ 30 | Status int8 /*0:draft, 1:release*/ 31 | Views int64 32 | Created time.Time `orm:"auto_now_add;type(datetime)"` 33 | } 34 | 35 | type BlogContent struct { 36 | Id int64 37 | Content string `orm:"type(text)"` 38 | } 39 | 40 | func (*Catalog) TableEngine() string { 41 | return engine() 42 | } 43 | 44 | func (*Blog) TableEngine() string { 45 | return engine() 46 | } 47 | 48 | func (*BlogContent) TableEngine() string { 49 | return engine() 50 | } 51 | 52 | func engine() string { 53 | return "INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci" 54 | } 55 | 56 | func init() { 57 | orm.RegisterModelWithPrefix("bb_", new(Catalog), new(Blog), new(BlogContent)) 58 | } 59 | 60 | // func main() { 61 | // orm.RegisterDataBase("default", "mysql", "root:@/beego_blog?charset=utf8&loc=Asia%2FShanghai", 30, 200) 62 | // orm.RunCommand() 63 | // } 64 | -------------------------------------------------------------------------------- /controllers/main_controller.go: -------------------------------------------------------------------------------- 1 | package controllers 2 | 3 | import ( 4 | "github.com/ulricqin/beego-blog/g" 5 | "github.com/ulricqin/beego-blog/models/blog" 6 | "github.com/ulricqin/beego-blog/models/catalog" 7 | ) 8 | 9 | type MainController struct { 10 | BaseController 11 | } 12 | 13 | func (this *MainController) Get() { 14 | this.Data["Catalogs"] = catalog.All() 15 | this.Data["PageTitle"] = "首页" 16 | this.Layout = "layout/default.html" 17 | this.TplName = "index.html" 18 | } 19 | 20 | func (this *MainController) Read() { 21 | ident := this.GetString(":ident") 22 | b := blog.OneByIdent(ident) 23 | if b == nil { 24 | this.Ctx.WriteString("no such article") 25 | return 26 | } 27 | 28 | b.Views = b.Views + 1 29 | blog.Update(b, "") 30 | 31 | this.Data["Blog"] = b 32 | this.Data["Content"] = g.RenderMarkdown(blog.ReadBlogContent(b).Content) 33 | this.Data["PageTitle"] = b.Title 34 | this.Data["Catalog"] = catalog.OneById(b.CatalogId) 35 | this.Layout = "layout/default.html" 36 | this.TplName = "article/read.html" 37 | } 38 | 39 | func (this *MainController) ListByCatalog() { 40 | cata := this.Ctx.Input.Param(":ident") 41 | if cata == "" { 42 | this.Ctx.WriteString("catalog ident is blank") 43 | return 44 | } 45 | 46 | limit := this.GetIntWithDefault("limit", 10) 47 | 48 | c := catalog.OneByIdent(cata) 49 | if c == nil { 50 | this.Ctx.WriteString("catalog:" + cata + " not found") 51 | return 52 | } 53 | 54 | ids := blog.Ids(c.Id) 55 | pager := this.SetPaginator(limit, int64(len(ids))) 56 | blogs := blog.ByCatalog(c.Id, pager.Offset(), limit) 57 | 58 | this.Data["Catalog"] = c 59 | this.Data["Blogs"] = blogs 60 | this.Data["PageTitle"] = c.Name 61 | 62 | this.Layout = "layout/default.html" 63 | this.TplName = "article/by_catalog.html" 64 | } 65 | -------------------------------------------------------------------------------- /views/article/read.html: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 |
8 |
9 |

10 | 11 |

12 |
{{.Blog.Views}}
13 | 14 | 19 |
{{str2html .Content}}
20 |
21 |
22 | 27 | 28 | 29 |
30 | 31 | 32 | 43 | 44 | -------------------------------------------------------------------------------- /views/catalog/edit.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | 6 |
7 | 8 |
9 |
10 |
11 | 12 | 13 |
14 | 15 |
16 |
17 |
18 | 19 | 20 |
21 | 22 |
23 |
24 |
25 | 26 | 27 |
28 | 29 |
30 |
31 |
32 | 33 | 34 |
35 | 36 |
37 |
38 | 后台如果发现没有选择新的图片文件,就会使用原来的图片,不用担心丢失 39 |
40 |
41 |
42 |
43 | 44 |
45 |
46 |
47 | -------------------------------------------------------------------------------- /controllers/api_controller.go: -------------------------------------------------------------------------------- 1 | package controllers 2 | 3 | import ( 4 | "fmt" 5 | "strings" 6 | "time" 7 | 8 | "github.com/ulricqin/beego-blog/g" 9 | "github.com/ulricqin/beego-blog/models/catalog" 10 | "github.com/ulricqin/goutils/filetool" 11 | "github.com/ulricqin/goutils/strtool" 12 | ) 13 | 14 | const ( 15 | EDITOR_IMG_DIR = "static/uploads/editor" 16 | ) 17 | 18 | type ApiController struct { 19 | BaseController 20 | } 21 | 22 | func (this *ApiController) Health() { 23 | fmt.Println(catalog.All()[0]) 24 | this.Ctx.WriteString("ok") 25 | } 26 | 27 | func (this *ApiController) Md5() { 28 | p := this.GetString("p") 29 | this.Ctx.WriteString(strtool.Md5(strings.TrimSpace(p))) 30 | } 31 | 32 | func (this *ApiController) Upload() { 33 | result := map[string]interface{}{ 34 | "success": false, 35 | } 36 | 37 | defer func() { 38 | this.Data["json"] = &result 39 | this.ServeJSON() 40 | }() 41 | 42 | _, header, err := this.GetFile("image") 43 | if err != nil { 44 | return 45 | } 46 | 47 | ext := filetool.Ext(header.Filename) 48 | imgPath := fmt.Sprintf("%s/%d%s", EDITOR_IMG_DIR, time.Now().Unix(), ext) 49 | 50 | filetool.InsureDir(EDITOR_IMG_DIR) 51 | err = this.SaveToFile("image", imgPath) 52 | if err != nil { 53 | return 54 | } 55 | 56 | imgUrl := "/" + imgPath 57 | if g.UseQiniu { 58 | if addr, er := g.UploadFile(imgPath, imgPath); er != nil { 59 | return 60 | } else { 61 | imgUrl = addr 62 | filetool.Unlink(imgPath) 63 | } 64 | } 65 | 66 | result["link"] = imgUrl 67 | result["success"] = true 68 | 69 | } 70 | 71 | func (this *ApiController) Markdown() { 72 | if this.IsAjax() { 73 | result := map[string]interface{}{ 74 | "success": false, 75 | } 76 | action := this.GetString("action") 77 | switch action { 78 | case "preview": 79 | content := this.GetString("content") 80 | result["preview"] = g.RenderMarkdown(content) 81 | result["success"] = true 82 | } 83 | this.Data["json"] = result 84 | this.ServeJSON() 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /controllers/base_controller.go: -------------------------------------------------------------------------------- 1 | package controllers 2 | 3 | import ( 4 | "strconv" 5 | 6 | "github.com/astaxie/beego" 7 | "github.com/ulricqin/beego-blog/g" 8 | "github.com/ulricqin/goutils/paginator" 9 | 10 | ) 11 | 12 | type Checker interface { 13 | CheckLogin() 14 | } 15 | 16 | type BaseController struct { 17 | beego.Controller 18 | IsAdmin bool 19 | } 20 | 21 | func (this *BaseController) Prepare() { 22 | this.Data["BlogLogo"] = g.BlogLogo 23 | this.Data["BlogTitle"] = g.BlogTitle 24 | this.Data["BlogResume"] = g.BlogResume 25 | this.Data["RootName"] = g.RootName 26 | this.Data["RootEmail"] = g.RootEmail 27 | this.Data["RootPortrait"] = g.RootPortrait 28 | this.AssignIsAdmin() 29 | if app, ok := this.AppController.(Checker); ok { 30 | app.CheckLogin() 31 | } 32 | } 33 | 34 | func (this *BaseController) AssignIsAdmin() { 35 | bb_name := this.Ctx.GetCookie("bb_name") 36 | bb_password := this.Ctx.GetCookie("bb_password") 37 | if bb_name == "" || bb_password == "" { 38 | this.IsAdmin = false 39 | return 40 | } 41 | 42 | if bb_name != g.RootName || bb_password != g.RootPass { 43 | this.IsAdmin = false 44 | } 45 | 46 | this.IsAdmin = true 47 | this.Data["IsAdmin"] = this.IsAdmin 48 | } 49 | 50 | func (this *BaseController) SetPaginator(per int, nums int64) *paginator.Paginator { 51 | p := paginator.NewPaginator(this.Ctx.Request, per, nums) 52 | this.Data["paginator"] = p 53 | return p 54 | } 55 | 56 | func (this *BaseController) GetIntWithDefault(paramKey string, defaultVal int) int { 57 | valStr := this.GetString(paramKey) 58 | var val int 59 | if valStr == "" { 60 | val = defaultVal 61 | } else { 62 | var err error 63 | val, err = strconv.Atoi(valStr) 64 | if err != nil { 65 | val = defaultVal 66 | } 67 | } 68 | return val 69 | } 70 | 71 | func (this *BaseController) JsStorage(action, key string, values ...string) { 72 | value := action + ":::" + key 73 | if len(values) > 0 { 74 | value += ":::" + values[0] 75 | } 76 | this.Ctx.SetCookie("JsStorage", value, 1<<31-1, "/") 77 | } 78 | -------------------------------------------------------------------------------- /views/layout/admin.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 后台管理 - {{.BlogTitle}} 5 | 6 | 7 | 8 | 9 | 10 |
11 | 32 | 38 | {{.LayoutContent}} 39 |
40 | 41 | -------------------------------------------------------------------------------- /views/layout/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{.PageTitle}} - {{.BlogTitle}} 5 | 6 | 7 | 8 | 11 | 12 | 13 |
14 | 35 | {{.LayoutContent}} 36 | 37 | 38 |
39 |
40 |
41 | Beego-Blog is open source on GitHub.
42 | Patches, suggestions, and comments are welcome. 43 |
44 |
45 | Powered by UlricQin 46 |
47 |
48 | 49 |
50 | 51 | -------------------------------------------------------------------------------- /static/css/prettify.css: -------------------------------------------------------------------------------- 1 | /* Author: jmblog */ 2 | /* Project: https://github.com/jmblog/color-themes-for-google-code-prettify */ 3 | /* GitHub Theme */ 4 | /* Pretty printing styles. Used with prettify.js. */ 5 | /* SPAN elements with the classes below are added by prettyprint. */ 6 | /* plain text */ 7 | .pln { 8 | color: #333333; 9 | } 10 | 11 | @media screen { 12 | /* string content */ 13 | .str { 14 | color: #dd1144; 15 | } 16 | 17 | /* a keyword */ 18 | .kwd { 19 | color: #333333; 20 | } 21 | 22 | /* a comment */ 23 | .com { 24 | color: #999988; 25 | } 26 | 27 | /* a type name */ 28 | .typ { 29 | color: #445588; 30 | } 31 | 32 | /* a literal value */ 33 | .lit { 34 | color: #445588; 35 | } 36 | 37 | /* punctuation */ 38 | .pun { 39 | color: #333333; 40 | } 41 | 42 | /* lisp open bracket */ 43 | .opn { 44 | color: #333333; 45 | } 46 | 47 | /* lisp close bracket */ 48 | .clo { 49 | color: #333333; 50 | } 51 | 52 | /* a markup tag name */ 53 | .tag { 54 | color: navy; 55 | } 56 | 57 | /* a markup attribute name */ 58 | .atn { 59 | color: teal; 60 | } 61 | 62 | /* a markup attribute value */ 63 | .atv { 64 | color: #dd1144; 65 | } 66 | 67 | /* a declaration */ 68 | .dec { 69 | color: #333333; 70 | } 71 | 72 | /* a variable name */ 73 | .var { 74 | color: teal; 75 | } 76 | 77 | /* a function name */ 78 | .fun { 79 | color: #990000; 80 | } 81 | } 82 | /* Use higher contrast and text-weight for printable form. */ 83 | @media print, projection { 84 | .str { 85 | color: #006600; 86 | } 87 | 88 | .kwd { 89 | color: #006; 90 | font-weight: bold; 91 | } 92 | 93 | .com { 94 | color: #600; 95 | font-style: italic; 96 | } 97 | 98 | .typ { 99 | color: #404; 100 | font-weight: bold; 101 | } 102 | 103 | .lit { 104 | color: #004444; 105 | } 106 | 107 | .pun, .opn, .clo { 108 | color: #444400; 109 | } 110 | 111 | .tag { 112 | color: #006; 113 | font-weight: bold; 114 | } 115 | 116 | .atn { 117 | color: #440044; 118 | } 119 | 120 | .atv { 121 | color: #006600; 122 | } 123 | } 124 | 125 | /* Specify class=linenums on a pre to get line numbering */ 126 | ol.linenums { 127 | margin-top: 0; 128 | margin-bottom: 0; 129 | } 130 | 131 | /* IE indents via margin-left */ 132 | li.L0, 133 | li.L1, 134 | li.L2, 135 | li.L3, 136 | li.L4, 137 | li.L5, 138 | li.L6, 139 | li.L7, 140 | li.L8, 141 | li.L9 { 142 | /* */ 143 | } 144 | 145 | /* Alternate shading for lines */ 146 | li.L1, 147 | li.L3, 148 | li.L5, 149 | li.L7, 150 | li.L9 { 151 | /* */ 152 | } -------------------------------------------------------------------------------- /static/css/vibrant-ink.css: -------------------------------------------------------------------------------- 1 | /* Vibrant Ink Theme */ 2 | /* Original theme - http://alternateidea.com/blog/articles/2006/1/3/textmate-vibrant-ink-theme-and-prototype-bundle */ 3 | pre { 4 | font-family: Consolas, Monaco, Menlo, "Courier New", monospace; 5 | display: block; 6 | padding: 8.5px; 7 | margin: 0 0 9px; 8 | font-size: 12px; 9 | line-height: 1.428571429; 10 | color: #333333; 11 | word-break: break-all; 12 | word-wrap: break-word; 13 | border: 1px solid #cccccc; 14 | border-radius: 4px; 15 | } 16 | 17 | .prettyprint { 18 | background: black; 19 | line-height: 1.5; 20 | border: 1px solid #ccc; 21 | padding: 10px; 22 | } 23 | 24 | pre code span { 25 | font-family: Consolas, Menlo, 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', Monaco, monospace; 26 | font-size: 14px; 27 | } 28 | 29 | .pln { 30 | color: white; 31 | } 32 | 33 | @media screen { 34 | .str { 35 | color: #66ff00; 36 | } 37 | 38 | .kwd { 39 | color: #ff6600; 40 | } 41 | 42 | .com { 43 | color: #9933cc; 44 | } 45 | 46 | .typ { 47 | color: #445588; 48 | } 49 | 50 | .lit { 51 | color: #445588; 52 | } 53 | 54 | .pun { 55 | color: white; 56 | } 57 | 58 | .opn { 59 | color: white; 60 | } 61 | 62 | .clo { 63 | color: white; 64 | } 65 | 66 | .tag { 67 | color: white; 68 | } 69 | 70 | .atn { 71 | color: #99cc99; 72 | } 73 | 74 | .atv { 75 | color: #66ff00; 76 | } 77 | 78 | .dec { 79 | color: white; 80 | } 81 | 82 | .var { 83 | color: white; 84 | } 85 | 86 | .fun { 87 | color: #ffcc00; 88 | } 89 | } 90 | @media print, projection { 91 | .str { 92 | color: #006600; 93 | } 94 | 95 | .kwd { 96 | color: #006; 97 | font-weight: bold; 98 | } 99 | 100 | .com { 101 | color: #600; 102 | font-style: italic; 103 | } 104 | 105 | .typ { 106 | color: #404; 107 | font-weight: bold; 108 | } 109 | 110 | .lit { 111 | color: #004444; 112 | } 113 | 114 | .pun, .opn, .clo { 115 | color: #444400; 116 | } 117 | 118 | .tag { 119 | color: #006; 120 | font-weight: bold; 121 | } 122 | 123 | .atn { 124 | color: #440044; 125 | } 126 | 127 | .atv { 128 | color: #006600; 129 | } 130 | } 131 | /* Specify class=linenums on a pre to get line numbering */ 132 | ol.linenums { 133 | margin-top: 0; 134 | margin-bottom: 0; 135 | } 136 | 137 | /* IE indents via margin-left */ 138 | li.L0, 139 | li.L1, 140 | li.L2, 141 | li.L3, 142 | li.L4, 143 | li.L5, 144 | li.L6, 145 | li.L7, 146 | li.L8, 147 | li.L9 { 148 | /* */ 149 | } 150 | 151 | /* Alternate shading for lines */ 152 | li.L1, 153 | li.L3, 154 | li.L5, 155 | li.L7, 156 | li.L9 { 157 | /* */ 158 | } 159 | -------------------------------------------------------------------------------- /static/css/tomorrow-night-eighties.css: -------------------------------------------------------------------------------- 1 | /* Tomorrow Night Eighties Theme */ 2 | /* Original theme - https://github.com/chriskempson/tomorrow-theme */ 3 | 4 | pre { 5 | font-family: Consolas, Monaco, Menlo, "Courier New", monospace; 6 | display: block; 7 | padding: 8.5px; 8 | margin: 0 0 9px; 9 | font-size: 12px; 10 | line-height: 1.428571429; 11 | color: #333333; 12 | word-break: break-all; 13 | word-wrap: break-word; 14 | border: 1px solid #cccccc; 15 | border-radius: 4px; 16 | } 17 | 18 | .prettyprint { 19 | background: #2d2d2d; 20 | font-family: Menlo, 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', Monaco, Consolas, monospace; 21 | font-size: 12px; 22 | line-height: 1.5; 23 | border: 1px solid #ccc; 24 | padding: 10px; 25 | } 26 | 27 | .pln { 28 | color: #cccccc; 29 | } 30 | 31 | pre code span { 32 | font-family: Consolas, Menlo, 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', Monaco, monospace; 33 | font-size: 14px; 34 | } 35 | 36 | @media screen { 37 | .str { 38 | color: #99cc99; 39 | } 40 | 41 | .kwd { 42 | color: #cc99cc; 43 | } 44 | 45 | .com { 46 | color: #999999; 47 | font-family: Microsoft Yahei; 48 | font-size: 11px; 49 | } 50 | 51 | .typ { 52 | color: #6699cc; 53 | } 54 | 55 | .lit { 56 | color: #f99157; 57 | } 58 | 59 | .pun { 60 | color: #cccccc; 61 | } 62 | 63 | .opn { 64 | color: #cccccc; 65 | } 66 | 67 | .clo { 68 | color: #cccccc; 69 | } 70 | 71 | .tag { 72 | color: #f2777a; 73 | } 74 | 75 | .atn { 76 | color: #f99157; 77 | } 78 | 79 | .atv { 80 | color: #66cccc; 81 | } 82 | 83 | .dec { 84 | color: #f99157; 85 | } 86 | 87 | .var { 88 | color: #f2777a; 89 | } 90 | 91 | .fun { 92 | color: #6699cc; 93 | } 94 | } 95 | @media print, projection { 96 | .str { 97 | color: #006600; 98 | } 99 | 100 | .kwd { 101 | color: #006; 102 | font-weight: bold; 103 | } 104 | 105 | .com { 106 | color: #600; 107 | font-style: italic; 108 | } 109 | 110 | .typ { 111 | color: #404; 112 | font-weight: bold; 113 | } 114 | 115 | .lit { 116 | color: #004444; 117 | } 118 | 119 | .pun, .opn, .clo { 120 | color: #444400; 121 | } 122 | 123 | .tag { 124 | color: #006; 125 | font-weight: bold; 126 | } 127 | 128 | .atn { 129 | color: #440044; 130 | } 131 | 132 | .atv { 133 | color: #006600; 134 | } 135 | } 136 | /* Specify class=linenums on a pre to get line numbering */ 137 | ol.linenums { 138 | margin-top: 0; 139 | margin-bottom: 0; 140 | } 141 | 142 | /* IE indents via margin-left */ 143 | li.L0, 144 | li.L1, 145 | li.L2, 146 | li.L3, 147 | li.L4, 148 | li.L5, 149 | li.L6, 150 | li.L7, 151 | li.L8, 152 | li.L9 { 153 | /* */ 154 | } 155 | 156 | /* Alternate shading for lines */ 157 | li.L1, 158 | li.L3, 159 | li.L5, 160 | li.L7, 161 | li.L9 { 162 | /* */ 163 | } 164 | -------------------------------------------------------------------------------- /static/javascript/autosize.js: -------------------------------------------------------------------------------- 1 | /*! 2 | Autosize v1.17.8 - 2013-09-07 3 | Automatically adjust textarea height based on user input. 4 | (c) 2013 Jack Moore - http://www.jacklmoore.com/autosize 5 | license: http://www.opensource.org/licenses/mit-license.php 6 | */ 7 | (function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(window.jQuery||window.$)})(function(e){var t,o={className:"autosizejs",append:"",callback:!1,resizeDelay:10},i=' 65 | 66 | 67 | 69 | 70 | 74 | 75 | 102 | 103 | 104 | 105 | 107 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /views/article/edit.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 |
12 |
13 | 14 |
15 |
16 | 17 |
18 |
19 | 20 |
21 |
22 |
23 |
24 | 29 | 30 |
31 |
32 | 37 | 38 |
39 |
40 | 44 |
45 |
46 | 47 | 48 |
49 | 50 |
51 | 64 |
65 | 66 |
67 |
68 | 70 | 71 | 75 | 76 | 103 | 104 |
105 | 106 | 108 | 109 | 110 |
111 | 112 | -------------------------------------------------------------------------------- /static/css/g.css: -------------------------------------------------------------------------------- 1 | *,h1,h2,h3,h4{ font-family: Verdana,Arial,Microsoft YaHei,sans-serif; color:#666666; word-wrap:break-word;} 2 | .mt0{ margin-top:0px!important;} 3 | .mt5{ margin-top:5px!important;} 4 | .mt10{ margin-top:10px!important;} 5 | .mt15{ margin-top:15px!important;} 6 | .mt20{ margin-top:20px!important;} 7 | .mb0{ margin-bottom:0px!important;} 8 | .mb5{ margin-bottom:5px!important;} 9 | .mb10{ margin-bottom:10px!important;} 10 | .mb15{ margin-bottom:15px!important;} 11 | .mb20{ margin-bottom:20px!important;} 12 | /*float*/ 13 | .fl{ float:left!important;} 14 | .fr{ float:right!important;} 15 | .fn{ float:none!important;} 16 | hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box;margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee} 17 | .markdown img, #logo-img{max-width: 100%;height: auto;-webkit-box-shadow: #333 0px 0px 6px;-moz-box-shadow: #333 0px 0px 6px;box-shadow: #333 0px 0px 6px;} 18 | .img-circle{border-radius:50%} 19 | .cut-line {margin: 0 5px;color: #D6D6D6;} 20 | a{ color:#0066cc; text-decoration:none;} 21 | a:hover {text-decoration: underline;} 22 | 23 | #screen{margin:0 auto; width:960px; } 24 | #blog-title{margin-left:20px;padding-top:16px;font-size:18pt;font-weight:bold;} 25 | #blog-title a{text-decoration: none; color: #888;} 26 | #blog-resume{color:#ccc;margin-left:20px;margin-top:14px;font-style:italic;font-size:10pt;} 27 | 28 | #contact-me .social a.google{background:url('/static/images/social/google.png') center no-repeat #c83d20;border:1px solid #C83D20} 29 | #contact-me .social a.google:hover{border:1px solid #9c3019;;background-color:#9c3019} 30 | #contact-me .social a.weibo {background: url('/static/images/social/weibo.png') center no-repeat #e32529;border: 1px solid #e32529;} 31 | #contact-me .social a.weibo:hover{border:1px solid #bd181c;background-color:#bd181c} 32 | #contact-me .social a.facebook {background: url('/static/images/social/facebook.png') center no-repeat #3b5998;border: 1px solid #3B5998;} 33 | #contact-me .social a.facebook:hover{border:1px solid #2d4373;background-color:#2d4373;} 34 | #contact-me .social a.twitter {background: url('/static/images/social/twitter.png') center no-repeat #55cff8;border: 1px solid #55CFF8;} 35 | #contact-me .social a.twitter:hover{border:1px solid #24c1f6;background-color:#24c1f6} 36 | #contact-me .social a.github {background: url('/static/images/social/github.png') center no-repeat #afb6ca;border: 1px solid #afb6ca;} 37 | #contact-me .social a.github:hover{border:1px solid #909ab6;background-color:#909ab6} 38 | #contact-me .social a.linkedin{background:url('/static/images/social/linkedin.png') center no-repeat #005a87;border:1px solid #005A87;} 39 | #contact-me .social a.linkedin:hover{border:1px solid #003854;background-color:#003854} 40 | 41 | #contact-me .social a { 42 | -webkit-border-radius: 50%; 43 | -moz-border-radius: 50%; 44 | -ms-border-radius: 50%; 45 | -o-border-radius: 50%; 46 | border-radius: 50%; 47 | display: -moz-inline-stack; 48 | display: inline-block; 49 | vertical-align: middle; 50 | zoom: 1; 51 | text-indent: -9999px; 52 | margin-right: 5px; 53 | margin-bottom: 15px; 54 | opacity: 0.5; 55 | width: 28px; 56 | height: 28px; 57 | -webkit-transition: 0.3s; 58 | -moz-transition: 0.3s; 59 | -o-transition: 0.3s; 60 | transition: 0.3s; 61 | } 62 | 63 | .entry-list .item a { 64 | color: #666; 65 | } 66 | .entry-list .item a:hover { 67 | color: #0099cc; 68 | } 69 | .entry-list .item .entry-snippet{ 70 | font-size: 14px; 71 | line-height: 30px; 72 | } 73 | .entry-list .entry-views { 74 | position: absolute; 75 | display: block; 76 | top: 5px; 77 | right: 0; 78 | padding: 8px 12px; 79 | background-color: #0099cc; 80 | color: #fff; 81 | border-radius: 2px; 82 | -moz-border-radius: 2px; 83 | -webkit-border-radius: 2px; 84 | } 85 | 86 | .collection-card a { 87 | text-decoration: none; 88 | } 89 | 90 | .pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:17px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px} 91 | 92 | .entry-meta span { 93 | color: #ccc; 94 | } 95 | 96 | footer { 97 | border-top: 1px solid #D8D7CF; 98 | clear: both; 99 | color: #9A9994; 100 | font-size: 12px; 101 | line-height: 15.4px; 102 | margin-top: 15px; 103 | overflow: hidden; 104 | padding: 20px 0 40px; 105 | } 106 | footer .site-source { 107 | background: url("/static/images/code.png") no-repeat scroll 0 2px transparent; 108 | float: left; 109 | padding-left: 46px; 110 | } 111 | footer .sfc-member {float: right;text-align: right;} 112 | footer a {color: #403F3C;} 113 | -------------------------------------------------------------------------------- /static/javascript/md5.js: -------------------------------------------------------------------------------- 1 | /* 2 | CryptoJS v3.1.2 3 | code.google.com/p/crypto-js 4 | (c) 2009-2013 by Jeff Mott. All rights reserved. 5 | code.google.com/p/crypto-js/wiki/License 6 | */ 7 | var CryptoJS=CryptoJS||function(s,p){var m={},l=m.lib={},n=function(){},r=l.Base={extend:function(b){n.prototype=this;var h=new n;b&&h.mixIn(b);h.hasOwnProperty("init")||(h.init=function(){h.$super.init.apply(this,arguments)});h.init.prototype=h;h.$super=this;return h},create:function(){var b=this.extend();b.init.apply(b,arguments);return b},init:function(){},mixIn:function(b){for(var h in b)b.hasOwnProperty(h)&&(this[h]=b[h]);b.hasOwnProperty("toString")&&(this.toString=b.toString)},clone:function(){return this.init.prototype.extend(this)}}, 8 | q=l.WordArray=r.extend({init:function(b,h){b=this.words=b||[];this.sigBytes=h!=p?h:4*b.length},toString:function(b){return(b||t).stringify(this)},concat:function(b){var h=this.words,a=b.words,j=this.sigBytes;b=b.sigBytes;this.clamp();if(j%4)for(var g=0;g>>2]|=(a[g>>>2]>>>24-8*(g%4)&255)<<24-8*((j+g)%4);else if(65535>>2]=a[g>>>2];else h.push.apply(h,a);this.sigBytes+=b;return this},clamp:function(){var b=this.words,h=this.sigBytes;b[h>>>2]&=4294967295<< 9 | 32-8*(h%4);b.length=s.ceil(h/4)},clone:function(){var b=r.clone.call(this);b.words=this.words.slice(0);return b},random:function(b){for(var h=[],a=0;a>>2]>>>24-8*(j%4)&255;g.push((k>>>4).toString(16));g.push((k&15).toString(16))}return g.join("")},parse:function(b){for(var a=b.length,g=[],j=0;j>>3]|=parseInt(b.substr(j, 10 | 2),16)<<24-4*(j%8);return new q.init(g,a/2)}},a=v.Latin1={stringify:function(b){var a=b.words;b=b.sigBytes;for(var g=[],j=0;j>>2]>>>24-8*(j%4)&255));return g.join("")},parse:function(b){for(var a=b.length,g=[],j=0;j>>2]|=(b.charCodeAt(j)&255)<<24-8*(j%4);return new q.init(g,a)}},u=v.Utf8={stringify:function(b){try{return decodeURIComponent(escape(a.stringify(b)))}catch(g){throw Error("Malformed UTF-8 data");}},parse:function(b){return a.parse(unescape(encodeURIComponent(b)))}}, 11 | g=l.BufferedBlockAlgorithm=r.extend({reset:function(){this._data=new q.init;this._nDataBytes=0},_append:function(b){"string"==typeof b&&(b=u.parse(b));this._data.concat(b);this._nDataBytes+=b.sigBytes},_process:function(b){var a=this._data,g=a.words,j=a.sigBytes,k=this.blockSize,m=j/(4*k),m=b?s.ceil(m):s.max((m|0)-this._minBufferSize,0);b=m*k;j=s.min(4*b,j);if(b){for(var l=0;l>>32-j)+k}function m(a,k,b,h,l,j,m){a=a+(k&h|b&~h)+l+m;return(a<>>32-j)+k}function l(a,k,b,h,l,j,m){a=a+(k^b^h)+l+m;return(a<>>32-j)+k}function n(a,k,b,h,l,j,m){a=a+(b^(k|~h))+l+m;return(a<>>32-j)+k}for(var r=CryptoJS,q=r.lib,v=q.WordArray,t=q.Hasher,q=r.algo,a=[],u=0;64>u;u++)a[u]=4294967296*s.abs(s.sin(u+1))|0;q=q.MD5=t.extend({_doReset:function(){this._hash=new v.init([1732584193,4023233417,2562383102,271733878])}, 15 | _doProcessBlock:function(g,k){for(var b=0;16>b;b++){var h=k+b,w=g[h];g[h]=(w<<8|w>>>24)&16711935|(w<<24|w>>>8)&4278255360}var b=this._hash.words,h=g[k+0],w=g[k+1],j=g[k+2],q=g[k+3],r=g[k+4],s=g[k+5],t=g[k+6],u=g[k+7],v=g[k+8],x=g[k+9],y=g[k+10],z=g[k+11],A=g[k+12],B=g[k+13],C=g[k+14],D=g[k+15],c=b[0],d=b[1],e=b[2],f=b[3],c=p(c,d,e,f,h,7,a[0]),f=p(f,c,d,e,w,12,a[1]),e=p(e,f,c,d,j,17,a[2]),d=p(d,e,f,c,q,22,a[3]),c=p(c,d,e,f,r,7,a[4]),f=p(f,c,d,e,s,12,a[5]),e=p(e,f,c,d,t,17,a[6]),d=p(d,e,f,c,u,22,a[7]), 16 | c=p(c,d,e,f,v,7,a[8]),f=p(f,c,d,e,x,12,a[9]),e=p(e,f,c,d,y,17,a[10]),d=p(d,e,f,c,z,22,a[11]),c=p(c,d,e,f,A,7,a[12]),f=p(f,c,d,e,B,12,a[13]),e=p(e,f,c,d,C,17,a[14]),d=p(d,e,f,c,D,22,a[15]),c=m(c,d,e,f,w,5,a[16]),f=m(f,c,d,e,t,9,a[17]),e=m(e,f,c,d,z,14,a[18]),d=m(d,e,f,c,h,20,a[19]),c=m(c,d,e,f,s,5,a[20]),f=m(f,c,d,e,y,9,a[21]),e=m(e,f,c,d,D,14,a[22]),d=m(d,e,f,c,r,20,a[23]),c=m(c,d,e,f,x,5,a[24]),f=m(f,c,d,e,C,9,a[25]),e=m(e,f,c,d,q,14,a[26]),d=m(d,e,f,c,v,20,a[27]),c=m(c,d,e,f,B,5,a[28]),f=m(f,c, 17 | d,e,j,9,a[29]),e=m(e,f,c,d,u,14,a[30]),d=m(d,e,f,c,A,20,a[31]),c=l(c,d,e,f,s,4,a[32]),f=l(f,c,d,e,v,11,a[33]),e=l(e,f,c,d,z,16,a[34]),d=l(d,e,f,c,C,23,a[35]),c=l(c,d,e,f,w,4,a[36]),f=l(f,c,d,e,r,11,a[37]),e=l(e,f,c,d,u,16,a[38]),d=l(d,e,f,c,y,23,a[39]),c=l(c,d,e,f,B,4,a[40]),f=l(f,c,d,e,h,11,a[41]),e=l(e,f,c,d,q,16,a[42]),d=l(d,e,f,c,t,23,a[43]),c=l(c,d,e,f,x,4,a[44]),f=l(f,c,d,e,A,11,a[45]),e=l(e,f,c,d,D,16,a[46]),d=l(d,e,f,c,j,23,a[47]),c=n(c,d,e,f,h,6,a[48]),f=n(f,c,d,e,u,10,a[49]),e=n(e,f,c,d, 18 | C,15,a[50]),d=n(d,e,f,c,s,21,a[51]),c=n(c,d,e,f,A,6,a[52]),f=n(f,c,d,e,q,10,a[53]),e=n(e,f,c,d,y,15,a[54]),d=n(d,e,f,c,w,21,a[55]),c=n(c,d,e,f,v,6,a[56]),f=n(f,c,d,e,D,10,a[57]),e=n(e,f,c,d,t,15,a[58]),d=n(d,e,f,c,B,21,a[59]),c=n(c,d,e,f,r,6,a[60]),f=n(f,c,d,e,z,10,a[61]),e=n(e,f,c,d,j,15,a[62]),d=n(d,e,f,c,x,21,a[63]);b[0]=b[0]+c|0;b[1]=b[1]+d|0;b[2]=b[2]+e|0;b[3]=b[3]+f|0},_doFinalize:function(){var a=this._data,k=a.words,b=8*this._nDataBytes,h=8*a.sigBytes;k[h>>>5]|=128<<24-h%32;var l=s.floor(b/ 19 | 4294967296);k[(h+64>>>9<<4)+15]=(l<<8|l>>>24)&16711935|(l<<24|l>>>8)&4278255360;k[(h+64>>>9<<4)+14]=(b<<8|b>>>24)&16711935|(b<<24|b>>>8)&4278255360;a.sigBytes=4*(k.length+1);this._process();a=this._hash;k=a.words;for(b=0;4>b;b++)h=k[b],k[b]=(h<<8|h>>>24)&16711935|(h<<24|h>>>8)&4278255360;return a},clone:function(){var a=t.clone.call(this);a._hash=this._hash.clone();return a}});r.MD5=t._createHelper(q);r.HmacMD5=t._createHmacHelper(q)})(Math); 20 | -------------------------------------------------------------------------------- /static/javascript/jstorage.min.js: -------------------------------------------------------------------------------- 1 | // jStorage v0.4.7 2 | 3 | (function(){function D(){var a="{}";if("userDataBehavior"==k){d.load("jStorage");try{a=d.getAttribute("jStorage")}catch(b){}try{r=d.getAttribute("jStorage_update")}catch(c){}h.jStorage=a}E();x();F()}function u(){var a;clearTimeout(G);G=setTimeout(function(){if("localStorage"==k||"globalStorage"==k)a=h.jStorage_update;else if("userDataBehavior"==k){d.load("jStorage");try{a=d.getAttribute("jStorage_update")}catch(b){}}if(a&&a!=r){r=a;var l=m.parse(m.stringify(c.__jstorage_meta.CRC32)),p;D();p=m.parse(m.stringify(c.__jstorage_meta.CRC32)); 4 | var e,z=[],f=[];for(e in l)l.hasOwnProperty(e)&&(p[e]?l[e]!=p[e]&&"2."==String(l[e]).substr(0,2)&&z.push(e):f.push(e));for(e in p)p.hasOwnProperty(e)&&(l[e]||z.push(e));s(z,"updated");s(f,"deleted")}},25)}function s(a,b){a=[].concat(a||[]);if("flushed"==b){a=[];for(var c in g)g.hasOwnProperty(c)&&a.push(c);b="deleted"}c=0;for(var p=a.length;cB){var l=b[0],d=b[1];b=b[2];if(t[d])for(var e=0,h=t[d].length;e>>16)&65535)<<16),n^=n>>>24,n=1540483477*(n&65535)+((1540483477*(n>>>16)&65535)<<16),f=1540483477*(f&65535)+((1540483477*(f>>>16)&65535)<<16)^n,k-=4,++g;switch(k){case 3:f^=(e.charCodeAt(g+2)&255)<<16;case 2:f^=(e.charCodeAt(g+1)&255)<<8;case 1:f^=e.charCodeAt(g)&255,f=1540483477*(f&65535)+((1540483477*(f>>>16)&65535)<<16)}f^=f>>>13;f=1540483477*(f&65535)+((1540483477*(f>>>16)& 12 | 65535)<<16);h[a]="2."+((f^f>>>15)>>>0);this.setTTL(a,d.TTL||0);s(a,"updated");return b},get:function(a,b){q(a);return a in c?c[a]&&"object"==typeof c[a]&&c[a]._is_xml?C.decode(c[a].xml):c[a]:"undefined"==typeof b?null:b},deleteKey:function(a){q(a);return a in c?(delete c[a],"object"==typeof c.__jstorage_meta.TTL&&a in c.__jstorage_meta.TTL&&delete c.__jstorage_meta.TTL[a],delete c.__jstorage_meta.CRC32[a],w(),v(),s(a,"deleted"),!0):!1},setTTL:function(a,b){var d=+new Date;q(a);b=Number(b)||0;return a in 13 | c?(c.__jstorage_meta.TTL||(c.__jstorage_meta.TTL={}),0li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff3f3f3',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff282828',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} -------------------------------------------------------------------------------- /static/javascript/app.min.js: -------------------------------------------------------------------------------- 1 | (function(a) { 2 | (function() { 3 | function b(a, b, e, f) { 4 | var g = b.val(), 5 | n = a.data("last") || ""; 6 | g != n && (a.data("last", g), e.val(g.replace(/.*(\\|\/)/, "")), f || b.trigger("change")) 7 | } 8 | a(document).on("click", "[data-dismiss=upload]", function(c) { 9 | var d = a(this); 10 | c = a(c.target); 11 | if ("button" == c.attr("rel") || "filename" == c.attr("rel")) { 12 | c = d.find("input[type=file]"); 13 | var e = d.find("[rel=filename]"); 14 | c.click(); 15 | setTimeout(b, 0, d, c, e) 16 | } 17 | }); 18 | a(document).on("change", "[data-dismiss=upload] input[type=file]", function() { 19 | var c = a(this), 20 | d = c.parents("[data-dismiss=upload]"), 21 | e = d.find("[rel=filename]"); 22 | b(d, c, e, !0) 23 | }) 24 | })(); 25 | (function() { 26 | var b = a.cookie("JsStorage"); 27 | b && (b = b.split(":::"), 1 < b.length && a.jStorage[b[0]].apply(this, b.splice(1)), a.removeCookie("JsStorage", { 28 | path: "/" 29 | })) 30 | })(); 31 | (function() { 32 | a.fn.mdFilter = function() { 33 | var b = a(this); 34 | b.find("img").each(function(b, d) { 35 | var e = a(d); 36 | e.addClass("img-responsive"); 37 | var f = e.attr("src"), 38 | g = f.replace(/(\/img\/.+\.)(\d+)(\.(jpg|png))/, function(a, b, c, d) { 39 | return b + "full" + d 40 | }); 41 | g !== f && e.wrap('') 42 | }); 43 | b.children("p, ol, ul, blockquote").each(function(b, d) { 44 | a(d).replaceWith(function() { 45 | var b = {}, 46 | c = a(a(d).outerHTML()); 47 | c.find("a").each(function(c, d) { 48 | b[c] = a(d).outerHTML(); 49 | a(d).replaceWith("start-ph-a-" + c + "-end") 50 | }); 51 | c = c.outerHTML().replace(/\B([@#])([\d\w-_]+)/g, function(a, b, c) { 52 | var d; 53 | "@" == b ? (a = "/user/" + c, d = 'target="_blank"') : (a = "#reply" + c, d = 'rel="floor-link"'); 54 | return '" + b + c + "" 55 | }); 56 | return c = c.replace(/start-ph-a-(\d)-end/g, function(a, c) { 57 | return b[c] 58 | }) 59 | }) 60 | }); 61 | b.find("pre > code").parent().addClass("prettyprint"); 62 | prettyPrint() 63 | } 64 | })(); 65 | a(function() { 66 | a("[data-show=tooltip]").each(function(b, c) { 67 | var d = a(c); 68 | d.tooltip({ 69 | placement: d.data("placement"), 70 | title: d.data("tooltip-text") 71 | }); 72 | d.tooltip("show") 73 | }); 74 | a("[rel=select2]").select2(); 75 | a(".markdown").mdFilter() 76 | }); 77 | })(jQuery); 78 | 79 | (function(c) { 80 | function t(a) { 81 | var c = 0, 82 | d = 0, 83 | e, l, b; 84 | "number" === typeof a.selectionStart && "number" === typeof a.selectionEnd ? (c = a.selectionStart, d = a.selectionEnd) : (l = document.selection.createRange()) && l.parentElement() === a && (b = a.value.length, e = a.value.replace(/\r\n/g, "\n"), d = a.createTextRange(), d.moveToBookmark(l.getBookmark()), a = a.createTextRange(), a.collapse(!1), -1 < d.compareEndPoints("StartToEnd", a) ? c = d = b : (c = -d.moveStart("character", -b), c += e.slice(0, c).split("\n").length - 1, -1 < d.compareEndPoints("EndToEnd", a) ? d = b : (d = -d.moveEnd("character", -b), d += e.slice(0, d).split("\n").length - 1))); 85 | return { 86 | start: c, 87 | end: d 88 | } 89 | } 90 | function u(a, c, d) { 91 | d || (d = c); 92 | a.setSelectionRange ? (a.focus(), a.setSelectionRange(c, d)) : a.createTextRange ? (a = a.createTextRange(), a.collapse(!0), a.moveStart("character", c), a.moveEnd("character", d), a.select()) : a.selectionStart && (a.selectionStart = c, a.selectionEnd = d) 93 | } 94 | function B(a) { 95 | return (a = a.match(/^\n+/)) ? a[0].length : 0 96 | } 97 | function E(a, s) { 98 | function d() { 99 | s && s(p.canUndo(), p.canRedo()) 100 | } 101 | function e(a, b) { 102 | "boolean" != typeof b && (b = f == a); 103 | f = a; 104 | p.save(b) 105 | } 106 | function l() { 107 | var b = a.val(); 108 | return c.extend({ 109 | value: b 110 | }, t(q)) 111 | } 112 | var b = 0, 113 | g = [], 114 | f = "none", 115 | q = a.get(0); 116 | a.on("paste drop dragover dragenter", function() { 117 | e("paste", !1) 118 | }); 119 | a.on("keyup", function(a) { 120 | a.ctrlKey || a.metaKey || (a = a.keyCode, 33 <= a && 40 >= a || 63232 <= a && 63235 >= a ? e("moving") : 8 == a || 46 == a || 127 == a ? e("deleting") : 13 == a ? e("newlines") : 27 == a ? e("escape") : (16 > a || 20 < a) && 91 != a && e("typing")) 121 | }); 122 | var p = { 123 | canRedo: function() { 124 | return b < g.length - 1 125 | }, 126 | canUndo: function() { 127 | return 0 < b 128 | }, 129 | redo: function() { 130 | if (p.canRedo()) { 131 | b++; 132 | var c = g[b]; 133 | a.val(c.value); 134 | u(q, c.start, c.end) 135 | } 136 | d(); 137 | a.focus() 138 | }, 139 | undo: function() { 140 | if (p.canUndo()) { 141 | b--; 142 | var c = g[b]; 143 | a.val(c.value); 144 | u(q, c.start, c.end) 145 | } 146 | d(); 147 | a.focus() 148 | }, 149 | save: function(c) { 150 | setTimeout(function() { 151 | c ? g[b] = l() : p.last() !== a.val() && g.push(l()); 152 | b = g.length - 1; 153 | d() 154 | }, 10) 155 | }, 156 | last: function() { 157 | if (g.length) return g[g.length - 1].value 158 | } 159 | }; 160 | g.push(l()); 161 | b++; 162 | return p 163 | } 164 | function F(a) { 165 | var s = [], 166 | d = !1; 167 | a.textcomplete([{ 168 | match: /\B@([\d\w-_]*)$/, 169 | search: function(a, l) { 170 | var b = function() { 171 | var b = 0; 172 | l(c.map(s, function(c) { 173 | 5 > b && 0 === c.indexOf(a) ? b++ : c = null; 174 | return c 175 | })) 176 | }; 177 | d ? b() : (d = !0, c.post("/api/user", { 178 | action: "get-follows" 179 | }, function(a) { 180 | a.success && a.data && c.each(a.data, function(a, c) { 181 | additionMentions[c[1]] = c[0] 182 | }) 183 | }).complete(function() { 184 | c.each(additionMentions, function(a, c) { 185 | var b = a; 186 | a != c && (b = a + " (" + c + ")"); 187 | s.push(b) 188 | }); 189 | b() 190 | })) 191 | }, 192 | index: 1, 193 | replace: function(a) { 194 | var c = a.indexOf(" "); - 1 != c && (a = a.substr(0, c)); 195 | return "@" + a + " " 196 | } 197 | }]) 198 | } 199 | additionMentions = {}; 200 | c(function() { 201 | c(".markdown-editor").each(function(a, s) { 202 | function d(a, b) { 203 | b ? p.find(".md-btn").not(a).each(function(a, z) { 204 | var b = c(z); 205 | b.data("isDis", b.hasClass("disabled")); 206 | b.addClass("disabled") 207 | }) : p.find(".md-btn").not(a).each(function(a, z) { 208 | var b = c(z); 209 | b.data("isDis") || b.removeClass("disabled") 210 | }) 211 | } 212 | function e(a, b, d) { 213 | var w = t(v), 214 | k = f.val(), 215 | m = k.substr(0, w.start).lastIndexOf("\n") + 1, 216 | m = k.substring(m, w.start); 217 | c.trim(m) && (a = "\n" + a, b && (b += 1), d && (d += 1)); 218 | k = k.substr(0, w.end) + a + k.substr(w.end); 219 | f.val(k); 220 | u(v, b, d); 221 | r.save() 222 | } 223 | function l(a, c) { 224 | A = !1; 225 | var d = a.find(".alert-success").hide(), 226 | f = a.find(".alert-danger").hide(); 227 | c && c.success ? (a.find("[rel=filename]").val(""), a.find("[type=file]").val(""), b.find(".md-image").find("[name=link]").val(c.link), d.show()) : (c && c.msg ? f.text(c.msg) : f.text(f.data("message")), f.show()) 228 | } 229 | var b = c(s), 230 | g = b.find(".md-textarea"), 231 | f = g.find("textarea"), 232 | q = b.find(".md-preview"), 233 | p = b.find(".md-toolbar"), 234 | x = b.find("[data-meta=undo]"), 235 | y = b.find("[data-meta=redo]"), 236 | G = b.data("preview-url"), 237 | v = f.get(0), 238 | C = b.data("savekey"), 239 | D = "", 240 | n; 241 | b.data("editor", { 242 | insertText: e, 243 | getSel: function() { 244 | return t(v) 245 | } 246 | }); 247 | "" === f.val() && f.val(c.jStorage.get(C)); 248 | var H = setInterval(function() { 249 | c.jStorage.set(C, f.val()) 250 | }, 500); 251 | f.parents("form:first").on("submit", function() { 252 | clearInterval(H) 253 | }); 254 | f.autosize(); 255 | f.css("resize", "none"); 256 | F(f); 257 | b.on("click", "[data-meta=preview]", function() { 258 | var a = c(this); 259 | a.hasClass("active") ? (g.show(), q.hide(), a.removeClass("active"), d(a, !1), f.focus()) : (g.hide(), q.show(), a.addClass("active"), d(a, !0), a = c.trim(f.val()), "" === a ? q.html("") : a != D && (D = a, c.post(G, { 260 | action: "preview", 261 | content: a 262 | }, function(a) { 263 | a.success && (q.html(a.preview), q.mdFilter && q.mdFilter()) 264 | }))) 265 | }); 266 | f.on("keypress", function(a) { 267 | !a.ctrlKey && !a.metaKey || 89 != a.keyCode && 90 != a.keyCode || a.preventDefault() 268 | }); 269 | f.on("keydown", function(a) { 270 | var b = f, 271 | c = b.get(0), 272 | d = t(c), 273 | k = d.start, 274 | d = d.end, 275 | m = b.val(), 276 | h = a.ctrlKey || a.metaKey; 277 | switch (a.keyCode) { 278 | case 89: 279 | h && (r.redo(), a.preventDefault()); 280 | break; 281 | case 90: 282 | h && (a.shiftKey ? r.redo() : r.undo(), a.preventDefault()); 283 | break; 284 | case 9: 285 | var h = m.substring(k, d), 286 | e = B(h), 287 | h = h.substr(e), 288 | k = k + e; 289 | e = (e = h.match(/\n+$/)) ? e[0].length : 0; 290 | h = h.substr(0, h.length - e); 291 | d -= e; 292 | if (a.shiftKey) { 293 | var e = m.substr(0, k).lastIndexOf("\n") + 1, 294 | g = m.substr(d).indexOf("\n"); - 1 == g && (g = 0); 295 | var g = g + d, 296 | h = m.substring(e, g), 297 | l = h.replace(/^([ ]{1,4}|\t)/gm, ""), 298 | h = h.length - l.length; 299 | 0 < h && (k -= 1, m = m.substr(0, e) + l + m.substr(g), b.val(m)); 300 | e = B(m.substr(k)); 301 | u(c, k + e, d - h) 302 | } else h = "\t" + h.replace(/\n/g, "\n\t"), b.val(m.substr(0, k) + h + m.substr(d)), u(c, k + 1, k + h.length); 303 | r.save(); 304 | a.preventDefault() 305 | } 306 | }); 307 | b.find("[data-meta=image]").popover({ 308 | html: !0, 309 | container: b, 310 | title: b.find("[rel=image-popover-title]").html(), 311 | content: b.find("[rel=image-popover-content]").html() 312 | }); 313 | var A; 314 | b.on("click", "[rel=image-insert]", function() { 315 | var a = b.find(".md-image").find("[name=link]").val(), 316 | d = t(v); 317 | e("![](" + a + ")", d.start + 2); 318 | c(n).popover("hide") 319 | }); 320 | b.on("click", "[rel=image-upload]", function() { 321 | var a = b.find(".md-image-form"); 322 | a.slideToggle(); 323 | a.ajaxForm({ 324 | dataType: "json", 325 | beforeSubmit: function() { 326 | if (A || "" === a.find("[rel=filename]").val()) return !1; 327 | A = !0 328 | }, 329 | success: function(b) { 330 | l(a, b) 331 | }, 332 | error: function() { 333 | l(a) 334 | } 335 | }) 336 | }); 337 | b.on("click", "[data-meta=code]", function() { 338 | var a = t(v); 339 | if (a.start != a.end) { 340 | var b = f.val(), 341 | c = b.substring(a.start, a.end), 342 | b = b.substr(0, a.start) + "\n```go\n" + c + "\n```"; 343 | f.val(b); 344 | r.save() 345 | } else e("\n```go\n\n```", a.start + 7) 346 | }); 347 | var r = E(f, function(a, b) { 348 | a ? x.removeClass("disabled") : x.addClass("disabled"); 349 | b ? y.removeClass("disabled") : y.addClass("disabled"); 350 | f.trigger("autosize.resize") 351 | }); 352 | x.on("click", function() { 353 | r.undo() 354 | }); 355 | y.on("click", function() { 356 | r.redo() 357 | }); 358 | b.on("show.bs.popover", function(a) { 359 | n && n != a.target && c(n).popover("hide"); 360 | n = a.target 361 | }); 362 | b.on("hide.bs.popover", function(a) { 363 | n == a.target && (c(n).data("bs.popover").hoverState = "out", n = null) 364 | }); 365 | c(document).on("mousedown", function(a) { 366 | if (n && n != a.target) { 367 | a = c(a.target); 368 | var b = c(n); 369 | a.hasClass("md-btn") && a.hasClass("md-btn") && a.data("meta") == b.data("meta") || a.parents(".md-btn").length && a.parents(".md-btn").length && a.parents(".md-btn:first").data("meta") == b.data("meta") || a.parents(".popover").length || b.popover("hide") 370 | } 371 | }) 372 | }) 373 | }) 374 | })(jQuery); -------------------------------------------------------------------------------- /static/css/ee22d.css: -------------------------------------------------------------------------------- 1 | .color-picker .color-chooser{line-height:1}.color-picker .color-chooser-color{display:inline-block;padding:0;margin:0;height:25px;width:25px;cursor:pointer;box-sizing:border-box;border:solid 2px rgba(0,0,0,0)}.color-picker .color-picker-editor{font-size:14px;margin:0;padding:4px;border:1px solid #ddd;border-left-width:25px;border-radius:0;background-color:rgba(0,0,0,0);transition:border-color .2s ease-in;outline:0}.yue{font:400 18px/1.62 Georgia,"Xin Gothic","Hiragino Sans GB","WenQuanYi Micro Hei",sans-serif;color:#444443}.yue ::-moz-selection{background-color:rgba(0,0,0,.2)}.yue ::selection{background-color:rgba(0,0,0,.2)}.yue h1,.yue h2,.yue h3,.yue h4,.yue h5,.yue h6{font-family:Georgia,"Xin Gothic","Hiragino Sans GB","WenQuanYi Micro Hei","Microsoft YaHei",SimSun,sans-serif;color:#222223}.yue h1{font-size:1.8em;margin:.67em 0}.yue>h1{margin-top:0;font-size:2em}.yue h2{font-size:1.5em;margin:.83em 0}.yue h3{font-size:1.17em;margin:1em 0}.yue h4,.yue h5,.yue h6{font-size:1em;margin:1.6em 0 1em}.yue h6{font-weight:500}.yue p{margin-top:0;margin-bottom:1.46em}.yue a{color:#111;word-wrap:break-word;-moz-text-decoration-color:rgba(0,0,0,.4);text-decoration-color:rgba(0,0,0,.4)}.yue a:hover{color:#555;-moz-text-decoration-color:rgba(0,0,0,.6);text-decoration-color:rgba(0,0,0,.6)}.yue strong,.yue b{font-weight:700;color:#222}.yue em,.yue i{font-style:italic;color:#222}.yue img{max-width:100%;height:auto;margin:.2em 0}.yue a img{border:0}.yue figure{position:relative;clear:both;outline:0;margin:10px 0 30px;padding:0}.yue figure img{display:block;max-width:100%;margin:auto;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.yue figure figcaption{position:relative;width:100%;text-align:center;left:0;margin-top:10px;font-weight:400;font-size:14px;color:#666665}.yue figure figcaption a{text-decoration:none;color:#666665}.yue hr{display:block;width:14%;margin:40px auto 34px;border:0 none;border-top:3px solid #dededc}.yue blockquote{margin:0 0 1.64em;border-left:3px solid #dadada;padding-left:12px;color:#666664}.yue blockquote a{color:#666664}.yue ul,.yue ol{margin:0 0 24px 6px;padding-left:16px}.yue ul{list-style-type:square}.yue ol{list-style-type:decimal}.yue li{margin-bottom:.2em}.yue li ul,.yue li ol{margin-top:0;margin-bottom:0;margin-left:14px}.yue li ul{list-style-type:disc}.yue li ul ul{list-style-type:circle}.yue li p{margin:.4em 0 .6em}.yue .unstyled{list-style-type:none;margin:0;padding:0}.yue code,.yue tt{color:gray;font-size:.96em;background-color:#f9f9f7;padding:1px 2px;border:1px solid #dadada;border-radius:3px;font-family:Inconsolata,Menlo,monospace}.yue pre{margin:1.64em 0;padding:7px;border:0;border-left:3px solid #dadada;padding-left:10px;overflow:auto;line-height:1.5;font-size:.96em;font-family:Inconsolata,Menlo,monospace;color:#4c4c4c;background-color:#f9f9f7}.yue pre code,.yue pre tt{color:#4c4c4c;border:0;background:0;padding:0}.yue table{width:100%;border-collapse:collapse;border-spacing:0;margin-bottom:1.5em;font-size:.96em}.yue th,.yue td{text-align:left;padding:4px 8px 4px 10px;border:1px solid #dadada}.yue td{vertical-align:top}.yue tr:nth-child(even){background-color:#efefee}.yue iframe{display:block;max-width:100%;margin-bottom:30px}.yue figure iframe{margin:auto}.yue table pre{margin:0;padding:0;border:0;background:0}@media (min-width:1100px){.yue blockquote{margin-left:-24px;padding-left:20px;border-width:4px}.yue blockquote blockquote{margin-left:0}.yue figure figcaption:before{width:25%;margin-left:75%;border-top:1px solid #dededc;display:block;content:"";margin-bottom:10px}.yue figure figcaption{position:absolute;left:-172px;width:150px;top:0;text-align:right;margin-top:0}}.placeholder:before{content:attr(data-placeholder);margin-left:2px;opacity:.4}.social-button-item{font-size:24px;position:relative;display:inline-block;vertical-align:middle;text-align:center;margin:8px}.social-button-item .hide{display:none}.social-button-large .social-button-item{font-size:36px}.social-button-small .social-button-item{margin:10px 5px;font-size:18px}.social-button-item .social-button-icon{display:block;color:#979799;text-decoration:none!important}.social-button-item .social-button-icon-twitter:hover{color:#23acee!important}.social-button-item .social-button-icon-facebook:hover{color:#3c5696!important}.social-button-item .social-button-icon-weibo:hover{color:#e32428!important}.social-button-item .social-button-count{position:absolute;left:50%;text-align:center;margin-top:10px;font:300 14px/1 sans-serif;padding:6px 6px 5px;background:rgba(0,0,0,.76);border-radius:3px;color:#fff;opacity:0;-webkit-transition:opacity .2s ease-in-out;-moz-transition:opacity .2s ease-in-out;-ms-transition:opacity .2s ease-in-out;-o-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.social-button-item:hover .social-button-count{opacity:1}.social-button-item .social-button-count:before{position:absolute;top:-6px;left:50%;margin-left:-3px;content:'';width:0;height:0;border:3px solid transparent;border-bottom-color:rgba(0,0,0,.76)}.switch{position:relative;display:inline-block;overflow:hidden;height:3em;width:7.6em;border-radius:3em;-webkit-transition:background .2s ease-in,color .2s ease-in;transition:background .2s ease-in,color .2s ease-in;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}.switch-on-label,.switch-off-label{position:absolute;height:3em;font:300 1em/3em "Helvetica Neue",Helvetica,sans-serif;text-align:center;-webkit-transition:-webkit-transform .2s ease-in;transition:transform .2s ease-in;cursor:pointer}.switch-on-label{right:3em;left:0}.switch-off-label{right:0;left:3em}.switch-mask{position:absolute;left:0;top:0;height:3em;width:3em;border-radius:3em;background-color:#fff;background-color:rgba(255,255,255,.98);-webkit-background-clip:padding-box;background-clip:padding-box;border:2px solid transparent;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:left .2s ease-in,margin .2s ease-in;transition:left .2s ease-in,margin .2s ease-in}.switch.on .switch-mask{margin-left:-3em;left:100%}.switch.on .switch-off-label{-webkit-transform:translateX(100%)}.switch.off .switch-on-label{-webkit-transform:translateX(-100%)}.switch.on{color:#fff;background:#111}.switch.off{color:#bbb;background:#eaeaea}.vertical-field{border:0;padding:0 0 20px}.required label:after{content:'*';vertical-align:middle;margin-left:2px}.form-label,.form-message{color:#7C7C7C;font-family:Avenir,"Helvetica Neue",Helvetica,"Xin Gothic","Hiragino Sans GB","WenQuanYi Micro Hei","Microsoft YaHei",SimSun,sans-serif}.form-label label{margin-right:14px;font-weight:500}.form-input input,.form-input textarea{border:0;border-radius:4px;outline:0;background:rgba(0,0,0,.064);padding:8px 6px;font-size:18px;line-height:1;box-sizing:border-box;width:300px;margin-right:4px}.form-input textarea{width:80%}.form-message{visibility:hidden;margin-top:2px;font-size:12px}.success .form-input input{background:rgba(0,252,0,.064)}.success .form-input:after{content:"✔︎";color:#6BAB57}.error .form-input input{background:rgba(252,60,0,.064);color:#EB5E34}.error .form-input:after{content:"✘";color:#EB5E34}.success .form-message,.error .form-message{visibility:visible}.password-strength span{display:inline-block;width:48px;height:5px;background:rgba(0,0,0,.04);-webkit-transition:background .2s ease-in-out;-moz-transition:background .2s ease-in-out;-ms-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.password-strength-simple span:first-of-type{background:#EB5E34}.password-strength-medium span{background:#FCDB76}.password-strength-medium span:last-of-type{background:rgba(0,0,0,.04)}.password-strength-strong span{background:#6BAB57}.toggle .toggle-hover-inactive,.toggle .toggle-inner-active,.toggle .toggle-hover-active{display:none}.toggle .toggle-inner-inactive{display:initial}.toggle-active .toggle-inner-inactive{display:none}.toggle-active .toggle-inner-active{display:initial}.toggle:hover .toggle-inner-inactive{display:none}.toggle:hover .toggle-hover-inactive{display:initial}.toggle-active:hover .toggle-inner-active{display:none}.toggle-active:hover .toggle-hover-inactive{display:none}.toggle-active:hover .toggle-hover-active{display:initial}.notice-container{position:fixed;top:0;left:0;width:100%;z-index:999999}.notice-container .notice-item{position:relative;font:500 16px/1.8 Georgia,"Xin Gothic","Hiragino Sans GB","WenQuanYi Micro Hei",sans-serif;background:#fefefe;background:rgba(255,255,255,.9);color:#565656;padding:10px 20px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #efefef;text-align:center;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transform-origin:top;-ms-transform-origin:top;transform-origin:top}.notice-container .warning,.notice-container .warn{background:#fcf8e3;background:rgba(252,248,227,.9);border-color:#fbeed5;color:#c09853}.notice-container .danger,.notice-container .error{background:#f2dede;background:rgba(242,222,222,.9);border-color:#ebccd1;color:#a94442}.notice-container .notice-content{color:inherit;text-decoration:none;margin:0 auto;max-width:650px}.notice-container .notice-close{position:absolute;top:10px;right:20px;cursor:pointer;font:400 normal 22px/1.3 Arial,sans-serif;color:rgba(231,76,60,.6)}.notice-container .notice-dismiss{-webkit-transform:rotateX(60deg);-ms-transform:rotateX(60deg);transform:rotateX(60deg);opacity:0}@-webkit-keyframes overlay-scale{0%{-webkit-transform:scale(0.8);transform:scale(0.8)}50%{-webkit-transform:scale(1.1);transform:scale(1.1)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes overlay-scale{0%{-webkit-transform:scale(0.8);-ms-transform:scale(0.8);transform:scale(0.8)}50%{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}100%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}body.overlay-active{overflow:hidden}.overlay-active .overlay{display:block}.overlay{position:fixed;top:0;left:0;width:100%;height:100%;overflow:auto;background:#f9f9f9;background:rgba(255,255,255,.98);text-align:center;z-index:999;display:none}.overlay-close{position:fixed;top:8px;right:8px;color:#b3b3b1;background:#f9f9f9;background:rgba(0,0,0,0);padding:4px;margin:0;border:0;outline:0;font:500 24px/1 "Helvetica Neue",sans-serif}.overlay-close:hover{cursor:pointer}.overlay-container{max-width:680px;min-height:100%;margin:0 auto;padding:60px 10px;box-sizing:border-box;-webkit-animation:overlay-scale .2s ease-in-out;animation:overlay-scale .2s ease-in-out}@-webkit-keyframes nanobar-infinite{0{width:0;height:100%}86%{width:80%;height:100%}100%{width:100%;height:0}}@keyframes nanobar-infinite{0{width:0;height:100%}86%{width:80%;height:100%}100%{width:100%;height:0}}.nanobar{position:fixed;top:0;left:0;width:100%;height:6px;background:rgba(0,0,0,.02);clear:both}.nanobar .nanobar-progress{background:rgba(0,0,0,.96);box-shadow:0 0 18px rgba(255,255,255,.6);height:100%;width:0;-webkit-transition:width .3s linear,height .1s linear .2s;transition:width .3s linear,height .1s linear .2s}.nanobar .nanobar-progress-infinite{-webkit-animation:nanobar-infinite 2s infinite linear;animation:nanobar-infinite 2s infinite linear}@font-face{font-family:Yue;src:url(//dn-yuehu.qbox.me/fonts/Yue.eot?-q6cbkj);src:url(//dn-yuehu.qbox.me/fonts/Yue.eot?#iefix-q6cbkj) format('embedded-opentype'),url(//dn-yuehu.qbox.me/fonts/Yue.woff?-q6cbkj) format('woff'),url(//dn-yuehu.qbox.me/fonts/Yue.ttf?-q6cbkj) format('truetype'),url(//dn-yuehu.qbox.me/fonts/Yue.svg?-q6cbkj#Yue) format('svg');font-weight:400;font-style:normal}[class^=icon-]:before,[class*=" icon-"]:before{font-family:Yue;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-weibo:before{content:"\e601"}.icon-twitter:before{content:"\e604"}.icon-facebook:before{content:"\e60d"}.icon-writing:before{content:"\e600"}.icon-collection:before{content:"\e60e"}.icon-close:before{content:"\e60f"}.icon-ul:before{content:"\e603"}.icon-check:before{content:"\e610"}.icon-bookmark:before{content:"\e611"}.icon-spinner:before{content:"\e606"}.icon-blockquote:before{content:"\e613"}.icon-setting:before{content:"\e607"}.icon-plus:before{content:"\e608"}.icon-link:before{content:"\e60b"}.icon-upload:before{content:"\e602"}html,body{padding:0;margin:0}button.button,a.button{display:inline-block;-webkit-font-smoothing:antialiased;padding:.84em 1.2em;margin:0;background-color:#222223;color:#f9f9f8;text-transform:uppercase;border:0;text-decoration:none;outline:0;border-radius:3px;-webkit-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out;text-align:center;letter-spacing:.1em;font:700 .8em/1 Arial,"Xin Gothic","Hiragino Sans GB","WenQuanYi Micro Hei",sans-serif;cursor:pointer;vertical-align:middle}button.button:hover,a.button:hover{opacity:.9;-ms-filter:alpha(Opacity=90);filter:alpha(opacity=90);color:#fff}button.button:disabled,a.button.disabled{cursor:not-allowed;background-color:#666664}button.button.gray,a.button.gray{color:#9a9a9a;background-color:#e9e9ea}button.button.gray:hover,a.button.gray:hover{color:#9a9a9a;background-color:rgba(233,233,234,.6)}button.button.glass,a.button.glass{background-color:rgba(0,0,0,.2)}button.button i{font-style:normal;margin-right:4px;color:#fff}.collection-card{position:relative;float:left;width:200px;margin:0 10px 20px 0;border-radius:2px;text-align:center;-webkit-box-shadow:0 1px 2px #9a9a9a;box-shadow:0 1px 2px #9a9a9a;background:#fff}.collection-card a{display:block;text-decoration:none}.collection-card a:hover{opacity:.9;-ms-filter:alpha(Opacity=90);filter:alpha(opacity=90)}.collection-card .cover{display:block;width:100%;height:120px;color:#fff;margin:0;border-radius:2px 2px 0 0;text-decoration:none;background-color:#000}.collection-card .card-info{height:120px;padding:20px 16px;overflow:hidden;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.collection-card .collection-name{font-weight:500;margin:0}.collection-card .collection-name:after{content:'';display:block;width:60px;margin:4px auto 10px;border-bottom:3px solid #eeeeef}.collection-card .description{margin:0;color:#9a9a9a;font-size:90%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media (max-width:450px){.collection-card{width:98%}.collection-card .cover{height:180px}}.collections-overlay{font-family:"Xin Gothic","Hiragino Sans GB","WenQuanYi Micro Hei"}.collections-overlay .collection-card{cursor:pointer}.collections-overlay .icon-check{position:absolute;line-height:1;bottom:4px;right:6px;font-size:28px;color:#9a9a9a;color:rgba(0,0,0,.2)}.collections-overlay .active .icon-check{color:#222223}.vcard{zoom:1}.vcard:after{display:table;content:'';clear:both}.avatar{text-decoration:none}.avatar .photo,.vcard .avatar .photo{width:68px;height:68px;border-radius:50%}.avatar span.photo,.vcard .avatar span.photo{display:inline-block;background:#222223}.empty-message{font-weight:500;font-size:300%;text-align:center}@-webkit-keyframes spin{50%{-webkit-transform:rotate(180deg);transform:rotate(180deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{50%{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}.icon-spinner{display:inline-block;-webkit-animation:spin 1s infinite linear;animation:spin 1s infinite linear}.yue .icon-spinner{line-height:1}.field,.checkbox-field{margin-bottom:1.6em}.field .button{margin-right:1em}.checkbox-field label{font-size:16px;color:#9a9a9a}.editor{padding-top:60px}.editor textarea{height:360px}.entry-meta{font-family:Optima,Georgia,"Xin Gothic","Hiragino Sans GB","WenQuanYi Micro Hei",serif;font-size:14px;color:#9a9a9a;margin:.6em 0}.entry-meta a{color:#9a9a9a;text-decoration:none}.entry-meta a:hover{text-decoration:underline}.entry-title a{text-decoration:none}.entry-title .icon-link:before{font-size:14px;margin-right:10px;margin-left:-24px;color:#9a9a9a}.entry-list .item{position:relative;display:block;text-decoration:none;color:#9a9a9a;padding-bottom:1em;margin-top:1em;margin-bottom:1.6em;border-bottom:1px solid #eeeeef}.entry-list .item:last-of-type{border-bottom:0}.entry-list .entry-referee,.entry-list .entry-author{position:absolute;display:block;top:5px;right:0;width:48px;height:48px;border-radius:24px;background:#222223}.entry-list .entry-referee:hover,.entry-list .entry-author:hover{opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.entry-list .entry-referee img,.entry-list .entry-author img{margin:0;max-width:100%;border-radius:24px}.entry-list .entry-title{margin:0;padding-right:100px;line-height:1.2;font-size:1.48em}.entry-list .entry-snippet{display:block;text-decoration:none}.entry-list .entry-control{padding-top:20px}.entry-list .entry-control .button{margin-right:10px}.entry-list .view-on-yuehu{color:#9a9a9a;font-size:13px;margin-left:1em}.entry-list .view-on-yuehu:after{content:'»';padding-left:2px}.hentry>.wrapper{position:relative;padding-bottom:60px}.hentry .icon-bookmark{position:absolute;top:10px;right:0;font-size:28px;text-decoration:none;line-height:1;color:#9a9a9a}.hentry .icon-bookmark:hover{opacity:.6;-ms-filter:alpha(Opacity=60);filter:alpha(opacity=60)}.hentry .icon-bookmark.toggle-active{color:#000}.hentry .entry-meta{margin-top:-10px;margin-bottom:40px}.hentry .entry-meta .sep:after{margin:0 5px;content:'·'}.hentry .entry-meta .vcard{position:absolute;top:0;right:0;margin-right:14px;vertical-align:middle}.hentry .entry-meta .vcard-info{display:none}.hentry .entry-meta .avatar{display:inline-block;width:48px;height:48px}.hentry .entry-meta .photo{width:48px;height:48px;border-radius:50%}.hentry .entry-content{word-wrap:break-word;min-height:250px}.hentry .item{margin-bottom:22px}.hentry .item-title strong{color:#9a9a9a;font-weight:300;border-bottom:3px solid #eeeeef}.hentry .fn{font-weight:700}.hentry .entry-social{zoom:1}.hentry .entry-social:after{content:'';display:table;clear:both}.hentry .entry-social .button{margin-right:14px}.hentry .social-button{float:right}.hentry .entry-footer{padding:20px 0;border-top:1px solid #eeeeef;background:#f9f9f8}.entry-footer .footer-collection{float:left;margin-right:20px;word-break:break-all}.entry-footer .footer-card{overflow:hidden}.entry-footer .footer-card a{text-decoration:none}.entry-footer .footer-card-header{font-family:Avenir,Arial,"Xin Gothic","Hiragino Sans GB","WenQuanYi Micro Hei",sans-serif;font-size:14px;color:#9a9a9a;margin:0 0 20px;border-bottom:3px solid #eeeeef}.entry-footer .vcard .avatar{float:left;margin-right:20px}@media (min-width:980px){.hentry .icon-bookmark{margin-right:-40px}}@media (max-width:680px){.entry-footer .footer-collection{float:none}.footer-collection .collection-card{float:none}}.container{max-width:960px;margin:0 auto;zoom:1}.wrapper{zoom:1}.wrapper:after,.container:after{display:table;content:'';clear:both}.main-body .wrapper{max-width:650px;margin:0 auto}.main-body>.container,.main-body>.wrapper{padding-top:30px}.menu-sidebar{position:relative;float:left;margin-left:-230px;width:160px}.menu-sidebar ul{list-style:none;margin:0 0 48px;padding:0;max-height:300px;overflow-y:auto}.menu-sidebar li{line-height:1.8}.menu-sidebar ul a{text-decoration:none;color:#9a9a9a}.menu-sidebar ul a:hover{color:#666}.section{margin-bottom:60px}.section-title{font:700 14px Avenir,Arial,"Xin Gothic","Hiragino Sans GB","WenQuanYi Micro Hei",sans-serif;text-transform:uppercase;margin-bottom:18px;border-bottom:4px solid #eeeeef}.section-title a{line-height:1;text-decoration:none}.section-title a:after{content:"→";margin-left:4px}.section-input{position:relative;padding:10px 0;border-top:1px solid #eeeeef;border-bottom:1px solid #eeeeef;margin:0 0 30px}.section-input input{border:0;font-size:16px;width:80%;padding:4px 0;outline:0}.section-input .button{position:absolute;right:0;top:6px;color:#fff}.iframe-body{position:absolute;top:47px;width:100%;height:100%}.iframe-body iframe{width:100%;height:100%}@media (max-width:980px){.container{padding-left:10px;padding-right:10px}}@media (max-width:680px){.wrapper{padding-left:10px;padding-right:10px}}.menu{padding:16px 0;color:#9a9a9a}.menu .container{max-width:1110px}.menu a{text-decoration:none;color:#9a9a9a}.menu .menu-main{float:left}.menu .brand{font:400 400 20px "Xin Gothic","Hiragino Sans GB","WenQuanYi Micro Hei";margin-right:20px}.menu .brand sup{font:italic 400 14px Avenir,Arial,"Xin Gothic","Hiragino Sans GB","WenQuanYi Micro Hei",sans-serif;margin-left:4px}.menu .menu-sub{float:right;font:400 400 14px "Xin Gothic","Hiragino Sans GB","WenQuanYi Micro Hei"}.menu-bar{background:#fff;padding:0;height:46px;line-height:46px;border-bottom:1px solid #eeeeef}.menu-bar .menu-sub{line-height:46px}.menu-bar .menu-item{display:inline-block;font-size:14px;height:46px;padding:0 10px;border-left:1px solid #eeeeef}.header-cover{position:relative;background:rgba(0,0,0,.8) no-repeat center center;-webkit-background-size:cover;background-size:cover;height:400px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-family:Avenir,Arial,"Xin Gothic","Hiragino Sans GB","WenQuanYi Micro Hei",sans-serif}.header-cover .menu{position:absolute;top:0;left:0;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;z-index:9;color:#fff}.header-cover .menu a{color:#fff}.header-cover-container{padding-top:120px;width:100%;height:100%;text-align:center;color:#fff;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.3)),to(rgba(0,0,0,0)));background:-webkit-linear-gradient(rgba(0,0,0,.3),rgba(0,0,0,0));background:linear-gradient(rgba(0,0,0,.3),rgba(0,0,0,0))}.header-cover .avatar{display:inline-block;margin-bottom:20px}.header-cover .avatar img{width:120px;height:120px;border-radius:50%}.header-cover .header-title{font-size:28px;font-weight:500;line-height:1;padding:0;margin:0;text-shadow:5px 5px 0 rgba(0,0,0,.064);font-family:Optima,Georgia,"Xin Gothic","Hiragino Sans GB","WenQuanYi Micro Hei",serif;-webkit-font-smoothing:antialiased}.header-cover .header-title a{color:#fff;text-decoration:none}.header-cover .header-description{text-shadow:5px 5px 0 rgba(0,0,0,.064)}.header-cover .header-button{display:inline-block;margin-top:60px}.menu-sub .menu-buttons{display:inline-block;margin-right:20px}.menu-sub .button{font-size:15px;padding:6px 16px;background-color:rgba(0,0,0,.56)}.menu-sub .menu-buttons .button{margin-left:8px}.header-cover .editable{display:inline-block;padding:2px 10px;line-height:1.4;outline:0;background-color:rgba(0,0,0,.1);border-radius:3px}.item{position:relative}.account-form{max-width:480px;margin:60px auto}.account-form .form-title{font-size:36px}.account-form .form-title a{text-decoration:none}.collaborator-list .item{padding:10px 0;border-bottom:1px solid #eeeeef}.collaborator-list .item .button{position:absolute;right:0;top:20px}.collaborator-list .item a{text-decoration:none}.collaborator-list .item .avatar{float:left;display:inline-block;width:48px;height:48px;margin-right:24px}.collaborator-list .item .photo{width:48px;height:48px}.collaborator-list .item .vcard-info{float:left}.collaborator-list .description{margin:0}.switch-section{position:relative}.switch-section .switch{font-size:11px;position:absolute;bottom:0;right:0}.menu-sidebar .members .photo{width:34px;height:34px;border-radius:3px}.homepage{padding-top:60px}.homepage-intro{float:left;width:60%}.homepage-intro h1{margin-top:0}.homepage-signup{float:right;width:35%}.homepage-signup .field a{text-decoration:none;font-size:14px}@media (max-width:860px){.homepage-intro,.homepage-signup{float:none;width:100%}.homepage-signup{padding-top:40px;border-top:1px solid #eeeeef}} -------------------------------------------------------------------------------- /static/javascript/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.0.3 (http://getbootstrap.com) 3 | * Copyright 2013 Twitter, Inc. 4 | * Licensed under http://www.apache.org/licenses/LICENSE-2.0 5 | */ 6 | 7 | if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b=!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(''}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); -------------------------------------------------------------------------------- /static/javascript/prettify.js: -------------------------------------------------------------------------------- 1 | !function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; 2 | (function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),e=[],a= 3 | b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;ah[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k=5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.length;c=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, 10 | q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d.push(["com", 11 | /^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+"]|\\x5C"+ 12 | s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/, 13 | q],["pun",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b(a,c){var d= 14 | c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i=0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], 18 | "catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"], 19 | O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], 20 | Q=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/, 21 | V=/\S/,X=v({keywords:[M,O,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-", 22 | /^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);p(C([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/], 23 | ["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);p(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:R}), 24 | ["cs"]);p(v({keywords:N,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);p(v({keywords:Q, 25 | hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]); 26 | p(C([],[["str",/^[\S\s]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var b=document.createElement("div");b.innerHTML="
"+a+"
";b=b.firstChild;g&&J(b,g,!0);K({h:d,j:g,c:b,i:1}); 27 | return b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function g(){for(var b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}\b/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]); 64 | 65 | // lang-dart.js 66 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"]],[["com",/^#!.*/],["kwd",/^\b(?:import|library|part of|part|as|show|hide)\b/i],["com",/^\/\/.*/],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["kwd",/^\b(?:class|interface)\b/i],["kwd",/^\b(?:assert|break|case|catch|continue|default|do|else|finally|for|if|in|is|new|return|super|switch|this|throw|try|while)\b/i],["kwd",/^\b(?:abstract|const|extends|factory|final|get|implements|native|operator|set|static|typedef|var)\b/i], 67 | ["typ",/^\b(?:bool|double|dynamic|int|num|object|string|void)\b/i],["kwd",/^\b(?:false|null|true)\b/i],["str",/^r?'''[\S\s]*?[^\\]'''/],["str",/^r?"""[\S\s]*?[^\\]"""/],["str",/^r?'('|[^\n\f\r]*?[^\\]')/],["str",/^r?"("|[^\n\f\r]*?[^\\]")/],["pln",/^[$_a-z]\w*/i],["pun",/^[!%&*+/:<-?^|~-]/],["lit",/^\b0x[\da-f]+/i],["lit",/^\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i],["lit",/^\b\.\d+(?:e[+-]?\d+)?/i],["pun",/^[(),.;[\]{}]/]]), 68 | ["dart"]); 69 | 70 | // lang-erlang.js 71 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t-\r ]+/,null,"\t\n\u000b\u000c\r "],["str",/^"(?:[^\n\f\r"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["lit",/^[a-z]\w*/],["lit",/^'(?:[^\n\f\r'\\]|\\[^&])+'?/,null,"'"],["lit",/^\?[^\t\n ({]+/,null,"?"],["lit",/^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)/i,null,"0123456789"]],[["com",/^%[^\n]*/],["kwd",/^(?:module|attributes|do|let|in|letrec|apply|call|primop|case|of|end|when|fun|try|catch|receive|after|char|integer|float,atom,string,var)\b/], 72 | ["kwd",/^-[_a-z]+/],["typ",/^[A-Z_]\w*/],["pun",/^[,.;]/]]),["erlang","erl"]); 73 | 74 | // lang-go.js 75 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["pln",/^(?:"(?:[^"\\]|\\[\S\s])*(?:"|$)|'(?:[^'\\]|\\[\S\s])+(?:'|$)|`[^`]*(?:`|$))/,null,"\"'"]],[["com",/^(?:\/\/[^\n\r]*|\/\*[\S\s]*?\*\/)/],["pln",/^(?:[^"'/`]|\/(?![*/]))+/]]),["go"]); 76 | 77 | // lang-hs.js 78 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t-\r ]+/,null,"\t\n\u000b\u000c\r "],["str",/^"(?:[^\n\f\r"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["str",/^'(?:[^\n\f\r'\\]|\\[^&])'?/,null,"'"],["lit",/^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)/i,null,"0123456789"]],[["com",/^(?:--+[^\n\f\r]*|{-(?:[^-]|-+[^}-])*-})/],["kwd",/^(?:case|class|data|default|deriving|do|else|if|import|in|infix|infixl|infixr|instance|let|module|newtype|of|then|type|where|_)(?=[^\d'A-Za-z]|$)/, 79 | null],["pln",/^(?:[A-Z][\w']*\.)*[A-Za-z][\w']*/],["pun",/^[^\d\t-\r "'A-Za-z]+/]]),["hs"]); 80 | 81 | // lang-lisp.js 82 | var a=null; 83 | PR.registerLangHandler(PR.createSimpleLexer([["opn",/^\(+/,a,"("],["clo",/^\)+/,a,")"],["com",/^;[^\n\r]*/,a,";"],["pln",/^[\t\n\r \xa0]+/,a,"\t\n\r \u00a0"],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/,a], 84 | ["lit",/^[+-]?(?:[#0]x[\da-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[de][+-]?\d+)?)/i],["lit",/^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[_a-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/i],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["cl","el","lisp","lsp","scm","ss","rkt"]); 85 | 86 | // lang-llvm.js 87 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^!?"(?:[^"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["com",/^;[^\n\r]*/,null,";"]],[["pln",/^[!%@](?:[$\-.A-Z_a-z][\w$\-.]*|\d+)/],["kwd",/^[^\W\d]\w*/,null],["lit",/^\d+\.\d+/],["lit",/^(?:\d+|0[Xx][\dA-Fa-f]+)/],["pun",/^[(-*,:<->[\]{}]|\.\.\.$/]]),["llvm","ll"]); 88 | 89 | // lang-lua.js 90 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^(?:"(?:[^"\\]|\\[\S\s])*(?:"|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$))/,null,"\"'"]],[["com",/^--(?:\[(=*)\[[\S\s]*?(?:]\1]|$)|[^\n\r]*)/],["str",/^\[(=*)\[[\S\s]*?(?:]\1]|$)/],["kwd",/^(?:and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,null],["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i], 91 | ["pln",/^[_a-z]\w*/i],["pun",/^[^\w\t\n\r \xa0][^\w\t\n\r "'+=\xa0-]*/]]),["lua"]); 92 | 93 | // lang-ml.js 94 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["com",/^#(?:if[\t\n\r \xa0]+(?:[$_a-z][\w']*|``[^\t\n\r`]*(?:``|$))|else|endif|light)/i,null,"#"],["str",/^(?:"(?:[^"\\]|\\[\S\s])*(?:"|$)|'(?:[^'\\]|\\[\S\s])(?:'|$))/,null,"\"'"]],[["com",/^(?:\/\/[^\n\r]*|\(\*[\S\s]*?\*\))/],["kwd",/^(?:abstract|and|as|assert|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|if|in|inherit|inline|interface|internal|lazy|let|match|member|module|mutable|namespace|new|null|of|open|or|override|private|public|rec|return|static|struct|then|to|true|try|type|upcast|use|val|void|when|while|with|yield|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|global|include|method|mixin|object|parallel|process|protected|pure|sealed|trait|virtual|volatile)\b/], 95 | ["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],["pln",/^(?:[_a-z][\w']*[!#?]?|``[^\t\n\r`]*(?:``|$))/i],["pun",/^[^\w\t\n\r "'\xa0]+/]]),["fs","ml"]); 96 | 97 | // lang-mumps.js 98 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^"(?:[^"]|\\.)*"/,null,'"']],[["com",/^;[^\n\r]*/,null,";"],["dec",/^\$(?:d|device|ec|ecode|es|estack|et|etrap|h|horolog|i|io|j|job|k|key|p|principal|q|quit|st|stack|s|storage|sy|system|t|test|tl|tlevel|tr|trestart|x|y|z[a-z]*|a|ascii|c|char|d|data|e|extract|f|find|fn|fnumber|g|get|j|justify|l|length|na|name|o|order|p|piece|ql|qlength|qs|qsubscript|q|query|r|random|re|reverse|s|select|st|stack|t|text|tr|translate|nan)\b/i, 99 | null],["kwd",/^(?:[^$]b|break|c|close|d|do|e|else|f|for|g|goto|h|halt|h|hang|i|if|j|job|k|kill|l|lock|m|merge|n|new|o|open|q|quit|r|read|s|set|tc|tcommit|tre|trestart|tro|trollback|ts|tstart|u|use|v|view|w|write|x|xecute)\b/i,null],["lit",/^[+-]?(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?/i],["pln",/^[a-z][^\W_]*/i],["pun",/^[^\w\t\n\r"$%;^\xa0]|_/]]),["mumps"]); 100 | 101 | // lang-n.js 102 | var a=null; 103 | PR.registerLangHandler(PR.createSimpleLexer([["str",/^(?:'(?:[^\n\r'\\]|\\.)*'|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,a,'"'],["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,a,"#"],["pln",/^\s+/,a," \r\n\t\u00a0"]],[["str",/^@"(?:[^"]|"")*(?:"|$)/,a],["str",/^<#[^#>]*(?:#>|$)/,a],["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,a],["com",/^\/\/[^\n\r]*/,a],["com",/^\/\*[\S\s]*?(?:\*\/|$)/, 104 | a],["kwd",/^(?:abstract|and|as|base|catch|class|def|delegate|enum|event|extern|false|finally|fun|implements|interface|internal|is|macro|match|matches|module|mutable|namespace|new|null|out|override|params|partial|private|protected|public|ref|sealed|static|struct|syntax|this|throw|true|try|type|typeof|using|variant|virtual|volatile|when|where|with|assert|assert2|async|break|checked|continue|do|else|ensures|for|foreach|if|late|lock|new|nolate|otherwise|regexp|repeat|requires|return|surroundwith|unchecked|unless|using|while|yield)\b/, 105 | a],["typ",/^(?:array|bool|byte|char|decimal|double|float|int|list|long|object|sbyte|short|string|ulong|uint|ufloat|ulong|ushort|void)\b/,a],["lit",/^@[$_a-z][\w$@]*/i,a],["typ",/^@[A-Z]+[a-z][\w$@]*/,a],["pln",/^'?[$_a-z][\w$@]*/i,a],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,a,"0123456789"],["pun",/^.[^\s\w"-$'./@`]*/,a]]),["n","nemerle"]); 106 | 107 | // lang-pascal.js 108 | var a=null; 109 | PR.registerLangHandler(PR.createSimpleLexer([["str",/^'(?:[^\n\r'\\]|\\.)*(?:'|$)/,a,"'"],["pln",/^\s+/,a," \r\n\t\u00a0"]],[["com",/^\(\*[\S\s]*?(?:\*\)|$)|^{[\S\s]*?(?:}|$)/,a],["kwd",/^(?:absolute|and|array|asm|assembler|begin|case|const|constructor|destructor|div|do|downto|else|end|external|for|forward|function|goto|if|implementation|in|inline|interface|interrupt|label|mod|not|object|of|or|packed|procedure|program|record|repeat|set|shl|shr|then|to|type|unit|until|uses|var|virtual|while|with|xor)\b/i,a], 110 | ["lit",/^(?:true|false|self|nil)/i,a],["pln",/^[a-z][^\W_]*/i,a],["lit",/^(?:\$[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)/i,a,"0123456789"],["pun",/^.[^\s\w$'./@]*/,a]]),["pascal"]); 111 | 112 | // lang-proto.js 113 | PR.registerLangHandler(PR.sourceDecorator({keywords:"bytes,default,double,enum,extend,extensions,false,group,import,max,message,option,optional,package,repeated,required,returns,rpc,service,syntax,to,true",types:/^(bool|(double|s?fixed|[su]?int)(32|64)|float|string)\b/,cStyleComments:!0}),["proto"]); 114 | 115 | // lang-r.js 116 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["str",/^'(?:[^'\\]|\\[\S\s])*(?:'|$)/,null,"'"]],[["com",/^#.*/],["kwd",/^(?:if|else|for|while|repeat|in|next|break|return|switch|function)(?![\w.])/],["lit",/^0[Xx][\dA-Fa-f]+([Pp]\d+)?[Li]?/],["lit",/^[+-]?(\d+(\.\d+)?|\.\d+)([Ee][+-]?\d+)?[Li]?/],["lit",/^(?:NULL|NA(?:_(?:integer|real|complex|character)_)?|Inf|TRUE|FALSE|NaN|\.\.(?:\.|\d+))(?![\w.])/], 117 | ["pun",/^(?:<>?|-|==|<=|>=|<|>|&&?|!=|\|\|?|[!*+/^]|%.*?%|[$=@~]|:{1,3}|[(),;?[\]{}])/],["pln",/^(?:[A-Za-z]+[\w.]*|\.[^\W\d][\w.]*)(?![\w.])/],["str",/^`.+`/]]),["r","s","R","S","Splus"]); 118 | 119 | // lang-rd.js 120 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["com",/^%[^\n\r]*/,null,"%"]],[["lit",/^\\(?:cr|l?dots|R|tab)\b/],["kwd",/^\\[@-Za-z]+/],["kwd",/^#(?:ifn?def|endif)/],["pln",/^\\[{}]/],["pun",/^[()[\]{}]+/]]),["Rd","rd"]); 121 | 122 | // lang-scala.js 123 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^"(?:""(?:""?(?!")|[^"\\]|\\.)*"{0,3}|(?:[^\n\r"\\]|\\.)*"?)/,null,'"'],["lit",/^`(?:[^\n\r\\`]|\\.)*`?/,null,"`"],["pun",/^[!#%&(--:-@[-^{-~]+/,null,"!#%&()*+,-:;<=>?@[\\]^{|}~"]],[["str",/^'(?:[^\n\r'\\]|\\(?:'|[^\n\r']+))'/],["lit",/^'[$A-Z_a-z][\w$]*(?![\w$'])/],["kwd",/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object|override|package|private|protected|requires|return|sealed|super|throw|trait|try|type|val|var|while|with|yield)\b/], 124 | ["lit",/^(?:true|false|null|this)\b/],["lit",/^(?:0(?:[0-7]+|x[\da-f]+)l?|(?:0|[1-9]\d*)(?:(?:\.\d+)?(?:e[+-]?\d+)?f?|l?)|\\.\d+(?:e[+-]?\d+)?f?)/i],["typ",/^[$_]*[A-Z][\d$A-Z_]*[a-z][\w$]*/],["pln",/^[$A-Z_a-z][\w$]*/],["com",/^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],["pun",/^(?:\.+|\/)/]]),["scala"]); 125 | 126 | // lang-sql.js 127 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,null,"\"'"]],[["com",/^(?:--[^\n\r]*|\/\*[\S\s]*?(?:\*\/|$))/],["kwd",/^(?:add|all|alter|and|any|apply|as|asc|authorization|backup|begin|between|break|browse|bulk|by|cascade|case|check|checkpoint|close|clustered|coalesce|collate|column|commit|compute|connect|constraint|contains|containstable|continue|convert|create|cross|current|current_date|current_time|current_timestamp|current_user|cursor|database|dbcc|deallocate|declare|default|delete|deny|desc|disk|distinct|distributed|double|drop|dummy|dump|else|end|errlvl|escape|except|exec|execute|exists|exit|fetch|file|fillfactor|following|for|foreign|freetext|freetexttable|from|full|function|goto|grant|group|having|holdlock|identity|identitycol|identity_insert|if|in|index|inner|insert|intersect|into|is|join|key|kill|left|like|lineno|load|match|matched|merge|natural|national|nocheck|nonclustered|nocycle|not|null|nullif|of|off|offsets|on|open|opendatasource|openquery|openrowset|openxml|option|or|order|outer|over|partition|percent|pivot|plan|preceding|precision|primary|print|proc|procedure|public|raiserror|read|readtext|reconfigure|references|replication|restore|restrict|return|revoke|right|rollback|rowcount|rowguidcol|rows?|rule|save|schema|select|session_user|set|setuser|shutdown|some|start|statistics|system_user|table|textsize|then|to|top|tran|transaction|trigger|truncate|tsequal|unbounded|union|unique|unpivot|update|updatetext|use|user|using|values|varying|view|waitfor|when|where|while|with|within|writetext|xml)(?=[^\w-]|$)/i, 128 | null],["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],["pln",/^[_a-z][\w-]*/i],["pun",/^[^\w\t\n\r "'\xa0][^\w\t\n\r "'+\xa0-]*/]]),["sql"]); 129 | 130 | // lang-tcl.js 131 | var a=null; 132 | PR.registerLangHandler(PR.createSimpleLexer([["opn",/^{+/,a,"{"],["clo",/^}+/,a,"}"],["com",/^#[^\n\r]*/,a,"#"],["pln",/^[\t\n\r \xa0]+/,a,"\t\n\r \u00a0"],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:after|append|apply|array|break|case|catch|continue|error|eval|exec|exit|expr|for|foreach|if|incr|info|proc|return|set|switch|trace|uplevel|upvar|while)\b/,a],["lit",/^[+-]?(?:[#0]x[\da-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[de][+-]?\d+)?)/i],["lit", 133 | /^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[_a-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/i],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["tcl"]); 134 | 135 | // lang-tex.js 136 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["com",/^%[^\n\r]*/,null,"%"]],[["kwd",/^\\[@-Za-z]+/],["kwd",/^\\./],["typ",/^[$&]/],["lit",/[+-]?(?:\.\d+|\d+(?:\.\d*)?)(cm|em|ex|in|pc|pt|bp|mm)/i],["pun",/^[()=[\]{}]+/]]),["latex","tex"]); 137 | 138 | // lang-vb.js 139 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0\u2028\u2029]+/,null,"\t\n\r \u00a0\u2028\u2029"],["str",/^(?:["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})(?:["\u201c\u201d]c|$)|["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})*(?:["\u201c\u201d]|$))/i,null,'"\u201c\u201d'],["com",/^['\u2018\u2019](?:_(?:\r\n?|[^\r]?)|[^\n\r_\u2028\u2029])*/,null,"'\u2018\u2019"]],[["kwd",/^(?:addhandler|addressof|alias|and|andalso|ansi|as|assembly|auto|boolean|byref|byte|byval|call|case|catch|cbool|cbyte|cchar|cdate|cdbl|cdec|char|cint|class|clng|cobj|const|cshort|csng|cstr|ctype|date|decimal|declare|default|delegate|dim|directcast|do|double|each|else|elseif|end|endif|enum|erase|error|event|exit|finally|for|friend|function|get|gettype|gosub|goto|handles|if|implements|imports|in|inherits|integer|interface|is|let|lib|like|long|loop|me|mod|module|mustinherit|mustoverride|mybase|myclass|namespace|new|next|not|notinheritable|notoverridable|object|on|option|optional|or|orelse|overloads|overridable|overrides|paramarray|preserve|private|property|protected|public|raiseevent|readonly|redim|removehandler|resume|return|select|set|shadows|shared|short|single|static|step|stop|string|structure|sub|synclock|then|throw|to|try|typeof|unicode|until|variant|wend|when|while|with|withevents|writeonly|xor|endif|gosub|let|variant|wend)\b/i, 140 | null],["com",/^rem\b.*/i],["lit",/^(?:true\b|false\b|nothing\b|\d+(?:e[+-]?\d+[dfr]?|[dfilrs])?|(?:&h[\da-f]+|&o[0-7]+)[ils]?|\d*\.\d+(?:e[+-]?\d+)?[dfr]?|#\s+(?:\d+[/-]\d+[/-]\d+(?:\s+\d+:\d+(?::\d+)?(\s*(?:am|pm))?)?|\d+:\d+(?::\d+)?(\s*(?:am|pm))?)\s+#)/i],["pln",/^(?:(?:[a-z]|_\w)\w*(?:\[[!#%&@]+])?|\[(?:[a-z]|_\w)\w*])/i],["pun",/^[^\w\t\n\r "'[\]\xa0\u2018\u2019\u201c\u201d\u2028\u2029]+/],["pun",/^(?:\[|])/]]),["vb","vbs"]); 141 | 142 | // lang-vhdl.js 143 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"]],[["str",/^(?:[box]?"(?:[^"]|"")*"|'.')/i],["com",/^--[^\n\r]*/],["kwd",/^(?:abs|access|after|alias|all|and|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|mod|nand|new|next|nor|not|null|of|on|open|or|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|rem|report|return|rol|ror|select|severity|shared|signal|sla|sll|sra|srl|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with|xnor|xor)(?=[^\w-]|$)/i, 144 | null],["typ",/^(?:bit|bit_vector|character|boolean|integer|real|time|string|severity_level|positive|natural|signed|unsigned|line|text|std_u?logic(?:_vector)?)(?=[^\w-]|$)/i,null],["typ",/^'(?:active|ascending|base|delayed|driving|driving_value|event|high|image|instance_name|last_active|last_event|last_value|left|leftof|length|low|path_name|pos|pred|quiet|range|reverse_range|right|rightof|simple_name|stable|succ|transaction|val|value)(?=[^\w-]|$)/i,null],["lit",/^\d+(?:_\d+)*(?:#[\w.\\]+#(?:[+-]?\d+(?:_\d+)*)?|(?:\.\d+(?:_\d+)*)?(?:e[+-]?\d+(?:_\d+)*)?)/i], 145 | ["pln",/^(?:[a-z]\w*|\\[^\\]*\\)/i],["pun",/^[^\w\t\n\r "'\xa0][^\w\t\n\r "'\xa0-]*/]]),["vhdl","vhd"]); 146 | 147 | // lang-wiki.js 148 | PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\d\t a-gi-z\xa0]+/,null,"\t \u00a0abcdefgijklmnopqrstuvwxyz0123456789"],["pun",/^[*=[\]^~]+/,null,"=*~^[]"]],[["lang-wiki.meta",/(?:^^|\r\n?|\n)(#[a-z]+)\b/],["lit",/^[A-Z][a-z][\da-z]+[A-Z][a-z][^\W_]+\b/],["lang-",/^{{{([\S\s]+?)}}}/],["lang-",/^`([^\n\r`]+)`/],["str",/^https?:\/\/[^\s#/?]*(?:\/[^\s#?]*)?(?:\?[^\s#]*)?(?:#\S*)?/i],["pln",/^(?:\r\n|[\S\s])[^\n\r#*=A-[^`h{~]*/]]),["wiki"]); 149 | PR.registerLangHandler(PR.createSimpleLexer([["kwd",/^#[a-z]+/i,null,"#"]],[]),["wiki.meta"]); 150 | 151 | // lang-yaml.js 152 | var a=null; 153 | var a=null; 154 | PR.registerLangHandler(PR.createSimpleLexer([["pun",/^[:>?|]+/,a,":|>?"],["dec",/^%(?:YAML|TAG)[^\n\r#]+/,a,"%"],["typ",/^&\S+/,a,"&"],["typ",/^!\S*/,a,"!"],["str",/^"(?:[^"\\]|\\.)*(?:"|$)/,a,'"'],["str",/^'(?:[^']|'')*(?:'|$)/,a,"'"],["com",/^#[^\n\r]*/,a,"#"],["pln",/^\s+/,a," \t\r\n"]],[["dec",/^(?:---|\.\.\.)(?:[\n\r]|$)/],["pun",/^-/],["kwd",/^\w+:[\n\r ]/],["pln",/^\w+/]]),["yaml","yml"]); 155 | --------------------------------------------------------------------------------