diff --git a/README.md b/README.md
new file mode 100644
index 0000000..279b87c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,18 @@
+[B3log Solo Skins](http://vanessa.b3log.org/b3log-skin)
+=======================================================
+
+1. [开发步骤](https://github.com/b3log/b3log-solo/wiki/Develop_steps)
+2. [模板变量](https://github.com/b3log/b3log-solo/wiki/Template_variables)
+3. [皮肤定制](https://github.com/b3log/b3log-solo/wiki/skins_custom)
+4. [版本更新](https://github.com/b3log/b3log-solo/wiki/Skins_change_log)
+
+
+每个皮肤单独存放于根目录下以该皮肤名称为名的文件夹中。其中 helper 中存放辅助工具、 PSD 文件以及皮肤的预览图片。
+
+----------------------
+
+平等,自由,奔放
+
+Equality, Freedom, Passion
+
+;-)
diff --git a/helper/README.md b/helper/README.md
new file mode 100644
index 0000000..5482435
--- /dev/null
+++ b/helper/README.md
@@ -0,0 +1,27 @@
+B3log Solo 皮肤工具
+==================================================
+
+PSD
+------------------------------------------
+存放皮肤中用到的 psd 文件
+
+skin-preview
+------------------------------------------
+存放每个皮肤的预览图片。命名规则为: skinName[-pathname].png
+
+tools
+------------------------------------------
+皮肤辅助工具(Node.js)
+* compress.js
+ 对 js, css 进行压缩后在当前目生成 XXX.min.js/css 文件
+* get-static.js
+ 提取皮肤中的 js, css, image 等静态资源到 b3log-solo-skins/helper/tools/static 目录下
+* update-version.js
+ 批量更新 skin.properties 文件中的 forSolo 版本号
+
+------------------------------------------
+平等,自由,奔放
+
+Equality, Freedom, Passion
+
+;-)
diff --git a/helper/tools/get-static.js b/helper/tools/get-static.js
new file mode 100644
index 0000000..5efb842
--- /dev/null
+++ b/helper/tools/get-static.js
@@ -0,0 +1,45 @@
+var fs = require('fs'),
+path = require('path');
+
+var getAllFiles = function (root){
+ var res = [],
+ files = fs.readdirSync(root);
+
+ files.forEach(function(file){
+ var pathname = root+'/'+file,
+ stat = fs.lstatSync(pathname);
+
+ if (!stat.isDirectory()){
+ if (file.indexOf(".ftl") < 0 && file.indexOf(".properties") < 0
+ && root.indexOf("../../helper") < 0 && root.indexOf("../../.git") < 0) {
+ res.push(pathname);
+ }
+ } else {
+ res = res.concat(getAllFiles(pathname));
+ }
+ });
+ return res;
+};
+
+var mkdirsSync = function(dirpath) {
+ if(fs.existsSync(dirpath)){
+ return;
+ }
+ var dirs = dirpath.split('/');
+ var dir = '';
+ for(var i = 0; i < dirs.length; i++) {
+ dir += dirs[i] + '/';
+ if(!fs.existsSync(dir)){
+ fs.mkdirSync(dir);
+ }
+ }
+};
+
+var skins = getAllFiles("../..");
+(function () {
+ mkdirsSync("static");
+ for (var i = 0; i < skins.length; i++) {
+ mkdirsSync(path.dirname(skins[i].replace("../..", "static/skins")));
+ fs.writeFileSync(skins[i].replace("../..", "static/skins"), fs.readFileSync(skins[i]), "UTF-8");
+ }
+})();
\ No newline at end of file
diff --git a/neoease/css/neoease.css b/neoease/css/neoease.css
index 094ee5c..c24dbc0 100644
--- a/neoease/css/neoease.css
+++ b/neoease/css/neoease.css
@@ -2,7 +2,7 @@
* skin neoease style
*
* @author Liyuan Li
- * @version 1.0.1.7, Aug 6, 2012
+ * @version 1.0.1.8, Sep 6, 2012
*/
/* start base */
html, body, div, ul, li, h1, h2, h3, h4, h5, h6 {
@@ -21,7 +21,7 @@ html, body, div, ul, li, h1, h2, h3, h4, h5, h6 {
}
body {
- font-family: "Lucida Grande",'Verdana,\5fae\8f6f\96c5\9ed1';
+ font-family: "Lucida Grande",'Verdana','\5fae\8f6f\96c5\9ed1';
font-size: 12px;
background-color: #F9F9F9;
color: #333;
diff --git a/neoease/css/neoease.min.css b/neoease/css/neoease.min.css
index 76cf1a4..39152c1 100644
--- a/neoease/css/neoease.min.css
+++ b/neoease/css/neoease.min.css
@@ -1,7 +1,7 @@
html,body,div,ul,li,h1,h2,h3,h4,h5,h6{margin:0;padding:0;}
::selection{background-color:#ccc;color:#fff;}
::-moz-selection{background-color:#ccc;color:#fff;}
-body{font-family:"Lucida Grande",'Verdana,\5fae\8f6f\96c5\9ed1';font-size:12px;background-color:#F9F9F9;color:#333;}
+body{font-family:"Lucida Grande",'Verdana','\5fae\8f6f\96c5\9ed1';font-size:12px;background-color:#F9F9F9;color:#333;}
a:link{outline:none;color:#21759B;text-decoration:none;}
a:visited{color:#555777;}
a:hover{color:#D54E21;}
diff --git a/neoease/footer.ftl b/neoease/footer.ftl
index 0fdf8b3..c505637 100644
--- a/neoease/footer.ftl
+++ b/neoease/footer.ftl
@@ -10,9 +10,11 @@
Theme by NeoEase
& Vanessa.
+ <#if runtimeEnv=="GAE">
+ #if>
diff --git a/neoease/header.ftl b/neoease/header.ftl
index 823ef8e..8a563e5 100644
--- a/neoease/header.ftl
+++ b/neoease/header.ftl
@@ -1,61 +1,61 @@
-
-
-
-
-
-
-
- ${viewCount1Label}
-
- ${statistic.statisticBlogViewCount}
-
-
- ${articleCount1Label}
-
- ${statistic.statisticPublishedBlogArticleCount}
-
-
- ${commentCount1Label}
-
- ${statistic.statisticPublishedBlogCommentCount}
-
-
-
-
-
-
+
+
+
+
+
+
+
+ ${viewCount1Label}
+
+ ${statistic.statisticBlogViewCount}
+
+
+ ${articleCount1Label}
+
+ ${statistic.statisticPublishedBlogArticleCount}
+
+
+ ${commentCount1Label}
+
+ ${statistic.statisticPublishedBlogCommentCount}
+
+
+
+
+
+
diff --git a/neoease/js/neoease.js b/neoease/js/neoease.js
index fcfc6f4..0fd6384 100644
--- a/neoease/js/neoease.js
+++ b/neoease/js/neoease.js
@@ -1,176 +1,176 @@
-/*
- * Copyright (c) 2009, 2010, 2011, 2012, B3log Team
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @fileoverview neoease js.
- *
- * @author Liyuan Li
- * @version 1.0.0.7, May 11, 2012
- */
-var goTop = function (acceleration) {
- acceleration = acceleration || 0.1;
-
- var y = $(window).scrollTop();
- var speed = 1 + acceleration;
- window.scrollTo(0, Math.floor(y / speed));
-
- if (y > 0) {
- var invokeFunction = "goTop(" + acceleration + ")";
- window.setTimeout(invokeFunction, 16);
- }
-};
-
-var collapseArchive = function (it, year) {
- var tag = true;
- if (it.className === "collapse-ico") {
- it.className = "expand-ico";
- tag = false;
- } else {
- it.className = "collapse-ico";
- }
-
- $("#archiveSide li").each(function () {
- var $this = $(this);
- // hide other year month archives
- if ($this.data("year") === year) {
- if (tag) {
- $(this).show();
- } else {
- $(this).hide();
- }
- }
- });
-};
-
-var getArticle = function (it, id) {
- var $abstract = $("#abstract" + id),
- $content = $("#content" + id);
-
- if ($content.html() === "") {
- $.ajax({
- url: "/get-article-content?id=" + id,
- type: "GET",
- dataType: "html",
- beforeSend: function () {
- $abstract.css("background",
- "url(/skins/neoease/images/ajax-loader.gif) no-repeat scroll center center transparent");
- },
- success: function(result, textStatus){
- it.className = "collapse-ico";
- $content.html(result);
- $abstract.hide().css("background", "none");
- $content.fadeIn("slow");
- }
- });
- } else {
- if (it.className === "expand-ico") {
- $abstract.hide();
- $content.fadeIn();
- it.className = "collapse-ico";
- } else {
- $content.hide();
- $abstract.fadeIn();
- it.className = "expand-ico";
- }
- }
-
- return false;
-};
-
-var goTranslate = function () {
- window.open("http://translate.google.com/translate?sl=auto&tl=auto&u=" + location.href);
-};
-
-(function () {
- // go top icon show or hide
- $(window).scroll(function () {
- var y = $(window).scrollTop();
-
- if (y > 182) {
- var bodyH = $(window).height();
- var top = y + bodyH - 21;
- if ($("body").height() - 58 <= y + bodyH) {
- top = $(".footer").offset().top - 21;
- }
- $("#goTop").fadeIn("slow").css("top", top);
- } else {
- $("#goTop").hide();
- }
- });
-
-
- // archive
- var currentYear = (new Date()).getFullYear(),
- year = currentYear;
- $("#archiveSide li").each(function (i) {
- var $this = $(this);
-
- // hide other year month archives
- if ($this.data("year") !== currentYear) {
- $(this).hide()
- }
-
- // append year archive
- if (year !== $this.data("year")) {
- year = $this.data("year");
- $this.before("" + year + " \u5e74
");
- }
- });
-
- // recent comment mouse click
- $(".recent-comments .expand-ico").click(function () {
- if (this.className === "expand-ico") {
- $(this).parent().next().css({
- "height": "auto",
- "white-space": "normal"
- });
- this.className = "collapse-ico";
- } else {
- $(this).parent().next().animate({
- "height": "18px"
- }, function () {
- $(this).css("white-space", "nowrap");
- });
- this.className = "expand-ico";
- }
- });
-
- // nav current
- $(".nav ul a").each(function () {
- var $this = $(this);
- if ($this.attr("href") === location.pathname) {
- $this.parent().addClass("current");
- } else if (/\/[0-9]+$/.test(location.pathname)) {
- $(".nav ul li")[0].className = "current";
- }
- });
-
- Util.init();
- Util.replaceSideEm($(".recent-comments-content"));
- Util.buildTags("tagsSide");
-
- // recent comments
- $(".recent-comments .recent-comments-main").each(function () {
- if ($(this).find(".recent-comments-content>a").height() < 30) {
- $(this).find(".expand-ico").remove();
- } else {
- $(this).find(".expand-ico").parent().next().css({
- "white-space": "nowrap"
- });
- }
- });
+/*
+ * Copyright (c) 2009, 2010, 2011, 2012, B3log Team
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview neoease js.
+ *
+ * @author Liyuan Li
+ * @version 1.0.0.8, Sep 6, 2012
+ */
+var goTop = function (acceleration) {
+ acceleration = acceleration || 0.1;
+
+ var y = $(window).scrollTop();
+ var speed = 1 + acceleration;
+ window.scrollTo(0, Math.floor(y / speed));
+
+ if (y > 0) {
+ var invokeFunction = "goTop(" + acceleration + ")";
+ window.setTimeout(invokeFunction, 16);
+ }
+};
+
+var collapseArchive = function (it, year) {
+ var tag = true;
+ if (it.className === "collapse-ico") {
+ it.className = "expand-ico";
+ tag = false;
+ } else {
+ it.className = "collapse-ico";
+ }
+
+ $("#archiveSide li").each(function () {
+ var $this = $(this);
+ // hide other year month archives
+ if ($this.data("year") === year) {
+ if (tag) {
+ $(this).show();
+ } else {
+ $(this).hide();
+ }
+ }
+ });
+};
+
+var getArticle = function (it, id) {
+ var $abstract = $("#abstract" + id),
+ $content = $("#content" + id);
+
+ if ($content.html() === "") {
+ $.ajax({
+ url: "/get-article-content?id=" + id,
+ type: "GET",
+ dataType: "html",
+ beforeSend: function () {
+ $abstract.css("background",
+ "url(/skins/neoease/images/ajax-loader.gif) no-repeat scroll center center transparent");
+ },
+ success: function(result, textStatus){
+ it.className = "collapse-ico";
+ $content.html(result);
+ $abstract.hide().css("background", "none");
+ $content.fadeIn("slow");
+ }
+ });
+ } else {
+ if (it.className === "expand-ico") {
+ $abstract.hide();
+ $content.fadeIn();
+ it.className = "collapse-ico";
+ } else {
+ $content.hide();
+ $abstract.fadeIn();
+ it.className = "expand-ico";
+ }
+ }
+
+ return false;
+};
+
+var goTranslate = function () {
+ window.open("http://translate.google.com/translate?sl=auto&tl=auto&u=" + location.href);
+};
+
+(function () {
+ // go top icon show or hide
+ $(window).scroll(function () {
+ var y = $(window).scrollTop();
+
+ if (y > 182) {
+ var bodyH = $(window).height();
+ var top = y + bodyH - 21;
+ if ($("body").height() - 58 <= y + bodyH) {
+ top = $(".footer").offset().top - 21;
+ }
+ $("#goTop").fadeIn("slow").css("top", top);
+ } else {
+ $("#goTop").hide();
+ }
+ });
+
+
+ // archive
+ var currentYear = (new Date()).getFullYear(),
+ year = currentYear;
+ $("#archiveSide li").each(function (i) {
+ var $this = $(this);
+
+ // hide other year month archives
+ if ($this.data("year") !== currentYear) {
+ $(this).hide()
+ }
+
+ // append year archive
+ if (year !== $this.data("year")) {
+ year = $this.data("year");
+ $this.before("" + year + " \u5e74
");
+ }
+ });
+
+ // recent comment mouse click
+ $(".recent-comments .expand-ico").click(function () {
+ if (this.className === "expand-ico") {
+ $(this).parent().next().css({
+ "height": "auto",
+ "white-space": "normal"
+ });
+ this.className = "collapse-ico";
+ } else {
+ $(this).parent().next().animate({
+ "height": "18px"
+ }, function () {
+ $(this).css("white-space", "nowrap");
+ });
+ this.className = "expand-ico";
+ }
+ });
+
+ // nav current
+ $(".nav ul li").each(function () {
+ var $a = $(this).find("a");
+ if ($a.attr("href") === latkeConfig.servePath + location.pathname) {
+ $(this).addClass("current");
+ } else if (/\/[0-9]+$/.test(location.pathname)) {
+ $(".nav ul li")[0].className = "current";
+ }
+ });
+
+ Util.init();
+ Util.replaceSideEm($(".recent-comments-content"));
+ Util.buildTags("tagsSide");
+
+ // recent comments
+ $(".recent-comments .recent-comments-main").each(function () {
+ if ($(this).find(".recent-comments-content>a").height() < 30) {
+ $(this).find(".expand-ico").remove();
+ } else {
+ $(this).find(".expand-ico").parent().next().css({
+ "white-space": "nowrap"
+ });
+ }
+ });
})();
\ No newline at end of file
diff --git a/neoease/js/neoease.min.js b/neoease/js/neoease.min.js
index 7ade48d..a2252f5 100644
--- a/neoease/js/neoease.min.js
+++ b/neoease/js/neoease.min.js
@@ -16,5 +16,5 @@
* @fileoverview neoease js.
*
* @author Liyuan Li
- * @version 1.0.0.7, May 11, 2012
- */var goTop=function(e){e=e||.1;var t=$(window).scrollTop(),n=1+e;window.scrollTo(0,Math.floor(t/n));if(t>0){var r="goTop("+e+")";window.setTimeout(r,16)}},collapseArchive=function(e,t){var n=!0;e.className==="collapse-ico"?(e.className="expand-ico",n=!1):e.className="collapse-ico",$("#archiveSide li").each(function(){var e=$(this);e.data("year")===t&&(n?$(this).show():$(this).hide())})},getArticle=function(e,t){var n=$("#abstract"+t),r=$("#content"+t);return r.html()===""?$.ajax({url:"/get-article-content?id="+t,type:"GET",dataType:"html",beforeSend:function(){n.css("background","url(/skins/neoease/images/ajax-loader.gif) no-repeat scroll center center transparent")},success:function(t,i){e.className="collapse-ico",r.html(t),n.hide().css("background","none"),r.fadeIn("slow")}}):e.className==="expand-ico"?(n.hide(),r.fadeIn(),e.className="collapse-ico"):(r.hide(),n.fadeIn(),e.className="expand-ico"),!1},goTranslate=function(){window.open("http://translate.google.com/translate?sl=auto&tl=auto&u="+location.href)};(function(){$(window).scroll(function(){var e=$(window).scrollTop();if(e>182){var t=$(window).height(),n=e+t-21;$("body").height()-58<=e+t&&(n=$(".footer").offset().top-21),$("#goTop").fadeIn("slow").css("top",n)}else $("#goTop").hide()});var e=(new Date).getFullYear(),t=e;$("#archiveSide li").each(function(n){var r=$(this);r.data("year")!==e&&$(this).hide(),t!==r.data("year")&&(t=r.data("year"),r.before(""+t+" 年
"))}),$(".recent-comments .expand-ico").click(function(){this.className==="expand-ico"?($(this).parent().next().css({height:"auto","white-space":"normal"}),this.className="collapse-ico"):($(this).parent().next().animate({height:"18px"},function(){$(this).css("white-space","nowrap")}),this.className="expand-ico")}),$(".nav ul a").each(function(){var e=$(this);e.attr("href")===location.pathname?e.parent().addClass("current"):/\/[0-9]+$/.test(location.pathname)&&($(".nav ul li")[0].className="current")}),Util.init(),Util.replaceSideEm($(".recent-comments-content")),Util.buildTags("tagsSide"),$(".recent-comments .recent-comments-main").each(function(){$(this).find(".recent-comments-content>a").height()<30?$(this).find(".expand-ico").remove():$(this).find(".expand-ico").parent().next().css({"white-space":"nowrap"})})})();
\ No newline at end of file
+ * @version 1.0.0.8, Sep 6, 2012
+ */var goTop=function(e){e=e||.1;var t=$(window).scrollTop(),n=1+e;window.scrollTo(0,Math.floor(t/n));if(t>0){var r="goTop("+e+")";window.setTimeout(r,16)}},collapseArchive=function(e,t){var n=!0;e.className==="collapse-ico"?(e.className="expand-ico",n=!1):e.className="collapse-ico",$("#archiveSide li").each(function(){var e=$(this);e.data("year")===t&&(n?$(this).show():$(this).hide())})},getArticle=function(e,t){var n=$("#abstract"+t),r=$("#content"+t);return r.html()===""?$.ajax({url:"/get-article-content?id="+t,type:"GET",dataType:"html",beforeSend:function(){n.css("background","url(/skins/neoease/images/ajax-loader.gif) no-repeat scroll center center transparent")},success:function(t,i){e.className="collapse-ico",r.html(t),n.hide().css("background","none"),r.fadeIn("slow")}}):e.className==="expand-ico"?(n.hide(),r.fadeIn(),e.className="collapse-ico"):(r.hide(),n.fadeIn(),e.className="expand-ico"),!1},goTranslate=function(){window.open("http://translate.google.com/translate?sl=auto&tl=auto&u="+location.href)};(function(){$(window).scroll(function(){var e=$(window).scrollTop();if(e>182){var t=$(window).height(),n=e+t-21;$("body").height()-58<=e+t&&(n=$(".footer").offset().top-21),$("#goTop").fadeIn("slow").css("top",n)}else $("#goTop").hide()});var e=(new Date).getFullYear(),t=e;$("#archiveSide li").each(function(n){var r=$(this);r.data("year")!==e&&$(this).hide(),t!==r.data("year")&&(t=r.data("year"),r.before(""+t+" 年
"))}),$(".recent-comments .expand-ico").click(function(){this.className==="expand-ico"?($(this).parent().next().css({height:"auto","white-space":"normal"}),this.className="collapse-ico"):($(this).parent().next().animate({height:"18px"},function(){$(this).css("white-space","nowrap")}),this.className="expand-ico")}),$(".nav ul li").each(function(){var e=$(this).find("a");e.attr("href")===latkeConfig.servePath+location.pathname?$(this).addClass("current"):/\/[0-9]+$/.test(location.pathname)&&($(".nav ul li")[0].className="current")}),Util.init(),Util.replaceSideEm($(".recent-comments-content")),Util.buildTags("tagsSide"),$(".recent-comments .recent-comments-main").each(function(){$(this).find(".recent-comments-content>a").height()<30?$(this).find(".expand-ico").remove():$(this).find(".expand-ico").parent().next().css({"white-space":"nowrap"})})})();
\ No newline at end of file