Commit 6b8e5673 authored by Liang Ding's avatar Liang Ding

--no commit message

--no commit message
parent 22eef669
/* /*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team * Copyright (c) 2009, 2010, 2011, 2012, B3log Team
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
/** /**
* @fileoverview Page util, load heighlight and process comment. * @fileoverview Page util, load heighlight and process comment.
* *
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a> * @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.3.1, Jul 5, 2012 * @version 1.0.3.1, Jul 5, 2012
*/ */
var Page = function (tips) { var Page = function (tips) {
this.currentCommentId = ""; this.currentCommentId = "";
this.tips = tips; this.tips = tips;
}; };
$.extend(Page.prototype, { $.extend(Page.prototype, {
/* /*
* @description 评论时点击表情,在评论内容中插入相关代码 * @description 评论时点击表情,在评论内容中插入相关代码
* @param {String} name 用于区别回复评论还是对文章的评论 * @param {String} name 用于区别回复评论还是对文章的评论
*/ */
insertEmotions: function (name) { insertEmotions: function (name) {
var _it = this; var _it = this;
if (name === undefined) { if (name === undefined) {
name = ""; name = "";
} }
$("#emotions" + name + " span").click(function () { $("#emotions" + name + " span").click(function () {
var $comment = $("#comment" + name); var $comment = $("#comment" + name);
var endPosition = _it._getCursorEndPosition($comment[0]); var endPosition = _it._getCursorEndPosition($comment[0]);
var key = "[" + this.className + "]", var key = "[" + this.className + "]",
textValue = $comment[0].value; textValue = $comment[0].value;
textValue = textValue.substring(0, endPosition) + key + textValue.substring(endPosition, textValue.length); textValue = textValue.substring(0, endPosition) + key + textValue.substring(endPosition, textValue.length);
$("#comment" + name).val(textValue); $("#comment" + name).val(textValue);
if ($.browser.msie) { if ($.browser.msie) {
endPosition -= textValue.split('\n').length - 1; endPosition -= textValue.split('\n').length - 1;
var oR = $comment[0].createTextRange(); var oR = $comment[0].createTextRange();
oR.collapse(true); oR.collapse(true);
oR.moveStart('character', endPosition + 6); oR.moveStart('character', endPosition + 6);
oR.select(); oR.select();
} else { } else {
$comment[0].setSelectionRange(endPosition + 6, endPosition + 6); $comment[0].setSelectionRange(endPosition + 6, endPosition + 6);
} }
}); });
}, },
/** /**
* @description 获取当前光标最后位置 * @description 获取当前光标最后位置
* @param {Dom} textarea 评论框对象 * @param {Dom} textarea 评论框对象
* @returns {Num} 光标位置 * @returns {Num} 光标位置
*/ */
_getCursorEndPosition: function (textarea) { _getCursorEndPosition: function (textarea) {
textarea.focus(); textarea.focus();
if (textarea.setSelectionRange) { // W3C if (textarea.setSelectionRange) { // W3C
return textarea.selectionEnd; return textarea.selectionEnd;
} else if (document.selection) { // IE } else if (document.selection) { // IE
var i = 0, var i = 0,
oS = document.selection.createRange(), oS = document.selection.createRange(),
oR = document.body.createTextRange(); oR = document.body.createTextRange();
oR.moveToElementText(textarea); oR.moveToElementText(textarea);
oS.getBookmark(); oS.getBookmark();
for (i = 0; oR.compareEndPoints('StartToStart', oS) < 0 && oS.moveStart("character", -1) !== 0; i ++) { for (i = 0; oR.compareEndPoints('StartToStart', oS) < 0 && oS.moveStart("character", -1) !== 0; i ++) {
if (textarea.value.charAt(i) == '\n') { if (textarea.value.charAt(i) == '\n') {
i ++; i ++;
} }
} }
return i; return i;
} }
}, },
/* /*
* @description 评论校验 * @description 评论校验
* @param {String} state 用于区别回复评论还是对文章的评论 * @param {String} state 用于区别回复评论还是对文章的评论
*/ */
validateComment: function (state) { validateComment: function (state) {
var commentName = $("#commentName" + state).val().replace(/(^\s*)|(\s*$)/g, ""), var commentName = $("#commentName" + state).val().replace(/(^\s*)|(\s*$)/g, ""),
commenterContent = $("#comment" + state).val().replace(/(^\s*)|(\s*$)/g, ""); commenterContent = $("#comment" + state).val().replace(/(^\s*)|(\s*$)/g, "");
if (2 > commentName.length || commentName.length > 20) { if (2 > commentName.length || commentName.length > 20) {
$("#commentErrorTip" + state).html(this.tips.nameTooLongLabel); $("#commentErrorTip" + state).html(this.tips.nameTooLongLabel);
$("#commentName" + state).focus(); $("#commentName" + state).focus();
} else if ($("#commentEmail" + state).val().replace(/\s/g, "") === "") { } else if ($("#commentEmail" + state).val().replace(/\s/g, "") === "") {
$("#commentErrorTip" + state).html(this.tips.mailCannotEmptyLabel); $("#commentErrorTip" + state).html(this.tips.mailCannotEmptyLabel);
$("#commentEmail" + state).focus(); $("#commentEmail" + state).focus();
} else if(!/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test($("#commentEmail" + state).val())) { } else if(!/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test($("#commentEmail" + state).val())) {
$("#commentErrorTip" + state).html(this.tips.mailInvalidLabel); $("#commentErrorTip" + state).html(this.tips.mailInvalidLabel);
$("#commentEmail" + state).focus(); $("#commentEmail" + state).focus();
} else if (2 > commenterContent.length || commenterContent.length > 500) { } else if (2 > commenterContent.length || commenterContent.length > 500) {
$("#commentErrorTip" + state).html(this.tips.commentContentCannotEmptyLabel); $("#commentErrorTip" + state).html(this.tips.commentContentCannotEmptyLabel);
$("#comment" + state).focus(); $("#comment" + state).focus();
} else if ($("#commentValidate" + state).val().replace(/\s/g, "") === "") { } else if ($("#commentValidate" + state).val().replace(/\s/g, "") === "") {
$("#commentErrorTip" + state).html(this.tips.captchaCannotEmptyLabel); $("#commentErrorTip" + state).html(this.tips.captchaCannotEmptyLabel);
$("#commentValidate" + state).focus(); $("#commentValidate" + state).focus();
} else { } else {
return true; return true;
} }
$("#commentErrorTip" + state).show(); $("#commentErrorTip" + state).show();
return false; return false;
}, },
/* /*
* @description 把评论中的标识替换为图片 * @description 把评论中的标识替换为图片
* @param {Dom} selector * @param {Dom} selector
*/ */
replaceCommentsEm: function (selector) { replaceCommentsEm: function (selector) {
var $commentContents = $(selector); var $commentContents = $(selector);
for (var i = 0; i < $commentContents.length; i++) { for (var i = 0; i < $commentContents.length; i++) {
var str = $commentContents[i].innerHTML; var str = $commentContents[i].innerHTML;
$commentContents[i].innerHTML = Util.replaceEmString(str); $commentContents[i].innerHTML = Util.replaceEmString(str);
} }
}, },
/* /*
* @description 初始化 SyantaxHighlighter * @description 初始化 SyantaxHighlighter
* @param {Array} languages 需要加载的语言 * @param {Array} languages 需要加载的语言
*/ */
_initSyntaxHighlighter: function (languages) { _initSyntaxHighlighter: function (languages) {
// load brush js // load brush js
for (var i = 0; i < languages.length; i++) { for (var i = 0; i < languages.length; i++) {
switch (languages[i]) { switch (languages[i]) {
case "groovy": case "groovy":
languages[i] = 'groovy ' + languages[i] = 'groovy ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushGroovy.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushGroovy.js';
break; break;
case "java": case "java":
languages[i] = 'java ' + languages[i] = 'java ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushJava.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushJava.js';
break; break;
case "php": case "php":
languages[i] = 'php ' + languages[i] = 'php ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushPhp.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushPhp.js';
break; break;
case "scala": case "scala":
languages[i] = 'scala ' + languages[i] = 'scala ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushScala.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushScala.js';
break; break;
case "sql": case "sql":
languages[i] = 'sql ' + languages[i] = 'sql ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushSql.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushSql.js';
break; break;
case "applescript": case "applescript":
languages[i] = 'applescript ' + languages[i] = 'applescript ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushAppleScript.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushAppleScript.js';
break; break;
case "as3": case "as3":
case "actionscript3": case "actionscript3":
languages[i] = 'actionscript3 as3 ' + languages[i] = 'actionscript3 as3 ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushAS3.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushAS3.js';
break; break;
case "bash": case "bash":
case "shell": case "shell":
languages[i] = 'bash shell ' + languages[i] = 'bash shell ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushBash.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushBash.js';
break; break;
case "coldfusion": case "coldfusion":
case "cf": case "cf":
languages[i] = 'coldfusion cf ' + languages[i] = 'coldfusion cf ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushColdFusion.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushColdFusion.js';
break; break;
case "c#": case "c#":
case "c-sharp": case "c-sharp":
case "csharp": case "csharp":
languages[i] = 'c# c-sharp csharp ' + languages[i] = 'c# c-sharp csharp ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushCSharp.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushCSharp.js';
break; break;
case "cpp": case "cpp":
case "c": case "c":
languages[i] = 'cpp c ' + languages[i] = 'cpp c ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushCpp.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushCpp.js';
break; break;
case "css": case "css":
languages[i] = 'css ' + languages[i] = 'css ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushCss.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushCss.js';
break; break;
case "delphi": case "delphi":
case "pascal": case "pascal":
languages[i] = 'delphi pascal ' + languages[i] = 'delphi pascal ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushDelphi.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushDelphi.js';
break; break;
case "diff": case "diff":
case "patch": case "patch":
case "pas": case "pas":
languages[i] = 'diff patch pas ' + languages[i] = 'diff patch pas ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushDiff.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushDiff.js';
break; break;
case "erl": case "erl":
case "erlang": case "erlang":
languages[i] = 'erl erlang ' + languages[i] = 'erl erlang ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushErlang.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushErlang.js';
break; break;
case "js": case "js":
case "jscript": case "jscript":
case "javascript": case "javascript":
languages[i] = 'js jscript javascript ' + languages[i] = 'js jscript javascript ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushJScript.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushJScript.js';
break; break;
case "jfx": case "jfx":
case "javafx": case "javafx":
languages[i] = 'jfx javafx ' + languages[i] = 'jfx javafx ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushJavaFX.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushJavaFX.js';
break; break;
case "perl": case "perl":
case "pl": case "pl":
languages[i] = 'perl pl ' + languages[i] = 'perl pl ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushPerl.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushPerl.js';
break; break;
case "plain": case "plain":
case "text": case "text":
languages[i] = 'text plain ' + languages[i] = 'text plain ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushPlain.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushPlain.js';
break; break;
case "ps": case "ps":
case "powershell": case "powershell":
languages[i] = 'ps powershell ' + languages[i] = 'ps powershell ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushPowerShell.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushPowerShell.js';
break; break;
case "py": case "py":
case "python": case "python":
languages[i] = 'py python ' + languages[i] = 'py python ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushPython.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushPython.js';
break; break;
case "rails": case "rails":
case "ror": case "ror":
case "ruby": case "ruby":
case "rb": case "rb":
languages[i] = 'ruby rails ror rb ' + languages[i] = 'ruby rails ror rb ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushRuby.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushRuby.js';
break; break;
case "sass": case "sass":
case "scss": case "scss":
languages[i] = 'sass scss ' + languages[i] = 'sass scss ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushSass.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushSass.js';
break; break;
case "vb": case "vb":
case "vbnet": case "vbnet":
languages[i] = 'vb vbnet ' + languages[i] = 'vb vbnet ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushVb.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushVb.js';
break; break;
case "xml": case "xml":
case "xhtml": case "xhtml":
case "xslt": case "xslt":
case "html": case "html":
languages[i] = 'xml xhtml xslt html ' + languages[i] = 'xml xhtml xslt html ' +
latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushXml.js'; latkeConfig.staticServePath + '/js/lib/SyntaxHighlighter/scripts/shBrushXml.js';
break; break;
default: default:
break; break;
} }
} }
// code high lighter // code high lighter
SyntaxHighlighter.autoloader.apply(null, languages); SyntaxHighlighter.autoloader.apply(null, languages);
SyntaxHighlighter.config.stripBrs = true; SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.all(); SyntaxHighlighter.all();
}, },
/* /*
* @description 加载 SyntaxHighlighter * @description 加载 SyntaxHighlighter
* @param {String} SHTheme SyntaxHighLighter 样式 * @param {String} SHTheme SyntaxHighLighter 样式
*/ */
_loadSyntaxHighlighter: function (SHTheme) { _loadSyntaxHighlighter: function (SHTheme) {
var cssName = SHTheme ? SHTheme : "shCoreEclipse", var cssName = SHTheme ? SHTheme : "shCoreEclipse",
that = this; that = this;
// load css // load css
if (document.createStyleSheet) { if (document.createStyleSheet) {
document.createStyleSheet(latkeConfig.staticServePath + "/js/lib/SyntaxHighlighter/styles/" + cssName + ".css"); document.createStyleSheet(latkeConfig.staticServePath + "/js/lib/SyntaxHighlighter/styles/" + cssName + ".css");
} else { } else {
$("head").append($("<link rel='stylesheet' href='" + latkeConfig.staticServePath + "/js/lib/SyntaxHighlighter/styles/" $("head").append($("<link rel='stylesheet' href='" + latkeConfig.staticServePath + "/js/lib/SyntaxHighlighter/styles/"
+ cssName + ".css' type='text/css' charset='utf-8' />")); + cssName + ".css' type='text/css' charset='utf-8' />"));
} }
// load js // load js
$.ajax({ $.ajax({
url: latkeConfig.staticServePath + "/js/lib/SyntaxHighlighter/scripts/shCore.js", url: latkeConfig.staticServePath + "/js/lib/SyntaxHighlighter/scripts/shCore.js",
dataType: "script", dataType: "script",
cache: true, cache: true,
success: function() { success: function() {
// get brush settings // get brush settings
var languages = [], var languages = [],
isScrip = false; isScrip = false;
$(".article-body pre").each(function () { $(".article-body pre").each(function () {
var name = this.className.split(";")[0]; var name = this.className.split(";")[0];
var language = name.substr(7, name.length - 1); var language = name.substr(7, name.length - 1);
if (this.className.indexOf("html-script: true") > -1 && if (this.className.indexOf("html-script: true") > -1 &&
(language !== "xml" && language !== "xhtml" && (language !== "xml" && language !== "xhtml" &&
language !== "xslt" && language != "html")) { language !== "xslt" && language != "html")) {
isScrip = true; isScrip = true;
} }
languages.push(language); languages.push(language);
}); });
// when html-script is true, need shBrushXml.js // when html-script is true, need shBrushXml.js
if (isScrip) { if (isScrip) {
$.ajax({ $.ajax({
url: latkeConfig.staticServePath + "/js/lib/SyntaxHighlighter/scripts/shBrushXml.js", url: latkeConfig.staticServePath + "/js/lib/SyntaxHighlighter/scripts/shBrushXml.js",
dataType: "script", dataType: "script",
cache: true, cache: true,
success: function() { success: function() {
that._initSyntaxHighlighter(languages); that._initSyntaxHighlighter(languages);
} }
}); });
} else { } else {
that._initSyntaxHighlighter(languages); that._initSyntaxHighlighter(languages);
} }
} }
}); });
}, },
/* /*
* @description 解析语法高亮 * @description 解析语法高亮
* @param {Obj} obj 语法高亮配置参数 * @param {Obj} obj 语法高亮配置参数
* @param {Obj} obj.SHTheme 语法高亮 SyntaxHighLighter 样式 * @param {Obj} obj.SHTheme 语法高亮 SyntaxHighLighter 样式
*/ */
parseLanguage: function (obj) { parseLanguage: function (obj) {
var isPrettify = false, var isPrettify = false,
isSH = false; isSH = false;
$(".article-body pre").each(function () { $(".article-body pre").each(function () {
if (this.className.indexOf("brush") > -1) { if (this.className.indexOf("brush") > -1) {
isSH = true; isSH = true;
} }
if (this.className.indexOf("prettyprint") > -1) { if (this.className.indexOf("prettyprint") > -1) {
isPrettify = true; isPrettify = true;
} }
}); });
if (isSH) { if (isSH) {
this._loadSyntaxHighlighter(obj ? (obj.SHTheme ? obj.SHTheme : undefined) : undefined); this._loadSyntaxHighlighter(obj ? (obj.SHTheme ? obj.SHTheme : undefined) : undefined);
} }
if (isPrettify) { if (isPrettify) {
// load css // load css
if (document.createStyleSheet) { if (document.createStyleSheet) {
document.createStyleSheet(latkeConfig.staticServePath + "/js/lib/google-code-prettify/prettify.css"); document.createStyleSheet(latkeConfig.staticServePath + "/js/lib/google-code-prettify/prettify.css");
} else { } else {
$("head").append($("<link rel='stylesheet' href='" + latkeConfig.staticServePath + "/js/lib/google-code-prettify/prettify.css'>")); $("head").append($("<link rel='stylesheet' href='" + latkeConfig.staticServePath + "/js/lib/google-code-prettify/prettify.css'>"));
} }
// load js // load js
document.write("<script src=\"" + latkeConfig.staticServePath + "/js/lib/google-code-prettify/prettify.js\"><\/script>"); document.write("<script src=\"" + latkeConfig.staticServePath + "/js/lib/google-code-prettify/prettify.js\"><\/script>");
// load function // load function
$(document).ready(function () { $(document).ready(function () {
prettyPrint(); prettyPrint();
}); });
} }
}, },
/* /*
* @description 文章/自定义页面加载 * @description 文章/自定义页面加载
* @param {Obj} obj 配置设定 * @param {Obj} obj 配置设定
* @param {Obj} obj.language 代码高亮配置 * @param {Obj} obj.language 代码高亮配置
*/ */
load: function (obj) { load: function (obj) {
var that = this; var that = this;
// emotions // emotions
that.insertEmotions(); that.insertEmotions();
// language // language
that.parseLanguage(obj ? (obj.language ? obj.language : undefined) : undefined); that.parseLanguage(obj ? (obj.language ? obj.language : undefined) : undefined);
// submit comment // submit comment
$("#commentValidate").keypress(function (event) { $("#commentValidate").keypress(function (event) {
if (event.keyCode === 13) { if (event.keyCode === 13) {
that.submitComment(); that.submitComment();
} }
}); });
// captcha // captcha
$("#captcha").click(function () { $("#captcha").click(function () {
$(this).attr("src", latkeConfig.servePath + "/captcha.do?code=" + Math.random()); $(this).attr("src", latkeConfig.servePath + "/captcha.do?code=" + Math.random());
}); });
// cookie // cookie
var $top = $("#top #admin"); var $top = $("#top #admin");
if ($top.length === 1) { if ($top.length === 1) {
if ($top.find("a").length > 2) { if ($top.find("a").length > 2) {
if (Cookie.readCookie("commentName") === "") { if (Cookie.readCookie("commentName") === "") {
Cookie.createCookie("commentName", $top.find("span").text(), 365); Cookie.createCookie("commentName", $top.find("span").text(), 365);
} }
if (Cookie.readCookie("commentURL") === "") { if (Cookie.readCookie("commentURL") === "") {
Cookie.createCookie("commentURL", window.location.host, 365); Cookie.createCookie("commentURL", window.location.host, 365);
} }
} }
} }
$("#commentEmail").val(Cookie.readCookie("commentEmail")); $("#commentEmail").val(Cookie.readCookie("commentEmail"));
$("#commentURL").val(Cookie.readCookie("commentURL")); $("#commentURL").val(Cookie.readCookie("commentURL"));
$("#commentName").val(Cookie.readCookie("commentName")); $("#commentName").val(Cookie.readCookie("commentName"));
}, },
/* /*
* @description 加载随机文章 * @description 加载随机文章
* @param {String} headTitle 随机文章标题 * @param {String} headTitle 随机文章标题
*/ */
loadRandomArticles: function (headTitle) { loadRandomArticles: function (headTitle) {
var randomArticles1Label = this.tips.randomArticles1Label; var randomArticles1Label = this.tips.randomArticles1Label;
// getRandomArticles // getRandomArticles
$.ajax({ $.ajax({
url: latkeConfig.staticServePath + "/get-random-articles.do", url: latkeConfig.staticServePath + "/get-random-articles.do",
type: "POST", type: "POST",
success: function(result, textStatus){ success: function(result, textStatus){
var randomArticles = result.randomArticles; var randomArticles = result.randomArticles;
if (!randomArticles || 0 === randomArticles.length) { if (!randomArticles || 0 === randomArticles.length) {
$("#randomArticles").remove(); $("#randomArticles").remove();
return; return;
} }
var listHtml = ""; var listHtml = "";
for (var i = 0; i < randomArticles.length; i++) { for (var i = 0; i < randomArticles.length; i++) {
var article = randomArticles[i]; var article = randomArticles[i];
var title = article.articleTitle; var title = article.articleTitle;
var randomArticleLiHtml = "<li>" + "<a rel='nofollow' title='" + title + "' href='" + var randomArticleLiHtml = "<li>" + "<a rel='nofollow' title='" + title + "' href='" +
article.articlePermalink +"'>" + title + "</a></li>"; article.articlePermalink +"'>" + title + "</a></li>";
listHtml += randomArticleLiHtml; listHtml += randomArticleLiHtml;
} }
var titleHTML = headTitle ? headTitle : "<h4>" + randomArticles1Label + "</h4>"; var titleHTML = headTitle ? headTitle : "<h4>" + randomArticles1Label + "</h4>";
var randomArticleListHtml = titleHTML + "<ul class='marginLeft12'>" + listHtml + "</ul>"; var randomArticleListHtml = titleHTML + "<ul class='marginLeft12'>" + listHtml + "</ul>";
$("#randomArticles").append(randomArticleListHtml); $("#randomArticles").append(randomArticleListHtml);
} }
}); });
}, },
/* /*
* @description 加载相关文章 * @description 加载相关文章
* @param {String} id 文章 id * @param {String} id 文章 id
* @param {String} headTitle 相关文章标题 * @param {String} headTitle 相关文章标题
*/ */
loadRelevantArticles: function (id, headTitle) { loadRelevantArticles: function (id, headTitle) {
$.ajax({ $.ajax({
url: latkeConfig.staticServePath + "/article/id/" + id + "/relevant/articles", url: latkeConfig.staticServePath + "/article/id/" + id + "/relevant/articles",
type: "GET", type: "GET",
success: function(data, textStatus){ success: function(data, textStatus){
var articles = data.relevantArticles; var articles = data.relevantArticles;
if (!articles || 0 === articles.length) { if (!articles || 0 === articles.length) {
$("#relevantArticles").remove(); $("#relevantArticles").remove();
return; return;
} }
var listHtml = ""; var listHtml = "";
for (var i = 0; i < articles.length; i++) { for (var i = 0; i < articles.length; i++) {
var article = articles[i]; var article = articles[i];
var title = article.articleTitle; var title = article.articleTitle;
var articleLiHtml = "<li>" var articleLiHtml = "<li>"
+ "<a rel='nofollow' title='" + title + "' href='" + article.articlePermalink + "'>" + "<a rel='nofollow' title='" + title + "' href='" + article.articlePermalink + "'>"
+ title + "</a></li>" + title + "</a></li>"
listHtml += articleLiHtml listHtml += articleLiHtml
} }
var relevantArticleListHtml = headTitle var relevantArticleListHtml = headTitle
+ "<ul class='marginLeft12'>" + "<ul class='marginLeft12'>"
+ listHtml + "</ul>"; + listHtml + "</ul>";
$("#relevantArticles").append(relevantArticleListHtml); $("#relevantArticles").append(relevantArticleListHtml);
}, },
error: function () { error: function () {
$("#relevantArticles").remove(); $("#relevantArticles").remove();
} }
}); });
}, },
/* /*
* @description 加载站外相关文章 * @description 加载站外相关文章
* @param {String} tags 文章 tags * @param {String} tags 文章 tags
* @param {String} headTitle 站外相关文章标题 * @param {String} headTitle 站外相关文章标题
*/ */
loadExternalRelevantArticles: function (tags, headTitle) { loadExternalRelevantArticles: function (tags, headTitle) {
var tips = this.tips; var tips = this.tips;
try { try {
$.ajax({ $.ajax({
url: "http://rhythm.b3log.org:80/get-articles-by-tags.do?tags=" + tags url: "http://rhythm.b3log.org:80/get-articles-by-tags.do?tags=" + tags
+ "&blogHost=" + tips.blogHost + "&paginationPageSize=" + tips.externalRelevantArticlesDisplayCount, + "&blogHost=" + tips.blogHost + "&paginationPageSize=" + tips.externalRelevantArticlesDisplayCount,
type: "GET", type: "GET",
cache: true, cache: true,
dataType:"jsonp", dataType:"jsonp",
error: function(){ error: function(){
$("#externalRelevantArticles").remove(); $("#externalRelevantArticles").remove();
}, },
success: function(data, textStatus){ success: function(data, textStatus){
var articles = data.articles; var articles = data.articles;
if (!articles || 0 === articles.length) { if (!articles || 0 === articles.length) {
$("#externalRelevantArticles").remove(); $("#externalRelevantArticles").remove();
return; return;
} }
var listHtml = ""; var listHtml = "";
for (var i = 0; i < articles.length; i++) { for (var i = 0; i < articles.length; i++) {
var article = articles[i]; var article = articles[i];
var title = article.articleTitle; var title = article.articleTitle;
var articleLiHtml = "<li>" var articleLiHtml = "<li>"
+ "<a rel='nofollow' title='" + title + "' target='_blank' href='" + article.articlePermalink + "'>" + "<a rel='nofollow' title='" + title + "' target='_blank' href='" + article.articlePermalink + "'>"
+ title + "</a></li>" + title + "</a></li>"
listHtml += articleLiHtml listHtml += articleLiHtml
} }
var titleHTML = headTitle ? headTitle : "<h4>" + tips.externalRelevantArticles1Label + "</h4>"; var titleHTML = headTitle ? headTitle : "<h4>" + tips.externalRelevantArticles1Label + "</h4>";
var randomArticleListHtml = titleHTML var randomArticleListHtml = titleHTML
+ "<ul class='marginLeft12'>" + "<ul class='marginLeft12'>"
+ listHtml + "</ul>"; + listHtml + "</ul>";
$("#externalRelevantArticles").append(randomArticleListHtml); $("#externalRelevantArticles").append(randomArticleListHtml);
} }
}); });
} catch (e) { } catch (e) {
// 忽略相关文章加载异常:load script error // 忽略相关文章加载异常:load script error
} }
}, },
/* /*
* @description 提交评论 * @description 提交评论
* @param {String} commentId 回复评论时的评论 id * @param {String} commentId 回复评论时的评论 id
* @param {String} state 区分回复文章还是回复评论的标识 * @param {String} state 区分回复文章还是回复评论的标识
*/ */
submitComment: function (commentId, state) { submitComment: function (commentId, state) {
if (!state) { if (!state) {
state = ''; state = '';
} }
var that = this, var that = this,
tips = this.tips, tips = this.tips,
type = "article"; type = "article";
if (tips.externalRelevantArticlesDisplayCount === undefined) { if (tips.externalRelevantArticlesDisplayCount === undefined) {
type = "page"; type = "page";
} }
if (this.validateComment(state)) { if (this.validateComment(state)) {
$("#submitCommentButton" + state).attr("disabled", "disabled"); $("#submitCommentButton" + state).attr("disabled", "disabled");
$("#commentErrorTip" + state).show().html(this.tips.loadingLabel); $("#commentErrorTip" + state).show().html(this.tips.loadingLabel);
var requestJSONObject = { var requestJSONObject = {
"oId": tips.oId, "oId": tips.oId,
"commentContent": $("#comment" + state).val().replace(/(^\s*)|(\s*$)/g, ""), "commentContent": $("#comment" + state).val().replace(/(^\s*)|(\s*$)/g, ""),
"commentEmail": $("#commentEmail" + state).val(), "commentEmail": $("#commentEmail" + state).val(),
"commentURL": Util.proessURL($("#commentURL" + state).val().replace(/(^\s*)|(\s*$)/g, "")), "commentURL": Util.proessURL($("#commentURL" + state).val().replace(/(^\s*)|(\s*$)/g, "")),
"commentName": $("#commentName" + state).val().replace(/(^\s*)|(\s*$)/g, ""), "commentName": $("#commentName" + state).val().replace(/(^\s*)|(\s*$)/g, ""),
"captcha": $("#commentValidate" + state).val() "captcha": $("#commentValidate" + state).val()
}; };
if (state === "Reply") { if (state === "Reply") {
requestJSONObject.commentOriginalCommentId = commentId; requestJSONObject.commentOriginalCommentId = commentId;
} }
$.ajax({ $.ajax({
type: "POST", type: "POST",
url: latkeConfig.servePath + "/add-" + type + "-comment.do", url: latkeConfig.servePath + "/add-" + type + "-comment.do",
cache: false, cache: false,
contentType: "application/json", contentType: "application/json",
data: JSON.stringify(requestJSONObject), data: JSON.stringify(requestJSONObject),
success: function(result){ success: function(result){
if (!result.sc) { if (!result.sc) {
$("#commentErrorTip" + state).html(result.msg); $("#commentErrorTip" + state).html(result.msg);
$("#commentValidate" + state).val("").focus(); $("#commentValidate" + state).val("").focus();
$("#submitCommentButton" + state).removeAttr("disabled"); $("#submitCommentButton" + state).removeAttr("disabled");
$("#captcha" + state).attr("src", latkeConfig.servePath + "/captcha.do?code=" + Math.random()); $("#captcha" + state).attr("src", latkeConfig.servePath + "/captcha.do?code=" + Math.random());
return; return;
} }
result.replyNameHTML = ""; result.replyNameHTML = "";
if ($("#commentURL" + state).val().replace(/\s/g, "") === "") { if ($("#commentURL" + state).val().replace(/\s/g, "") === "") {
result.replyNameHTML = '<a>' + $("#commentName" + state).val() + '</a>'; result.replyNameHTML = '<a>' + $("#commentName" + state).val() + '</a>';
} else { } else {
result.replyNameHTML = '<a href="' + Util.proessURL($("#commentURL" + state).val()) + result.replyNameHTML = '<a href="' + Util.proessURL($("#commentURL" + state).val()) +
'" target="_blank">' + $("#commentName" + state).val() + '</a>'; '" target="_blank">' + $("#commentName" + state).val() + '</a>';
} }
that.addCommentAjax(addComment(result, state), state); that.addCommentAjax(addComment(result, state), state);
$("#submitCommentButton" + state).removeAttr("disabled"); $("#submitCommentButton" + state).removeAttr("disabled");
$("#captcha" + state).attr("src", latkeConfig.servePath + "/captcha.do?code=" + Math.random()); $("#captcha" + state).attr("src", latkeConfig.servePath + "/captcha.do?code=" + Math.random());
} }
}); });
Cookie.createCookie("commentName", requestJSONObject.commentName, 365); Cookie.createCookie("commentName", requestJSONObject.commentName, 365);
Cookie.createCookie("commentEmail", requestJSONObject.commentEmail, 365); Cookie.createCookie("commentEmail", requestJSONObject.commentEmail, 365);
Cookie.createCookie("commentURL", $("#commentURL" + state).val().replace(/(^\s*)|(\s*$)/g, ""), 365); Cookie.createCookie("commentURL", $("#commentURL" + state).val().replace(/(^\s*)|(\s*$)/g, ""), 365);
} }
}, },
/* /*
* @description 添加回复评论表单 * @description 添加回复评论表单
* @param {String} id 被回复的评论 id * @param {String} id 被回复的评论 id
* @param {String} commentFormHTML 评论表单HTML * @param {String} commentFormHTML 评论表单HTML
* @param {String} endHTML 判断该表单使用 table 还是 div 标签,然后进行构造 * @param {String} endHTML 判断该表单使用 table 还是 div 标签,然后进行构造
*/ */
addReplyForm: function (id, commentFormHTML, endHTML) { addReplyForm: function (id, commentFormHTML, endHTML) {
var that = this; var that = this;
if (id === this.currentCommentId) { if (id === this.currentCommentId) {
if (Cookie.readCookie("commentName") === "") { if (Cookie.readCookie("commentName") === "") {
$("#commentNameReply").focus(); $("#commentNameReply").focus();
} else { } else {
$("#commentReply").focus(); $("#commentReply").focus();
} }
return; return;
} else { } else {
$("#replyForm").remove(); $("#replyForm").remove();
endHTML = endHTML ? endHTML : ""; endHTML = endHTML ? endHTML : "";
if (endHTML === "</div>") { if (endHTML === "</div>") {
$("#" + id).append(commentFormHTML + $("#commentForm").html() + endHTML); $("#" + id).append(commentFormHTML + $("#commentForm").html() + endHTML);
} else { } else {
$("#" + id).append(commentFormHTML + $("#commentForm").html() + "</table>" + endHTML); $("#" + id).append(commentFormHTML + $("#commentForm").html() + "</table>" + endHTML);
} }
// change id, bind event and set value // change id, bind event and set value
$("#replyForm input, #replyForm textarea").each(function () { $("#replyForm input, #replyForm textarea").each(function () {
this.id = this.id + "Reply"; this.id = this.id + "Reply";
}); });
$("#commentNameReply").val(Cookie.readCookie("commentName")); $("#commentNameReply").val(Cookie.readCookie("commentName"));
$("#commentEmailReply").val(Cookie.readCookie("commentEmail")); $("#commentEmailReply").val(Cookie.readCookie("commentEmail"));
var $label = $("#replyForm #commentURLLabel"); var $label = $("#replyForm #commentURLLabel");
if ($label.length === 1) { if ($label.length === 1) {
$label.attr("id", "commentURLLabelReply"); $label.attr("id", "commentURLLabelReply");
} }
$("#commentURLReply").val(Cookie.readCookie("commentURL")); $("#commentURLReply").val(Cookie.readCookie("commentURL"));
$("#replyForm #emotions").attr("id", "emotionsReply"); $("#replyForm #emotions").attr("id", "emotionsReply");
this.insertEmotions("Reply"); this.insertEmotions("Reply");
$("#commentValidateReply").unbind().keypress(function (event) { $("#commentValidateReply").unbind().keypress(function (event) {
if (event.keyCode === 13) { if (event.keyCode === 13) {
that.submitComment(id, 'Reply'); that.submitComment(id, 'Reply');
event.preventDefault(); event.preventDefault();
} }
}); });
$("#replyForm #captcha").attr("id", "captchaReply"). $("#replyForm #captcha").attr("id", "captchaReply").
attr("src", latkeConfig.servePath + "/captcha.do?" + new Date().getTime()).click(function () { attr("src", latkeConfig.servePath + "/captcha.do?" + new Date().getTime()).click(function () {
$(this).attr("src", latkeConfig.servePath + "/captcha.do?code=" + Math.random()); $(this).attr("src", latkeConfig.servePath + "/captcha.do?code=" + Math.random());
}); });
$("#replyForm #commentErrorTip").attr("id", "commentErrorTipReply").html("").hide(); $("#replyForm #commentErrorTip").attr("id", "commentErrorTipReply").html("").hide();
$("#replyForm #submitCommentButton").attr("id", "submitCommentButtonReply"); $("#replyForm #submitCommentButton").attr("id", "submitCommentButtonReply");
$("#replyForm #submitCommentButtonReply").unbind("click").removeAttr("onclick").click(function () { $("#replyForm #submitCommentButtonReply").unbind("click").removeAttr("onclick").click(function () {
that.submitComment(id, 'Reply'); that.submitComment(id, 'Reply');
}); });
if (Cookie.readCookie("commentName") === "") { if (Cookie.readCookie("commentName") === "") {
$("#commentNameReply").focus(); $("#commentNameReply").focus();
} else { } else {
$("#commentReply").focus(); $("#commentReply").focus();
} }
} }
this.currentCommentId = id; this.currentCommentId = id;
}, },
/* /*
* @description 隐藏回复评论的浮出层 * @description 隐藏回复评论的浮出层
* @parma {String} id 被回复的评论 id * @parma {String} id 被回复的评论 id
*/ */
hideComment: function (id) { hideComment: function (id) {
$("#commentRef" + id).hide(); $("#commentRef" + id).hide();
}, },
/* /*
* @description 显示回复评论的浮出层 * @description 显示回复评论的浮出层
* @parma {Dom} it 触发事件的 dom * @parma {Dom} it 触发事件的 dom
* @param {String} id 被回复的评论 id * @param {String} id 被回复的评论 id
* @param {Int} top 位置相对浮出层的高度 * @param {Int} top 位置相对浮出层的高度
* @param {String} [parentTag] it 如果嵌入在 position 为 relative 的元素 A 中时,需取到 A 元素 * @param {String} [parentTag] it 如果嵌入在 position 为 relative 的元素 A 中时,需取到 A 元素
*/ */
showComment: function (it, id, top, parentTag) { showComment: function (it, id, top, parentTag) {
var positionTop = parseInt($(it).position().top); var positionTop = parseInt($(it).position().top);
if (parentTag) { if (parentTag) {
positionTop = parseInt($(it).parents(parentTag).position().top); positionTop = parseInt($(it).parents(parentTag).position().top);
} }
if ( $("#commentRef" + id).length > 0) { if ( $("#commentRef" + id).length > 0) {
// 此处重复设置 top 是由于评论为异步,原有回复评论的显示位置应往下移动 // 此处重复设置 top 是由于评论为异步,原有回复评论的显示位置应往下移动
$("#commentRef" + id).show().css("top", (positionTop + top) + "px"); $("#commentRef" + id).show().css("top", (positionTop + top) + "px");
} else { } else {
var $refComment = $("#" + id).clone(); var $refComment = $("#" + id).clone();
$refComment.addClass("comment-body-ref").attr("id", "commentRef" + id); $refComment.addClass("comment-body-ref").attr("id", "commentRef" + id);
$refComment.find("#replyForm").remove(); $refComment.find("#replyForm").remove();
$("#comments").append($refComment); $("#comments").append($refComment);
$("#commentRef" + id).css("top", (positionTop + top) + "px"); $("#commentRef" + id).css("top", (positionTop + top) + "px");
} }
}, },
/* /*
* @description 回复不刷新,将回复内容异步添加到评论列表中 * @description 回复不刷新,将回复内容异步添加到评论列表中
* @parma {String} commentHTML 回复内容 HTML * @parma {String} commentHTML 回复内容 HTML
* @param {String} state 用于区分评论文章还是回复评论 * @param {String} state 用于区分评论文章还是回复评论
*/ */
addCommentAjax: function (commentHTML, state) { addCommentAjax: function (commentHTML, state) {
if ($("#comments").children().length > 0) { if ($("#comments").children().length > 0) {
$($("#comments").children()[0]).before(commentHTML); $($("#comments").children()[0]).before(commentHTML);
} else { } else {
$("#comments").html(commentHTML); $("#comments").html(commentHTML);
} }
if (state === "") { if (state === "") {
$("#commentErrorTip").html("").hide(); $("#commentErrorTip").html("").hide();
$("#comment").val(""); $("#comment").val("");
$("#commentValidate").val(""); $("#commentValidate").val("");
$("#captcha").attr("src", latkeConfig.servePath + "/captcha.do?code=" + Math.random()); $("#captcha").attr("src", latkeConfig.servePath + "/captcha.do?code=" + Math.random());
} else { } else {
$("#replyForm").remove(); $("#replyForm").remove();
} }
window.location.hash = "#comments"; window.location.hash = "#comments";
} }
}); });
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment