Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
solo
Project overview
Project overview
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
solo
Commits
e3088d67
Commit
e3088d67
authored
Nov 29, 2012
by
Vanessa
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixed #129, fixed #130
parent
c53b3170
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
851 additions
and
820 deletions
+851
-820
war/src/main/webapp/js/admin/editorCodeMirror.js
war/src/main/webapp/js/admin/editorCodeMirror.js
+1
-2
war/src/main/webapp/js/admin/editorKindEditor.js
war/src/main/webapp/js/admin/editorKindEditor.js
+1
-1
war/src/main/webapp/js/page.js
war/src/main/webapp/js/page.js
+725
-720
war/src/main/webapp/skins/mobile/themes/core/core.js
war/src/main/webapp/skins/mobile/themes/core/core.js
+123
-96
war/src/main/webapp/top-bar.ftl
war/src/main/webapp/top-bar.ftl
+1
-1
No files found.
war/src/main/webapp/js/admin/editorCodeMirror.js
View file @
e3088d67
...
...
@@ -41,8 +41,7 @@ admin.editors.CodeMirror = {
"
<div class='clear'></div>
"
+
"
<div class='markdown-preview-main none'></div>
"
+
"
<div class='markdown-help-main'>
"
+
Label
.
markdownHelpLabel
+
"
</div>
"
"
</div>
"
+
"
<div class='clear'></div>
"
;
+
"
</div><div class='clear'></div>
"
;
}
$
(
"
#
"
+
conf
.
id
).
after
(
previewHTML
);
...
...
war/src/main/webapp/js/admin/editorKindEditor.js
View file @
e3088d67
...
...
@@ -39,7 +39,7 @@ admin.editors.KindEditor = {
langType
:
language
,
resizeType
:
0
,
items
:
[
"
bold
"
,
"
italic
"
,
"
underline
"
,
"
strikethrough
"
,
"
|
"
,
"
undo
"
,
"
redo
"
,
"
|
"
,
"
insertunorderedlist
"
,
"
insertorderedlist
"
,
"
insertunorderedlist
"
,
"
insertorderedlist
"
,
"
|
"
,
"
source
"
]
});
}
catch
(
e
)
{
...
...
war/src/main/webapp/js/page.js
View file @
e3088d67
/*
* 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 Page util, load heighlight and process comment.
*
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.3.1, Jul 5, 2012
*/
var
Page
=
function
(
tips
)
{
this
.
currentCommentId
=
""
;
this
.
tips
=
tips
;
};
$
.
extend
(
Page
.
prototype
,
{
/*
* @description 评论时点击表情,在评论内容中插入相关代码
* @param {String} name 用于区别回复评论还是对文章的评论
*/
insertEmotions
:
function
(
name
)
{
var
_it
=
this
;
if
(
name
===
undefined
)
{
name
=
""
;
}
$
(
"
#emotions
"
+
name
+
"
span
"
).
click
(
function
()
{
var
$comment
=
$
(
"
#comment
"
+
name
);
var
endPosition
=
_it
.
_getCursorEndPosition
(
$comment
[
0
]);
var
key
=
"
[
"
+
this
.
className
+
"
]
"
,
textValue
=
$comment
[
0
].
value
;
textValue
=
textValue
.
substring
(
0
,
endPosition
)
+
key
+
textValue
.
substring
(
endPosition
,
textValue
.
length
);
$
(
"
#comment
"
+
name
).
val
(
textValue
);
if
(
$
.
browser
.
msie
)
{
endPosition
-=
textValue
.
split
(
'
\n
'
).
length
-
1
;
var
oR
=
$comment
[
0
].
createTextRange
();
oR
.
collapse
(
true
);
oR
.
moveStart
(
'
character
'
,
endPosition
+
6
);
oR
.
select
();
}
else
{
$comment
[
0
].
setSelectionRange
(
endPosition
+
6
,
endPosition
+
6
);
}
});
},
/**
* @description 获取当前光标最后位置
* @param {Dom} textarea 评论框对象
* @returns {Num} 光标位置
*/
_getCursorEndPosition
:
function
(
textarea
)
{
textarea
.
focus
();
if
(
textarea
.
setSelectionRange
)
{
// W3C
return
textarea
.
selectionEnd
;
}
else
if
(
document
.
selection
)
{
// IE
var
i
=
0
,
oS
=
document
.
selection
.
createRange
(),
oR
=
document
.
body
.
createTextRange
();
oR
.
moveToElementText
(
textarea
);
oS
.
getBookmark
();
for
(
i
=
0
;
oR
.
compareEndPoints
(
'
StartToStart
'
,
oS
)
<
0
&&
oS
.
moveStart
(
"
character
"
,
-
1
)
!==
0
;
i
++
)
{
if
(
textarea
.
value
.
charAt
(
i
)
==
'
\n
'
)
{
i
++
;
}
}
return
i
;
}
},
/*
* @description 评论校验
* @param {String} state 用于区别回复评论还是对文章的评论
*/
validateComment
:
function
(
state
)
{
var
commentName
=
$
(
"
#commentName
"
+
state
).
val
().
replace
(
/
(
^
\s
*
)
|
(\s
*$
)
/g
,
""
),
commenterContent
=
$
(
"
#comment
"
+
state
).
val
().
replace
(
/
(
^
\s
*
)
|
(\s
*$
)
/g
,
""
);
if
(
2
>
commentName
.
length
||
commentName
.
length
>
20
)
{
$
(
"
#commentErrorTip
"
+
state
).
html
(
this
.
tips
.
nameTooLongLabel
);
$
(
"
#commentName
"
+
state
).
focus
();
}
else
if
(
$
(
"
#commentEmail
"
+
state
).
val
().
replace
(
/
\s
/g
,
""
)
===
""
)
{
$
(
"
#commentErrorTip
"
+
state
).
html
(
this
.
tips
.
mailCannotEmptyLabel
);
$
(
"
#commentEmail
"
+
state
).
focus
();
}
else
if
(
!
/^
((([
a-z
]
|
\d
|
[
!#
\$
%&'
\*\+\-\/
=
\?\^
_`{
\|
}~
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
+
(\.([
a-z
]
|
\d
|
[
!#
\$
%&'
\*\+\-\/
=
\?\^
_`{
\|
}~
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
+
)
*
)
|
((\x
22
)((((\x
20|
\x
09
)
*
(\x
0d
\x
0a
))?(\x
20|
\x
09
)
+
)?(([\x
01-
\x
08
\x
0b
\x
0c
\x
0e-
\x
1f
\x
7f
]
|
\x
21|
[\x
23-
\x
5b
]
|
[\x
5d-
\x
7e
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
|
(\\([\x
01-
\x
09
\x
0b
\x
0c
\x
0d-
\x
7f
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
]))))
*
(((\x
20|
\x
09
)
*
(\x
0d
\x
0a
))?(\x
20|
\x
09
)
+
)?(\x
22
)))
@
((([
a-z
]
|
\d
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
|
(([
a-z
]
|
\d
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])([
a-z
]
|
\d
|-|
\.
|_|~|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
*
([
a-z
]
|
\d
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])))\.)
+
(([
a-z
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
|
(([
a-z
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])([
a-z
]
|
\d
|-|
\.
|_|~|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
*
([
a-z
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])))\.?
$/i
.
test
(
$
(
"
#commentEmail
"
+
state
).
val
()))
{
$
(
"
#commentErrorTip
"
+
state
).
html
(
this
.
tips
.
mailInvalidLabel
);
$
(
"
#commentEmail
"
+
state
).
focus
();
}
else
if
(
2
>
commenterContent
.
length
||
commenterContent
.
length
>
500
)
{
$
(
"
#commentErrorTip
"
+
state
).
html
(
this
.
tips
.
commentContentCannotEmptyLabel
);
$
(
"
#comment
"
+
state
).
focus
();
}
else
if
(
$
(
"
#commentValidate
"
+
state
).
val
().
replace
(
/
\s
/g
,
""
)
===
""
)
{
$
(
"
#commentErrorTip
"
+
state
).
html
(
this
.
tips
.
captchaCannotEmptyLabel
);
$
(
"
#commentValidate
"
+
state
).
focus
();
}
else
{
return
true
;
}
$
(
"
#commentErrorTip
"
+
state
).
show
();
return
false
;
},
/*
* @description 把评论中的标识替换为图片
* @param {Dom} selector
*/
replaceCommentsEm
:
function
(
selector
)
{
var
$commentContents
=
$
(
selector
);
for
(
var
i
=
0
;
i
<
$commentContents
.
length
;
i
++
)
{
var
str
=
$commentContents
[
i
].
innerHTML
;
$commentContents
[
i
].
innerHTML
=
Util
.
replaceEmString
(
str
);
}
},
/*
* @description 初始化 SyantaxHighlighter
* @param {Array} languages 需要加载的语言
*/
_initSyntaxHighlighter
:
function
(
languages
)
{
// load brush js
for
(
var
i
=
0
;
i
<
languages
.
length
;
i
++
)
{
switch
(
languages
[
i
])
{
case
"
groovy
"
:
languages
[
i
]
=
'
groovy
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushGroovy.js
'
;
break
;
case
"
java
"
:
languages
[
i
]
=
'
java
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushJava.js
'
;
break
;
case
"
php
"
:
languages
[
i
]
=
'
php
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushPhp.js
'
;
break
;
case
"
scala
"
:
languages
[
i
]
=
'
scala
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushScala.js
'
;
break
;
case
"
sql
"
:
languages
[
i
]
=
'
sql
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushSql.js
'
;
break
;
case
"
applescript
"
:
languages
[
i
]
=
'
applescript
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushAppleScript.js
'
;
break
;
case
"
as3
"
:
case
"
actionscript3
"
:
languages
[
i
]
=
'
actionscript3 as3
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushAS3.js
'
;
break
;
case
"
bash
"
:
case
"
shell
"
:
languages
[
i
]
=
'
bash shell
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushBash.js
'
;
break
;
case
"
coldfusion
"
:
case
"
cf
"
:
languages
[
i
]
=
'
coldfusion cf
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushColdFusion.js
'
;
break
;
case
"
c#
"
:
case
"
c-sharp
"
:
case
"
csharp
"
:
languages
[
i
]
=
'
c# c-sharp csharp
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushCSharp.js
'
;
break
;
case
"
cpp
"
:
case
"
c
"
:
languages
[
i
]
=
'
cpp c
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushCpp.js
'
;
break
;
case
"
css
"
:
languages
[
i
]
=
'
css
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushCss.js
'
;
break
;
case
"
delphi
"
:
case
"
pascal
"
:
languages
[
i
]
=
'
delphi pascal
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushDelphi.js
'
;
break
;
case
"
diff
"
:
case
"
patch
"
:
case
"
pas
"
:
languages
[
i
]
=
'
diff patch pas
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushDiff.js
'
;
break
;
case
"
erl
"
:
case
"
erlang
"
:
languages
[
i
]
=
'
erl erlang
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushErlang.js
'
;
break
;
case
"
js
"
:
case
"
jscript
"
:
case
"
javascript
"
:
languages
[
i
]
=
'
js jscript javascript
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushJScript.js
'
;
break
;
case
"
jfx
"
:
case
"
javafx
"
:
languages
[
i
]
=
'
jfx javafx
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushJavaFX.js
'
;
break
;
case
"
perl
"
:
case
"
pl
"
:
languages
[
i
]
=
'
perl pl
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushPerl.js
'
;
break
;
case
"
plain
"
:
case
"
text
"
:
languages
[
i
]
=
'
text plain
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushPlain.js
'
;
break
;
case
"
ps
"
:
case
"
powershell
"
:
languages
[
i
]
=
'
ps powershell
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushPowerShell.js
'
;
break
;
case
"
py
"
:
case
"
python
"
:
languages
[
i
]
=
'
py python
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushPython.js
'
;
break
;
case
"
rails
"
:
case
"
ror
"
:
case
"
ruby
"
:
case
"
rb
"
:
languages
[
i
]
=
'
ruby rails ror rb
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushRuby.js
'
;
break
;
case
"
sass
"
:
case
"
scss
"
:
languages
[
i
]
=
'
sass scss
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushSass.js
'
;
break
;
case
"
vb
"
:
case
"
vbnet
"
:
languages
[
i
]
=
'
vb vbnet
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushVb.js
'
;
break
;
case
"
xml
"
:
case
"
xhtml
"
:
case
"
xslt
"
:
case
"
html
"
:
languages
[
i
]
=
'
xml xhtml xslt html
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushXml.js
'
;
break
;
default
:
break
;
}
}
// code high lighter
SyntaxHighlighter
.
autoloader
.
apply
(
null
,
languages
);
SyntaxHighlighter
.
config
.
stripBrs
=
true
;
SyntaxHighlighter
.
all
();
},
/*
* @description 加载 SyntaxHighlighter
* @param {String} SHTheme SyntaxHighLighter 样式
*/
_loadSyntaxHighlighter
:
function
(
SHTheme
)
{
var
cssName
=
SHTheme
?
SHTheme
:
"
shCoreEclipse
"
,
that
=
this
;
// load css
if
(
document
.
createStyleSheet
)
{
document
.
createStyleSheet
(
latkeConfig
.
staticServePath
+
"
/js/lib/SyntaxHighlighter/styles/
"
+
cssName
+
"
.css
"
);
}
else
{
$
(
"
head
"
).
append
(
$
(
"
<link rel='stylesheet' href='
"
+
latkeConfig
.
staticServePath
+
"
/js/lib/SyntaxHighlighter/styles/
"
+
cssName
+
"
.css' type='text/css' charset='utf-8' />
"
));
}
// load js
$
.
ajax
({
url
:
latkeConfig
.
staticServePath
+
"
/js/lib/SyntaxHighlighter/scripts/shCore.js
"
,
dataType
:
"
script
"
,
cache
:
true
,
success
:
function
()
{
// get brush settings
var
languages
=
[],
isScrip
=
false
;
$
(
"
.article-body pre
"
).
each
(
function
()
{
var
name
=
this
.
className
.
split
(
"
;
"
)[
0
];
var
language
=
name
.
substr
(
7
,
name
.
length
-
1
);
if
(
this
.
className
.
indexOf
(
"
html-script: true
"
)
>
-
1
&&
(
language
!==
"
xml
"
&&
language
!==
"
xhtml
"
&&
language
!==
"
xslt
"
&&
language
!=
"
html
"
))
{
isScrip
=
true
;
}
languages
.
push
(
language
);
});
// when html-script is true, need shBrushXml.js
if
(
isScrip
)
{
$
.
ajax
({
url
:
latkeConfig
.
staticServePath
+
"
/js/lib/SyntaxHighlighter/scripts/shBrushXml.js
"
,
dataType
:
"
script
"
,
cache
:
true
,
success
:
function
()
{
that
.
_initSyntaxHighlighter
(
languages
);
}
});
}
else
{
that
.
_initSyntaxHighlighter
(
languages
);
}
}
});
},
/*
* @description 解析语法高亮
* @param {Obj} obj 语法高亮配置参数
* @param {Obj} obj.SHTheme 语法高亮 SyntaxHighLighter 样式
*/
parseLanguage
:
function
(
obj
)
{
var
isPrettify
=
false
,
isSH
=
false
;
$
(
"
.article-body pre
"
).
each
(
function
()
{
if
(
this
.
className
.
indexOf
(
"
brush
"
)
>
-
1
)
{
isSH
=
true
;
}
if
(
this
.
className
.
indexOf
(
"
prettyprint
"
)
>
-
1
)
{
isPrettify
=
true
;
}
});
if
(
isSH
)
{
this
.
_loadSyntaxHighlighter
(
obj
?
(
obj
.
SHTheme
?
obj
.
SHTheme
:
undefined
)
:
undefined
);
}
if
(
isPrettify
)
{
// load css
if
(
document
.
createStyleSheet
)
{
document
.
createStyleSheet
(
latkeConfig
.
staticServePath
+
"
/js/lib/google-code-prettify/prettify.css
"
);
}
else
{
$
(
"
head
"
).
append
(
$
(
"
<link rel='stylesheet' href='
"
+
latkeConfig
.
staticServePath
+
"
/js/lib/google-code-prettify/prettify.css'>
"
));
}
// load js
document
.
write
(
"
<script src=
\"
"
+
latkeConfig
.
staticServePath
+
"
/js/lib/google-code-prettify/prettify.js
\"
><
\
/script>
"
);
// load function
$
(
document
).
ready
(
function
()
{
prettyPrint
();
});
}
},
/*
* @description 文章/自定义页面加载
* @param {Obj} obj 配置设定
* @param {Obj} obj.language 代码高亮配置
*/
load
:
function
(
obj
)
{
var
that
=
this
;
// emotions
that
.
insertEmotions
();
// language
that
.
parseLanguage
(
obj
?
(
obj
.
language
?
obj
.
language
:
undefined
)
:
undefined
);
// submit comment
$
(
"
#commentValidate
"
).
keypress
(
function
(
event
)
{
if
(
event
.
keyCode
===
13
)
{
that
.
submitComment
();
}
});
// captcha
$
(
"
#captcha
"
).
click
(
function
()
{
$
(
this
).
attr
(
"
src
"
,
latkeConfig
.
servePath
+
"
/captcha.do?code=
"
+
Math
.
random
());
});
// cookie
var
$top
=
$
(
"
#top #admin
"
);
if
(
$top
.
length
===
1
)
{
if
(
$top
.
find
(
"
a
"
).
length
>
2
)
{
Cookie
.
createCookie
(
"
commentName
"
,
$top
.
find
(
"
span
"
).
text
(),
365
);
Cookie
.
createCookie
(
"
commentURL
"
,
window
.
location
.
host
,
365
);
}
}
$
(
"
#commentEmail
"
).
val
(
Cookie
.
readCookie
(
"
commentEmail
"
));
$
(
"
#commentURL
"
).
val
(
Cookie
.
readCookie
(
"
commentURL
"
));
$
(
"
#commentName
"
).
val
(
Cookie
.
readCookie
(
"
commentName
"
));
// if no JSON, add it.
try
{
JSON
}
catch
(
e
)
{
document
.
write
(
"
<script src=
\"
"
+
latkeConfig
.
staticServePath
+
"
/js/lib/json2.js
\"
><
\
/script>
"
);
}
},
/*
* @description 加载随机文章
* @param {String} headTitle 随机文章标题
*/
loadRandomArticles
:
function
(
headTitle
)
{
var
randomArticles1Label
=
this
.
tips
.
randomArticles1Label
;
// getRandomArticles
$
.
ajax
({
url
:
latkeConfig
.
servePath
+
"
/get-random-articles.do
"
,
type
:
"
POST
"
,
success
:
function
(
result
,
textStatus
){
var
randomArticles
=
result
.
randomArticles
;
if
(
!
randomArticles
||
0
===
randomArticles
.
length
)
{
$
(
"
#randomArticles
"
).
remove
();
return
;
}
var
listHtml
=
""
;
for
(
var
i
=
0
;
i
<
randomArticles
.
length
;
i
++
)
{
var
article
=
randomArticles
[
i
];
var
title
=
article
.
articleTitle
;
var
randomArticleLiHtml
=
"
<li>
"
+
"
<a rel='nofollow' title='
"
+
title
+
"
' href='
"
+
article
.
articlePermalink
+
"
'>
"
+
title
+
"
</a></li>
"
;
listHtml
+=
randomArticleLiHtml
;
}
var
titleHTML
=
headTitle
?
headTitle
:
"
<h4>
"
+
randomArticles1Label
+
"
</h4>
"
;
var
randomArticleListHtml
=
titleHTML
+
"
<ul class='marginLeft12'>
"
+
listHtml
+
"
</ul>
"
;
$
(
"
#randomArticles
"
).
append
(
randomArticleListHtml
);
}
});
},
/*
* @description 加载相关文章
* @param {String} id 文章 id
* @param {String} headTitle 相关文章标题
*/
loadRelevantArticles
:
function
(
id
,
headTitle
)
{
$
.
ajax
({
url
:
latkeConfig
.
servePath
+
"
/article/id/
"
+
id
+
"
/relevant/articles
"
,
type
:
"
GET
"
,
success
:
function
(
data
,
textStatus
){
var
articles
=
data
.
relevantArticles
;
if
(
!
articles
||
0
===
articles
.
length
)
{
$
(
"
#relevantArticles
"
).
remove
();
return
;
}
var
listHtml
=
""
;
for
(
var
i
=
0
;
i
<
articles
.
length
;
i
++
)
{
var
article
=
articles
[
i
];
var
title
=
article
.
articleTitle
;
var
articleLiHtml
=
"
<li>
"
+
"
<a rel='nofollow' title='
"
+
title
+
"
' href='
"
+
article
.
articlePermalink
+
"
'>
"
+
title
+
"
</a></li>
"
listHtml
+=
articleLiHtml
}
var
relevantArticleListHtml
=
headTitle
+
"
<ul class='marginLeft12'>
"
+
listHtml
+
"
</ul>
"
;
$
(
"
#relevantArticles
"
).
append
(
relevantArticleListHtml
);
},
error
:
function
()
{
$
(
"
#relevantArticles
"
).
remove
();
}
});
},
/*
* @description 加载站外相关文章
* @param {String} tags 文章 tags
* @param {String} headTitle 站外相关文章标题
*/
loadExternalRelevantArticles
:
function
(
tags
,
headTitle
)
{
var
tips
=
this
.
tips
;
try
{
$
.
ajax
({
url
:
"
http://rhythm.b3log.org:80/get-articles-by-tags.do?tags=
"
+
tags
+
"
&blogHost=
"
+
tips
.
blogHost
+
"
&paginationPageSize=
"
+
tips
.
externalRelevantArticlesDisplayCount
,
type
:
"
GET
"
,
cache
:
true
,
dataType
:
"
jsonp
"
,
error
:
function
(){
$
(
"
#externalRelevantArticles
"
).
remove
();
},
success
:
function
(
data
,
textStatus
){
var
articles
=
data
.
articles
;
if
(
!
articles
||
0
===
articles
.
length
)
{
$
(
"
#externalRelevantArticles
"
).
remove
();
return
;
}
var
listHtml
=
""
;
for
(
var
i
=
0
;
i
<
articles
.
length
;
i
++
)
{
var
article
=
articles
[
i
];
var
title
=
article
.
articleTitle
;
var
articleLiHtml
=
"
<li>
"
+
"
<a rel='nofollow' title='
"
+
title
+
"
' target='_blank' href='
"
+
article
.
articlePermalink
+
"
'>
"
+
title
+
"
</a></li>
"
listHtml
+=
articleLiHtml
}
var
titleHTML
=
headTitle
?
headTitle
:
"
<h4>
"
+
tips
.
externalRelevantArticles1Label
+
"
</h4>
"
;
var
randomArticleListHtml
=
titleHTML
+
"
<ul class='marginLeft12'>
"
+
listHtml
+
"
</ul>
"
;
$
(
"
#externalRelevantArticles
"
).
append
(
randomArticleListHtml
);
}
});
}
catch
(
e
)
{
// 忽略相关文章加载异常:load script error
}
},
/*
* @description 提交评论
* @param {String} commentId 回复评论时的评论 id
* @param {String} state 区分回复文章还是回复评论的标识
*/
submitComment
:
function
(
commentId
,
state
)
{
if
(
!
state
)
{
state
=
''
;
}
var
that
=
this
,
tips
=
this
.
tips
,
type
=
"
article
"
;
if
(
tips
.
externalRelevantArticlesDisplayCount
===
undefined
)
{
type
=
"
page
"
;
}
if
(
this
.
validateComment
(
state
))
{
$
(
"
#submitCommentButton
"
+
state
).
attr
(
"
disabled
"
,
"
disabled
"
);
$
(
"
#commentErrorTip
"
+
state
).
show
().
html
(
this
.
tips
.
loadingLabel
);
var
requestJSONObject
=
{
"
oId
"
:
tips
.
oId
,
"
commentContent
"
:
$
(
"
#comment
"
+
state
).
val
().
replace
(
/
(
^
\s
*
)
|
(\s
*$
)
/g
,
""
),
"
commentEmail
"
:
$
(
"
#commentEmail
"
+
state
).
val
(),
"
commentURL
"
:
Util
.
proessURL
(
$
(
"
#commentURL
"
+
state
).
val
().
replace
(
/
(
^
\s
*
)
|
(\s
*$
)
/g
,
""
)),
"
commentName
"
:
$
(
"
#commentName
"
+
state
).
val
().
replace
(
/
(
^
\s
*
)
|
(\s
*$
)
/g
,
""
),
"
captcha
"
:
$
(
"
#commentValidate
"
+
state
).
val
()
};
if
(
state
===
"
Reply
"
)
{
requestJSONObject
.
commentOriginalCommentId
=
commentId
;
}
$
.
ajax
({
type
:
"
POST
"
,
url
:
latkeConfig
.
servePath
+
"
/add-
"
+
type
+
"
-comment.do
"
,
cache
:
false
,
contentType
:
"
application/json
"
,
data
:
JSON
.
stringify
(
requestJSONObject
),
success
:
function
(
result
){
if
(
!
result
.
sc
)
{
$
(
"
#commentErrorTip
"
+
state
).
html
(
result
.
msg
);
$
(
"
#commentValidate
"
+
state
).
val
(
""
).
focus
();
$
(
"
#submitCommentButton
"
+
state
).
removeAttr
(
"
disabled
"
);
$
(
"
#captcha
"
+
state
).
attr
(
"
src
"
,
latkeConfig
.
servePath
+
"
/captcha.do?code=
"
+
Math
.
random
());
return
;
}
result
.
replyNameHTML
=
""
;
if
(
$
(
"
#commentURL
"
+
state
).
val
().
replace
(
/
\s
/g
,
""
)
===
""
)
{
result
.
replyNameHTML
=
'
<a>
'
+
$
(
"
#commentName
"
+
state
).
val
()
+
'
</a>
'
;
}
else
{
result
.
replyNameHTML
=
'
<a href="
'
+
Util
.
proessURL
(
$
(
"
#commentURL
"
+
state
).
val
())
+
'
" target="_blank">
'
+
$
(
"
#commentName
"
+
state
).
val
()
+
'
</a>
'
;
}
that
.
addCommentAjax
(
addComment
(
result
,
state
),
state
);
$
(
"
#submitCommentButton
"
+
state
).
removeAttr
(
"
disabled
"
);
$
(
"
#captcha
"
+
state
).
attr
(
"
src
"
,
latkeConfig
.
servePath
+
"
/captcha.do?code=
"
+
Math
.
random
());
}
});
Cookie
.
createCookie
(
"
commentName
"
,
requestJSONObject
.
commentName
,
365
);
Cookie
.
createCookie
(
"
commentEmail
"
,
requestJSONObject
.
commentEmail
,
365
);
Cookie
.
createCookie
(
"
commentURL
"
,
$
(
"
#commentURL
"
+
state
).
val
().
replace
(
/
(
^
\s
*
)
|
(\s
*$
)
/g
,
""
),
365
);
}
},
/*
* @description 添加回复评论表单
* @param {String} id 被回复的评论 id
* @param {String} commentFormHTML 评论表单HTML
* @param {String} endHTML 判断该表单使用 table 还是 div 标签,然后进行构造
*/
addReplyForm
:
function
(
id
,
commentFormHTML
,
endHTML
)
{
var
that
=
this
;
if
(
id
===
this
.
currentCommentId
)
{
if
(
Cookie
.
readCookie
(
"
commentName
"
)
===
""
)
{
$
(
"
#commentNameReply
"
).
focus
();
}
else
{
$
(
"
#commentReply
"
).
focus
();
}
return
;
}
else
{
$
(
"
#replyForm
"
).
remove
();
endHTML
=
endHTML
?
endHTML
:
""
;
if
(
endHTML
===
"
</div>
"
)
{
$
(
"
#
"
+
id
).
append
(
commentFormHTML
+
$
(
"
#commentForm
"
).
html
()
+
endHTML
);
}
else
{
$
(
"
#
"
+
id
).
append
(
commentFormHTML
+
$
(
"
#commentForm
"
).
html
()
+
"
</table>
"
+
endHTML
);
}
// change id, bind event and set value
$
(
"
#replyForm input, #replyForm textarea
"
).
each
(
function
()
{
this
.
id
=
this
.
id
+
"
Reply
"
;
});
$
(
"
#commentNameReply
"
).
val
(
Cookie
.
readCookie
(
"
commentName
"
));
$
(
"
#commentEmailReply
"
).
val
(
Cookie
.
readCookie
(
"
commentEmail
"
));
var
$label
=
$
(
"
#replyForm #commentURLLabel
"
);
if
(
$label
.
length
===
1
)
{
$label
.
attr
(
"
id
"
,
"
commentURLLabelReply
"
);
}
$
(
"
#commentURLReply
"
).
val
(
Cookie
.
readCookie
(
"
commentURL
"
));
$
(
"
#replyForm #emotions
"
).
attr
(
"
id
"
,
"
emotionsReply
"
);
this
.
insertEmotions
(
"
Reply
"
);
$
(
"
#commentValidateReply
"
).
unbind
().
keypress
(
function
(
event
)
{
if
(
event
.
keyCode
===
13
)
{
that
.
submitComment
(
id
,
'
Reply
'
);
event
.
preventDefault
();
}
});
$
(
"
#replyForm #captcha
"
).
attr
(
"
id
"
,
"
captchaReply
"
).
attr
(
"
src
"
,
latkeConfig
.
servePath
+
"
/captcha.do?
"
+
new
Date
().
getTime
()).
click
(
function
()
{
$
(
this
).
attr
(
"
src
"
,
latkeConfig
.
servePath
+
"
/captcha.do?code=
"
+
Math
.
random
());
});
$
(
"
#replyForm #commentErrorTip
"
).
attr
(
"
id
"
,
"
commentErrorTipReply
"
).
html
(
""
).
hide
();
$
(
"
#replyForm #submitCommentButton
"
).
attr
(
"
id
"
,
"
submitCommentButtonReply
"
);
$
(
"
#replyForm #submitCommentButtonReply
"
).
unbind
(
"
click
"
).
removeAttr
(
"
onclick
"
).
click
(
function
()
{
that
.
submitComment
(
id
,
'
Reply
'
);
});
if
(
Cookie
.
readCookie
(
"
commentName
"
)
===
""
)
{
$
(
"
#commentNameReply
"
).
focus
();
}
else
{
$
(
"
#commentReply
"
).
focus
();
}
}
this
.
currentCommentId
=
id
;
},
/*
* @description 隐藏回复评论的浮出层
* @parma {String} id 被回复的评论 id
*/
hideComment
:
function
(
id
)
{
$
(
"
#commentRef
"
+
id
).
hide
();
},
/*
* @description 显示回复评论的浮出层
* @parma {Dom} it 触发事件的 dom
* @param {String} id 被回复的评论 id
* @param {Int} top 位置相对浮出层的高度
* @param {String} [parentTag] it 如果嵌入在 position 为 relative 的元素 A 中时,需取到 A 元素
*/
showComment
:
function
(
it
,
id
,
top
,
parentTag
)
{
var
positionTop
=
parseInt
(
$
(
it
).
position
().
top
);
if
(
parentTag
)
{
positionTop
=
parseInt
(
$
(
it
).
parents
(
parentTag
).
position
().
top
);
}
if
(
$
(
"
#commentRef
"
+
id
).
length
>
0
)
{
// 此处重复设置 top 是由于评论为异步,原有回复评论的显示位置应往下移动
$
(
"
#commentRef
"
+
id
).
show
().
css
(
"
top
"
,
(
positionTop
+
top
)
+
"
px
"
);
}
else
{
var
$refComment
=
$
(
"
#
"
+
id
).
clone
();
$refComment
.
addClass
(
"
comment-body-ref
"
).
attr
(
"
id
"
,
"
commentRef
"
+
id
);
$refComment
.
find
(
"
#replyForm
"
).
remove
();
$
(
"
#comments
"
).
append
(
$refComment
);
$
(
"
#commentRef
"
+
id
).
css
(
"
top
"
,
(
positionTop
+
top
)
+
"
px
"
);
}
},
/*
* @description 回复不刷新,将回复内容异步添加到评论列表中
* @parma {String} commentHTML 回复内容 HTML
* @param {String} state 用于区分评论文章还是回复评论
*/
addCommentAjax
:
function
(
commentHTML
,
state
)
{
if
(
$
(
"
#comments
"
).
children
().
length
>
0
)
{
$
(
$
(
"
#comments
"
).
children
()[
0
]).
before
(
commentHTML
);
}
else
{
$
(
"
#comments
"
).
html
(
commentHTML
);
}
if
(
state
===
""
)
{
$
(
"
#commentErrorTip
"
).
html
(
""
).
hide
();
$
(
"
#comment
"
).
val
(
""
);
$
(
"
#commentValidate
"
).
val
(
""
);
$
(
"
#captcha
"
).
attr
(
"
src
"
,
latkeConfig
.
servePath
+
"
/captcha.do?code=
"
+
Math
.
random
());
}
else
{
$
(
"
#replyForm
"
).
remove
();
}
window
.
location
.
hash
=
"
#comments
"
;
}
/*
* 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 Page util, load heighlight and process comment.
*
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.3.1, Jul 5, 2012
*/
var
Page
=
function
(
tips
)
{
this
.
currentCommentId
=
""
;
this
.
tips
=
tips
;
};
$
.
extend
(
Page
.
prototype
,
{
/*
* @description 评论时点击表情,在评论内容中插入相关代码
* @param {String} name 用于区别回复评论还是对文章的评论
*/
insertEmotions
:
function
(
name
)
{
var
_it
=
this
;
if
(
name
===
undefined
)
{
name
=
""
;
}
$
(
"
#emotions
"
+
name
+
"
span
"
).
click
(
function
()
{
var
$comment
=
$
(
"
#comment
"
+
name
);
var
endPosition
=
_it
.
_getCursorEndPosition
(
$comment
[
0
]);
var
key
=
"
[
"
+
this
.
className
+
"
]
"
,
textValue
=
$comment
[
0
].
value
;
textValue
=
textValue
.
substring
(
0
,
endPosition
)
+
key
+
textValue
.
substring
(
endPosition
,
textValue
.
length
);
$
(
"
#comment
"
+
name
).
val
(
textValue
);
if
(
$
.
browser
.
msie
)
{
endPosition
-=
textValue
.
split
(
'
\n
'
).
length
-
1
;
var
oR
=
$comment
[
0
].
createTextRange
();
oR
.
collapse
(
true
);
oR
.
moveStart
(
'
character
'
,
endPosition
+
6
);
oR
.
select
();
}
else
{
$comment
[
0
].
setSelectionRange
(
endPosition
+
6
,
endPosition
+
6
);
}
});
},
/**
* @description 获取当前光标最后位置
* @param {Dom} textarea 评论框对象
* @returns {Num} 光标位置
*/
_getCursorEndPosition
:
function
(
textarea
)
{
textarea
.
focus
();
if
(
textarea
.
setSelectionRange
)
{
// W3C
return
textarea
.
selectionEnd
;
}
else
if
(
document
.
selection
)
{
// IE
var
i
=
0
,
oS
=
document
.
selection
.
createRange
(),
oR
=
document
.
body
.
createTextRange
();
oR
.
moveToElementText
(
textarea
);
oS
.
getBookmark
();
for
(
i
=
0
;
oR
.
compareEndPoints
(
'
StartToStart
'
,
oS
)
<
0
&&
oS
.
moveStart
(
"
character
"
,
-
1
)
!==
0
;
i
++
)
{
if
(
textarea
.
value
.
charAt
(
i
)
==
'
\n
'
)
{
i
++
;
}
}
return
i
;
}
},
/*
* @description 评论校验
* @param {String} state 用于区别回复评论还是对文章的评论
*/
validateComment
:
function
(
state
)
{
var
commentName
=
$
(
"
#commentName
"
+
state
).
val
().
replace
(
/
(
^
\s
*
)
|
(\s
*$
)
/g
,
""
),
commenterContent
=
$
(
"
#comment
"
+
state
).
val
().
replace
(
/
(
^
\s
*
)
|
(\s
*$
)
/g
,
""
);
if
(
2
>
commentName
.
length
||
commentName
.
length
>
20
)
{
$
(
"
#commentErrorTip
"
+
state
).
html
(
this
.
tips
.
nameTooLongLabel
);
$
(
"
#commentName
"
+
state
).
focus
();
}
else
if
(
$
(
"
#commentEmail
"
+
state
).
val
().
replace
(
/
\s
/g
,
""
)
===
""
)
{
$
(
"
#commentErrorTip
"
+
state
).
html
(
this
.
tips
.
mailCannotEmptyLabel
);
$
(
"
#commentEmail
"
+
state
).
focus
();
}
else
if
(
!
/^
((([
a-z
]
|
\d
|
[
!#
\$
%&'
\*\+\-\/
=
\?\^
_`{
\|
}~
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
+
(\.([
a-z
]
|
\d
|
[
!#
\$
%&'
\*\+\-\/
=
\?\^
_`{
\|
}~
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
+
)
*
)
|
((\x
22
)((((\x
20|
\x
09
)
*
(\x
0d
\x
0a
))?(\x
20|
\x
09
)
+
)?(([\x
01-
\x
08
\x
0b
\x
0c
\x
0e-
\x
1f
\x
7f
]
|
\x
21|
[\x
23-
\x
5b
]
|
[\x
5d-
\x
7e
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
|
(\\([\x
01-
\x
09
\x
0b
\x
0c
\x
0d-
\x
7f
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
]))))
*
(((\x
20|
\x
09
)
*
(\x
0d
\x
0a
))?(\x
20|
\x
09
)
+
)?(\x
22
)))
@
((([
a-z
]
|
\d
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
|
(([
a-z
]
|
\d
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])([
a-z
]
|
\d
|-|
\.
|_|~|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
*
([
a-z
]
|
\d
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])))\.)
+
(([
a-z
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
|
(([
a-z
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])([
a-z
]
|
\d
|-|
\.
|_|~|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
*
([
a-z
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])))\.?
$/i
.
test
(
$
(
"
#commentEmail
"
+
state
).
val
()))
{
$
(
"
#commentErrorTip
"
+
state
).
html
(
this
.
tips
.
mailInvalidLabel
);
$
(
"
#commentEmail
"
+
state
).
focus
();
}
else
if
(
2
>
commenterContent
.
length
||
commenterContent
.
length
>
500
)
{
$
(
"
#commentErrorTip
"
+
state
).
html
(
this
.
tips
.
commentContentCannotEmptyLabel
);
$
(
"
#comment
"
+
state
).
focus
();
}
else
if
(
!
$
(
"
#admin
"
).
data
(
"
login
"
)
&&
$
(
"
#commentValidate
"
+
state
).
val
().
replace
(
/
\s
/g
,
""
)
===
""
)
{
$
(
"
#commentErrorTip
"
+
state
).
html
(
this
.
tips
.
captchaCannotEmptyLabel
);
$
(
"
#commentValidate
"
+
state
).
focus
();
}
else
{
return
true
;
}
$
(
"
#commentErrorTip
"
+
state
).
show
();
return
false
;
},
/*
* @description 把评论中的标识替换为图片
* @param {Dom} selector
*/
replaceCommentsEm
:
function
(
selector
)
{
var
$commentContents
=
$
(
selector
);
for
(
var
i
=
0
;
i
<
$commentContents
.
length
;
i
++
)
{
var
str
=
$commentContents
[
i
].
innerHTML
;
$commentContents
[
i
].
innerHTML
=
Util
.
replaceEmString
(
str
);
}
},
/*
* @description 初始化 SyantaxHighlighter
* @param {Array} languages 需要加载的语言
*/
_initSyntaxHighlighter
:
function
(
languages
)
{
// load brush js
for
(
var
i
=
0
;
i
<
languages
.
length
;
i
++
)
{
switch
(
languages
[
i
])
{
case
"
groovy
"
:
languages
[
i
]
=
'
groovy
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushGroovy.js
'
;
break
;
case
"
java
"
:
languages
[
i
]
=
'
java
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushJava.js
'
;
break
;
case
"
php
"
:
languages
[
i
]
=
'
php
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushPhp.js
'
;
break
;
case
"
scala
"
:
languages
[
i
]
=
'
scala
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushScala.js
'
;
break
;
case
"
sql
"
:
languages
[
i
]
=
'
sql
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushSql.js
'
;
break
;
case
"
applescript
"
:
languages
[
i
]
=
'
applescript
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushAppleScript.js
'
;
break
;
case
"
as3
"
:
case
"
actionscript3
"
:
languages
[
i
]
=
'
actionscript3 as3
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushAS3.js
'
;
break
;
case
"
bash
"
:
case
"
shell
"
:
languages
[
i
]
=
'
bash shell
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushBash.js
'
;
break
;
case
"
coldfusion
"
:
case
"
cf
"
:
languages
[
i
]
=
'
coldfusion cf
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushColdFusion.js
'
;
break
;
case
"
c#
"
:
case
"
c-sharp
"
:
case
"
csharp
"
:
languages
[
i
]
=
'
c# c-sharp csharp
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushCSharp.js
'
;
break
;
case
"
cpp
"
:
case
"
c
"
:
languages
[
i
]
=
'
cpp c
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushCpp.js
'
;
break
;
case
"
css
"
:
languages
[
i
]
=
'
css
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushCss.js
'
;
break
;
case
"
delphi
"
:
case
"
pascal
"
:
languages
[
i
]
=
'
delphi pascal
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushDelphi.js
'
;
break
;
case
"
diff
"
:
case
"
patch
"
:
case
"
pas
"
:
languages
[
i
]
=
'
diff patch pas
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushDiff.js
'
;
break
;
case
"
erl
"
:
case
"
erlang
"
:
languages
[
i
]
=
'
erl erlang
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushErlang.js
'
;
break
;
case
"
js
"
:
case
"
jscript
"
:
case
"
javascript
"
:
languages
[
i
]
=
'
js jscript javascript
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushJScript.js
'
;
break
;
case
"
jfx
"
:
case
"
javafx
"
:
languages
[
i
]
=
'
jfx javafx
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushJavaFX.js
'
;
break
;
case
"
perl
"
:
case
"
pl
"
:
languages
[
i
]
=
'
perl pl
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushPerl.js
'
;
break
;
case
"
plain
"
:
case
"
text
"
:
languages
[
i
]
=
'
text plain
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushPlain.js
'
;
break
;
case
"
ps
"
:
case
"
powershell
"
:
languages
[
i
]
=
'
ps powershell
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushPowerShell.js
'
;
break
;
case
"
py
"
:
case
"
python
"
:
languages
[
i
]
=
'
py python
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushPython.js
'
;
break
;
case
"
rails
"
:
case
"
ror
"
:
case
"
ruby
"
:
case
"
rb
"
:
languages
[
i
]
=
'
ruby rails ror rb
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushRuby.js
'
;
break
;
case
"
sass
"
:
case
"
scss
"
:
languages
[
i
]
=
'
sass scss
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushSass.js
'
;
break
;
case
"
vb
"
:
case
"
vbnet
"
:
languages
[
i
]
=
'
vb vbnet
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushVb.js
'
;
break
;
case
"
xml
"
:
case
"
xhtml
"
:
case
"
xslt
"
:
case
"
html
"
:
languages
[
i
]
=
'
xml xhtml xslt html
'
+
latkeConfig
.
staticServePath
+
'
/js/lib/SyntaxHighlighter/scripts/shBrushXml.js
'
;
break
;
default
:
break
;
}
}
// code high lighter
SyntaxHighlighter
.
autoloader
.
apply
(
null
,
languages
);
SyntaxHighlighter
.
config
.
stripBrs
=
true
;
SyntaxHighlighter
.
all
();
},
/*
* @description 加载 SyntaxHighlighter
* @param {String} SHTheme SyntaxHighLighter 样式
*/
_loadSyntaxHighlighter
:
function
(
SHTheme
)
{
var
cssName
=
SHTheme
?
SHTheme
:
"
shCoreEclipse
"
,
that
=
this
;
// load css
if
(
document
.
createStyleSheet
)
{
document
.
createStyleSheet
(
latkeConfig
.
staticServePath
+
"
/js/lib/SyntaxHighlighter/styles/
"
+
cssName
+
"
.css
"
);
}
else
{
$
(
"
head
"
).
append
(
$
(
"
<link rel='stylesheet' href='
"
+
latkeConfig
.
staticServePath
+
"
/js/lib/SyntaxHighlighter/styles/
"
+
cssName
+
"
.css' type='text/css' charset='utf-8' />
"
));
}
// load js
$
.
ajax
({
url
:
latkeConfig
.
staticServePath
+
"
/js/lib/SyntaxHighlighter/scripts/shCore.js
"
,
dataType
:
"
script
"
,
cache
:
true
,
success
:
function
()
{
// get brush settings
var
languages
=
[],
isScrip
=
false
;
$
(
"
.article-body pre
"
).
each
(
function
()
{
var
name
=
this
.
className
.
split
(
"
;
"
)[
0
];
var
language
=
name
.
substr
(
7
,
name
.
length
-
1
);
if
(
this
.
className
.
indexOf
(
"
html-script: true
"
)
>
-
1
&&
(
language
!==
"
xml
"
&&
language
!==
"
xhtml
"
&&
language
!==
"
xslt
"
&&
language
!=
"
html
"
))
{
isScrip
=
true
;
}
languages
.
push
(
language
);
});
// when html-script is true, need shBrushXml.js
if
(
isScrip
)
{
$
.
ajax
({
url
:
latkeConfig
.
staticServePath
+
"
/js/lib/SyntaxHighlighter/scripts/shBrushXml.js
"
,
dataType
:
"
script
"
,
cache
:
true
,
success
:
function
()
{
that
.
_initSyntaxHighlighter
(
languages
);
}
});
}
else
{
that
.
_initSyntaxHighlighter
(
languages
);
}
}
});
},
/*
* @description 解析语法高亮
* @param {Obj} obj 语法高亮配置参数
* @param {Obj} obj.SHTheme 语法高亮 SyntaxHighLighter 样式
*/
parseLanguage
:
function
(
obj
)
{
var
isPrettify
=
false
,
isSH
=
false
;
$
(
"
.article-body pre
"
).
each
(
function
()
{
if
(
this
.
className
.
indexOf
(
"
brush
"
)
>
-
1
)
{
isSH
=
true
;
}
if
(
this
.
className
.
indexOf
(
"
prettyprint
"
)
>
-
1
)
{
isPrettify
=
true
;
}
});
if
(
isSH
)
{
this
.
_loadSyntaxHighlighter
(
obj
?
(
obj
.
SHTheme
?
obj
.
SHTheme
:
undefined
)
:
undefined
);
}
if
(
isPrettify
)
{
// load css
if
(
document
.
createStyleSheet
)
{
document
.
createStyleSheet
(
latkeConfig
.
staticServePath
+
"
/js/lib/google-code-prettify/prettify.css
"
);
}
else
{
$
(
"
head
"
).
append
(
$
(
"
<link rel='stylesheet' href='
"
+
latkeConfig
.
staticServePath
+
"
/js/lib/google-code-prettify/prettify.css'>
"
));
}
// load js
document
.
write
(
"
<script src=
\"
"
+
latkeConfig
.
staticServePath
+
"
/js/lib/google-code-prettify/prettify.js
\"
><
\
/script>
"
);
// load function
$
(
document
).
ready
(
function
()
{
prettyPrint
();
});
}
},
/*
* @description 文章/自定义页面加载
* @param {Obj} obj 配置设定
* @param {Obj} obj.language 代码高亮配置
*/
load
:
function
(
obj
)
{
var
that
=
this
;
// if login, remove captcha
if
(
$
(
"
#admin
"
).
data
(
"
login
"
))
{
$
(
"
#commentValidate
"
).
parent
().
parent
().
hide
();
}
// emotions
that
.
insertEmotions
();
// language
that
.
parseLanguage
(
obj
?
(
obj
.
language
?
obj
.
language
:
undefined
)
:
undefined
);
// submit comment
$
(
"
#commentValidate
"
).
keypress
(
function
(
event
)
{
if
(
event
.
keyCode
===
13
)
{
that
.
submitComment
();
}
});
// captcha
$
(
"
#captcha
"
).
click
(
function
()
{
$
(
this
).
attr
(
"
src
"
,
latkeConfig
.
servePath
+
"
/captcha.do?code=
"
+
Math
.
random
());
});
// cookie
var
$top
=
$
(
"
#top #admin
"
);
if
(
$top
.
length
===
1
)
{
if
(
$top
.
find
(
"
a
"
).
length
>
2
)
{
Cookie
.
createCookie
(
"
commentName
"
,
$top
.
find
(
"
span
"
).
text
(),
365
);
Cookie
.
createCookie
(
"
commentURL
"
,
window
.
location
.
host
,
365
);
}
}
$
(
"
#commentEmail
"
).
val
(
Cookie
.
readCookie
(
"
commentEmail
"
));
$
(
"
#commentURL
"
).
val
(
Cookie
.
readCookie
(
"
commentURL
"
));
$
(
"
#commentName
"
).
val
(
Cookie
.
readCookie
(
"
commentName
"
));
// if no JSON, add it.
try
{
JSON
}
catch
(
e
)
{
document
.
write
(
"
<script src=
\"
"
+
latkeConfig
.
staticServePath
+
"
/js/lib/json2.js
\"
><
\
/script>
"
);
}
},
/*
* @description 加载随机文章
* @param {String} headTitle 随机文章标题
*/
loadRandomArticles
:
function
(
headTitle
)
{
var
randomArticles1Label
=
this
.
tips
.
randomArticles1Label
;
// getRandomArticles
$
.
ajax
({
url
:
latkeConfig
.
servePath
+
"
/get-random-articles.do
"
,
type
:
"
POST
"
,
success
:
function
(
result
,
textStatus
){
var
randomArticles
=
result
.
randomArticles
;
if
(
!
randomArticles
||
0
===
randomArticles
.
length
)
{
$
(
"
#randomArticles
"
).
remove
();
return
;
}
var
listHtml
=
""
;
for
(
var
i
=
0
;
i
<
randomArticles
.
length
;
i
++
)
{
var
article
=
randomArticles
[
i
];
var
title
=
article
.
articleTitle
;
var
randomArticleLiHtml
=
"
<li>
"
+
"
<a rel='nofollow' title='
"
+
title
+
"
' href='
"
+
article
.
articlePermalink
+
"
'>
"
+
title
+
"
</a></li>
"
;
listHtml
+=
randomArticleLiHtml
;
}
var
titleHTML
=
headTitle
?
headTitle
:
"
<h4>
"
+
randomArticles1Label
+
"
</h4>
"
;
var
randomArticleListHtml
=
titleHTML
+
"
<ul class='marginLeft12'>
"
+
listHtml
+
"
</ul>
"
;
$
(
"
#randomArticles
"
).
append
(
randomArticleListHtml
);
}
});
},
/*
* @description 加载相关文章
* @param {String} id 文章 id
* @param {String} headTitle 相关文章标题
*/
loadRelevantArticles
:
function
(
id
,
headTitle
)
{
$
.
ajax
({
url
:
latkeConfig
.
servePath
+
"
/article/id/
"
+
id
+
"
/relevant/articles
"
,
type
:
"
GET
"
,
success
:
function
(
data
,
textStatus
){
var
articles
=
data
.
relevantArticles
;
if
(
!
articles
||
0
===
articles
.
length
)
{
$
(
"
#relevantArticles
"
).
remove
();
return
;
}
var
listHtml
=
""
;
for
(
var
i
=
0
;
i
<
articles
.
length
;
i
++
)
{
var
article
=
articles
[
i
];
var
title
=
article
.
articleTitle
;
var
articleLiHtml
=
"
<li>
"
+
"
<a rel='nofollow' title='
"
+
title
+
"
' href='
"
+
article
.
articlePermalink
+
"
'>
"
+
title
+
"
</a></li>
"
listHtml
+=
articleLiHtml
}
var
relevantArticleListHtml
=
headTitle
+
"
<ul class='marginLeft12'>
"
+
listHtml
+
"
</ul>
"
;
$
(
"
#relevantArticles
"
).
append
(
relevantArticleListHtml
);
},
error
:
function
()
{
$
(
"
#relevantArticles
"
).
remove
();
}
});
},
/*
* @description 加载站外相关文章
* @param {String} tags 文章 tags
* @param {String} headTitle 站外相关文章标题
*/
loadExternalRelevantArticles
:
function
(
tags
,
headTitle
)
{
var
tips
=
this
.
tips
;
try
{
$
.
ajax
({
url
:
"
http://rhythm.b3log.org:80/get-articles-by-tags.do?tags=
"
+
tags
+
"
&blogHost=
"
+
tips
.
blogHost
+
"
&paginationPageSize=
"
+
tips
.
externalRelevantArticlesDisplayCount
,
type
:
"
GET
"
,
cache
:
true
,
dataType
:
"
jsonp
"
,
error
:
function
(){
$
(
"
#externalRelevantArticles
"
).
remove
();
},
success
:
function
(
data
,
textStatus
){
var
articles
=
data
.
articles
;
if
(
!
articles
||
0
===
articles
.
length
)
{
$
(
"
#externalRelevantArticles
"
).
remove
();
return
;
}
var
listHtml
=
""
;
for
(
var
i
=
0
;
i
<
articles
.
length
;
i
++
)
{
var
article
=
articles
[
i
];
var
title
=
article
.
articleTitle
;
var
articleLiHtml
=
"
<li>
"
+
"
<a rel='nofollow' title='
"
+
title
+
"
' target='_blank' href='
"
+
article
.
articlePermalink
+
"
'>
"
+
title
+
"
</a></li>
"
listHtml
+=
articleLiHtml
}
var
titleHTML
=
headTitle
?
headTitle
:
"
<h4>
"
+
tips
.
externalRelevantArticles1Label
+
"
</h4>
"
;
var
randomArticleListHtml
=
titleHTML
+
"
<ul class='marginLeft12'>
"
+
listHtml
+
"
</ul>
"
;
$
(
"
#externalRelevantArticles
"
).
append
(
randomArticleListHtml
);
}
});
}
catch
(
e
)
{
// 忽略相关文章加载异常:load script error
}
},
/*
* @description 提交评论
* @param {String} commentId 回复评论时的评论 id
* @param {String} state 区分回复文章还是回复评论的标识
*/
submitComment
:
function
(
commentId
,
state
)
{
if
(
!
state
)
{
state
=
''
;
}
var
that
=
this
,
tips
=
this
.
tips
,
type
=
"
article
"
;
if
(
tips
.
externalRelevantArticlesDisplayCount
===
undefined
)
{
type
=
"
page
"
;
}
if
(
this
.
validateComment
(
state
))
{
$
(
"
#submitCommentButton
"
+
state
).
attr
(
"
disabled
"
,
"
disabled
"
);
$
(
"
#commentErrorTip
"
+
state
).
show
().
html
(
this
.
tips
.
loadingLabel
);
var
requestJSONObject
=
{
"
oId
"
:
tips
.
oId
,
"
commentContent
"
:
$
(
"
#comment
"
+
state
).
val
().
replace
(
/
(
^
\s
*
)
|
(\s
*$
)
/g
,
""
),
"
commentEmail
"
:
$
(
"
#commentEmail
"
+
state
).
val
(),
"
commentURL
"
:
Util
.
proessURL
(
$
(
"
#commentURL
"
+
state
).
val
().
replace
(
/
(
^
\s
*
)
|
(\s
*$
)
/g
,
""
)),
"
commentName
"
:
$
(
"
#commentName
"
+
state
).
val
().
replace
(
/
(
^
\s
*
)
|
(\s
*$
)
/g
,
""
),
"
captcha
"
:
$
(
"
#commentValidate
"
+
state
).
val
()
};
if
(
state
===
"
Reply
"
)
{
requestJSONObject
.
commentOriginalCommentId
=
commentId
;
}
$
.
ajax
({
type
:
"
POST
"
,
url
:
latkeConfig
.
servePath
+
"
/add-
"
+
type
+
"
-comment.do
"
,
cache
:
false
,
contentType
:
"
application/json
"
,
data
:
JSON
.
stringify
(
requestJSONObject
),
success
:
function
(
result
){
if
(
!
result
.
sc
)
{
$
(
"
#commentErrorTip
"
+
state
).
html
(
result
.
msg
);
$
(
"
#commentValidate
"
+
state
).
val
(
""
).
focus
();
$
(
"
#submitCommentButton
"
+
state
).
removeAttr
(
"
disabled
"
);
$
(
"
#captcha
"
+
state
).
attr
(
"
src
"
,
latkeConfig
.
servePath
+
"
/captcha.do?code=
"
+
Math
.
random
());
return
;
}
result
.
replyNameHTML
=
""
;
if
(
$
(
"
#commentURL
"
+
state
).
val
().
replace
(
/
\s
/g
,
""
)
===
""
)
{
result
.
replyNameHTML
=
'
<a>
'
+
$
(
"
#commentName
"
+
state
).
val
()
+
'
</a>
'
;
}
else
{
result
.
replyNameHTML
=
'
<a href="
'
+
Util
.
proessURL
(
$
(
"
#commentURL
"
+
state
).
val
())
+
'
" target="_blank">
'
+
$
(
"
#commentName
"
+
state
).
val
()
+
'
</a>
'
;
}
that
.
addCommentAjax
(
addComment
(
result
,
state
),
state
);
$
(
"
#submitCommentButton
"
+
state
).
removeAttr
(
"
disabled
"
);
$
(
"
#captcha
"
+
state
).
attr
(
"
src
"
,
latkeConfig
.
servePath
+
"
/captcha.do?code=
"
+
Math
.
random
());
}
});
Cookie
.
createCookie
(
"
commentName
"
,
requestJSONObject
.
commentName
,
365
);
Cookie
.
createCookie
(
"
commentEmail
"
,
requestJSONObject
.
commentEmail
,
365
);
Cookie
.
createCookie
(
"
commentURL
"
,
$
(
"
#commentURL
"
+
state
).
val
().
replace
(
/
(
^
\s
*
)
|
(\s
*$
)
/g
,
""
),
365
);
}
},
/*
* @description 添加回复评论表单
* @param {String} id 被回复的评论 id
* @param {String} commentFormHTML 评论表单HTML
* @param {String} endHTML 判断该表单使用 table 还是 div 标签,然后进行构造
*/
addReplyForm
:
function
(
id
,
commentFormHTML
,
endHTML
)
{
var
that
=
this
;
if
(
id
===
this
.
currentCommentId
)
{
if
(
Cookie
.
readCookie
(
"
commentName
"
)
===
""
)
{
$
(
"
#commentNameReply
"
).
focus
();
}
else
{
$
(
"
#commentReply
"
).
focus
();
}
return
;
}
else
{
$
(
"
#replyForm
"
).
remove
();
endHTML
=
endHTML
?
endHTML
:
""
;
if
(
endHTML
===
"
</div>
"
)
{
$
(
"
#
"
+
id
).
append
(
commentFormHTML
+
$
(
"
#commentForm
"
).
html
()
+
endHTML
);
}
else
{
$
(
"
#
"
+
id
).
append
(
commentFormHTML
+
$
(
"
#commentForm
"
).
html
()
+
"
</table>
"
+
endHTML
);
}
// change id, bind event and set value
$
(
"
#replyForm input, #replyForm textarea
"
).
each
(
function
()
{
this
.
id
=
this
.
id
+
"
Reply
"
;
});
$
(
"
#commentNameReply
"
).
val
(
Cookie
.
readCookie
(
"
commentName
"
));
$
(
"
#commentEmailReply
"
).
val
(
Cookie
.
readCookie
(
"
commentEmail
"
));
var
$label
=
$
(
"
#replyForm #commentURLLabel
"
);
if
(
$label
.
length
===
1
)
{
$label
.
attr
(
"
id
"
,
"
commentURLLabelReply
"
);
}
$
(
"
#commentURLReply
"
).
val
(
Cookie
.
readCookie
(
"
commentURL
"
));
$
(
"
#replyForm #emotions
"
).
attr
(
"
id
"
,
"
emotionsReply
"
);
this
.
insertEmotions
(
"
Reply
"
);
$
(
"
#commentValidateReply
"
).
unbind
().
keypress
(
function
(
event
)
{
if
(
event
.
keyCode
===
13
)
{
that
.
submitComment
(
id
,
'
Reply
'
);
event
.
preventDefault
();
}
});
$
(
"
#replyForm #captcha
"
).
attr
(
"
id
"
,
"
captchaReply
"
).
attr
(
"
src
"
,
latkeConfig
.
servePath
+
"
/captcha.do?
"
+
new
Date
().
getTime
()).
click
(
function
()
{
$
(
this
).
attr
(
"
src
"
,
latkeConfig
.
servePath
+
"
/captcha.do?code=
"
+
Math
.
random
());
});
$
(
"
#replyForm #commentErrorTip
"
).
attr
(
"
id
"
,
"
commentErrorTipReply
"
).
html
(
""
).
hide
();
$
(
"
#replyForm #submitCommentButton
"
).
attr
(
"
id
"
,
"
submitCommentButtonReply
"
);
$
(
"
#replyForm #submitCommentButtonReply
"
).
unbind
(
"
click
"
).
removeAttr
(
"
onclick
"
).
click
(
function
()
{
that
.
submitComment
(
id
,
'
Reply
'
);
});
if
(
Cookie
.
readCookie
(
"
commentName
"
)
===
""
)
{
$
(
"
#commentNameReply
"
).
focus
();
}
else
{
$
(
"
#commentReply
"
).
focus
();
}
}
this
.
currentCommentId
=
id
;
},
/*
* @description 隐藏回复评论的浮出层
* @parma {String} id 被回复的评论 id
*/
hideComment
:
function
(
id
)
{
$
(
"
#commentRef
"
+
id
).
hide
();
},
/*
* @description 显示回复评论的浮出层
* @parma {Dom} it 触发事件的 dom
* @param {String} id 被回复的评论 id
* @param {Int} top 位置相对浮出层的高度
* @param {String} [parentTag] it 如果嵌入在 position 为 relative 的元素 A 中时,需取到 A 元素
*/
showComment
:
function
(
it
,
id
,
top
,
parentTag
)
{
var
positionTop
=
parseInt
(
$
(
it
).
position
().
top
);
if
(
parentTag
)
{
positionTop
=
parseInt
(
$
(
it
).
parents
(
parentTag
).
position
().
top
);
}
if
(
$
(
"
#commentRef
"
+
id
).
length
>
0
)
{
// 此处重复设置 top 是由于评论为异步,原有回复评论的显示位置应往下移动
$
(
"
#commentRef
"
+
id
).
show
().
css
(
"
top
"
,
(
positionTop
+
top
)
+
"
px
"
);
}
else
{
var
$refComment
=
$
(
"
#
"
+
id
).
clone
();
$refComment
.
addClass
(
"
comment-body-ref
"
).
attr
(
"
id
"
,
"
commentRef
"
+
id
);
$refComment
.
find
(
"
#replyForm
"
).
remove
();
$
(
"
#comments
"
).
append
(
$refComment
);
$
(
"
#commentRef
"
+
id
).
css
(
"
top
"
,
(
positionTop
+
top
)
+
"
px
"
);
}
},
/*
* @description 回复不刷新,将回复内容异步添加到评论列表中
* @parma {String} commentHTML 回复内容 HTML
* @param {String} state 用于区分评论文章还是回复评论
*/
addCommentAjax
:
function
(
commentHTML
,
state
)
{
if
(
$
(
"
#comments
"
).
children
().
length
>
0
)
{
$
(
$
(
"
#comments
"
).
children
()[
0
]).
before
(
commentHTML
);
}
else
{
$
(
"
#comments
"
).
html
(
commentHTML
);
}
if
(
state
===
""
)
{
$
(
"
#commentErrorTip
"
).
html
(
""
).
hide
();
$
(
"
#comment
"
).
val
(
""
);
$
(
"
#commentValidate
"
).
val
(
""
);
$
(
"
#captcha
"
).
attr
(
"
src
"
,
latkeConfig
.
servePath
+
"
/captcha.do?code=
"
+
Math
.
random
());
}
else
{
$
(
"
#replyForm
"
).
remove
();
}
window
.
location
.
hash
=
"
#comments
"
;
}
});
\ No newline at end of file
war/src/main/webapp/skins/mobile/themes/core/core.js
View file @
e3088d67
...
...
@@ -5,134 +5,161 @@
var
$wpt
=
jQuery
.
noConflict
();
if
(
(
navigator
.
platform
==
'
iPhone
'
||
navigator
.
platform
==
'
iPod
'
)
&&
typeof
orientation
!=
'
undefined
'
)
{
var
touchStartOrClick
=
'
touchstart
'
;
var
touchStartOrClick
=
'
touchstart
'
;
}
else
{
var
touchStartOrClick
=
'
click
'
;
var
touchStartOrClick
=
'
click
'
;
};
/* Try to get out of frames! */
if
(
window
.
top
!=
window
.
self
)
{
window
.
top
.
location
=
self
.
location
.
href
window
.
top
.
location
=
self
.
location
.
href
}
$wpt
.
fn
.
wptouchFadeToggle
=
function
(
speed
,
easing
,
callback
)
{
return
this
.
animate
(
{
opacity
:
'
toggle
'
},
speed
,
easing
,
callback
);
return
this
.
animate
(
{
opacity
:
'
toggle
'
},
speed
,
easing
,
callback
);
};
/**
* @description Cookie 相关操作
* @static
*/
var
Cookie
=
{
/**
* @description 读取 cookie
* @param {String} name cookie key
* @returns {String} 对应 key 的值,如 key 不存在则返回 ""
*/
readCookie
:
function
(
name
)
{
var
nameEQ
=
name
+
"
=
"
;
var
ca
=
document
.
cookie
.
split
(
'
;
'
);
for
(
var
i
=
0
;
i
<
ca
.
length
;
i
++
)
{
var
c
=
ca
[
i
];
while
(
c
.
charAt
(
0
)
==
'
'
)
c
=
c
.
substring
(
1
,
c
.
length
);
if
(
c
.
indexOf
(
nameEQ
)
==
0
)
return
c
.
substring
(
nameEQ
.
length
,
c
.
length
);
if
(
c
.
indexOf
(
nameEQ
)
==
0
)
return
decodeURIComponent
(
c
.
substring
(
nameEQ
.
length
,
c
.
length
)
);
}
return
""
;
},
/**
* @description 清除 Cookie
* @param {String} name 清除 key 为 name 的该条 Cookie
*/
eraseCookie
:
function
(
name
)
{
this
.
createCookie
(
name
,
""
,
-
1
);
},
createCookie
:
function
(
name
,
value
,
days
)
{
/**
* @description 创建 Cookie
* @param {String} name 每条 Cookie 唯一的 key
* @param {String} value 每条 Cookie 对应的值,将被 UTF-8 编码
* @param {Int} days Cookie 保存时间
*/
createCookie
:
function
(
name
,
value
,
days
)
{
var
expires
=
""
;
if
(
days
)
{
var
date
=
new
Date
();
date
.
setTime
(
date
.
getTime
()
+
(
days
*
24
*
60
*
60
*
1000
));
expires
=
"
; expires=
"
+
date
.
toGMTString
();
}
document
.
cookie
=
name
+
"
=
"
+
value
+
expires
+
"
; path=/
"
;
document
.
cookie
=
name
+
"
=
"
+
encodeURIComponent
(
value
)
+
expires
+
"
; path=/
"
;
}
};
function
wptouch_switch_confirmation
(
skin
,
e
)
{
if
(
document
.
cookie
&&
document
.
cookie
.
indexOf
(
'
btouch_switch_toggle
'
)
>
-
1
)
{
// just switch
Cookie
.
createCookie
(
"
btouch_switch_toggle
"
,
skin
,
365
);
$wpt
(
'
a#switch-link
'
).
toggleClass
(
'
offimg
'
);
setTimeout
(
'
switch_delayer()
'
,
1250
);
}
else
{
// ask first
Cookie
.
createCookie
(
"
btouch_switch_toggle
"
,
skin
,
365
);
if
(
confirm
(
"
Switch to regular view?
\n
\n
You can switch back again in the top bar.
"
)
)
{
$wpt
(
'
a#switch-link
'
).
toggleClass
(
'
offimg
'
);
setTimeout
(
'
switch_delayer()
'
,
1350
);
}
else
{
e
.
preventDefault
();
e
.
stopImmediatePropagation
();
}
}
if
(
document
.
cookie
&&
document
.
cookie
.
indexOf
(
'
btouch_switch_toggle
'
)
>
-
1
)
{
// just switch
Cookie
.
createCookie
(
"
btouch_switch_toggle
"
,
skin
,
365
);
$wpt
(
'
a#switch-link
'
).
toggleClass
(
'
offimg
'
);
setTimeout
(
'
switch_delayer()
'
,
1250
);
}
else
{
// ask first
Cookie
.
createCookie
(
"
btouch_switch_toggle
"
,
skin
,
365
);
if
(
confirm
(
"
Switch to regular view?
\n
\n
You can switch back again in the top bar.
"
)
)
{
$wpt
(
'
a#switch-link
'
).
toggleClass
(
'
offimg
'
);
setTimeout
(
'
switch_delayer()
'
,
1350
);
}
else
{
e
.
preventDefault
();
e
.
stopImmediatePropagation
();
}
}
}
if
(
$wpt
(
'
#prowl-success
'
).
length
)
{
setTimeout
(
function
()
{
$wpt
(
'
#prowl-success
'
).
fadeOut
(
350
);
},
5250
);
setTimeout
(
function
()
{
$wpt
(
'
#prowl-success
'
).
fadeOut
(
350
);
},
5250
);
}
if
(
$wpt
(
'
#prowl-fail
'
).
length
)
{
setTimeout
(
function
()
{
$wpt
(
'
#prowl-fail
'
).
fadeOut
(
350
);
},
5250
);
setTimeout
(
function
()
{
$wpt
(
'
#prowl-fail
'
).
fadeOut
(
350
);
},
5250
);
}
$wpt
(
function
()
{
var
tabContainers
=
$wpt
(
'
#menu-head > ul
'
);
$wpt
(
'
#tabnav a
'
).
bind
(
touchStartOrClick
,
function
()
{
tabContainers
.
hide
().
filter
(
this
.
hash
).
show
();
$wpt
(
'
#tabnav a
'
).
removeClass
(
'
selected
'
);
$wpt
(
this
).
addClass
(
'
selected
'
);
$wpt
(
'
#tabnav a
'
).
removeClass
(
'
selected
'
);
$wpt
(
this
).
addClass
(
'
selected
'
);
return
false
;
}).
filter
(
'
:first
'
).
trigger
(
touchStartOrClick
);
});
function
bnc_showhide_coms_toggle
()
{
$wpt
(
'
#commentlist
'
).
wptouchFadeToggle
(
350
);
$wpt
(
'
img#com-arrow
'
).
toggleClass
(
'
com-arrow-down
'
);
$wpt
(
'
h3#com-head
'
).
toggleClass
(
'
comhead-open
'
);
$wpt
(
'
#commentlist
'
).
wptouchFadeToggle
(
350
);
$wpt
(
'
img#com-arrow
'
).
toggleClass
(
'
com-arrow-down
'
);
$wpt
(
'
h3#com-head
'
).
toggleClass
(
'
comhead-open
'
);
}
function
doWPtouchReady
()
{
$wpt
(
'
#headerbar-menu a
'
).
bind
(
touchStartOrClick
,
function
(
e
){
$wpt
(
'
#wptouch-menu
'
).
wptouchFadeToggle
(
350
);
$wpt
(
'
#headerbar-menu a
'
).
toggleClass
(
'
open
'
);
});
$wpt
(
'
#headerbar-menu a
'
).
bind
(
touchStartOrClick
,
function
(
e
){
$wpt
(
'
#wptouch-menu
'
).
wptouchFadeToggle
(
350
);
$wpt
(
'
#headerbar-menu a
'
).
toggleClass
(
'
open
'
);
});
$wpt
(
'
a#searchopen, #wptouch-search-inner a
'
).
bind
(
touchStartOrClick
,
function
(
e
){
$wpt
(
'
#wptouch-search
'
).
wptouchFadeToggle
(
350
);
});
$wpt
(
'
a#searchopen, #wptouch-search-inner a
'
).
bind
(
touchStartOrClick
,
function
(
e
){
$wpt
(
'
#wptouch-search
'
).
wptouchFadeToggle
(
350
);
});
$wpt
(
'
a#prowlopen
'
).
bind
(
touchStartOrClick
,
function
(
e
){
$wpt
(
'
#prowl-message
'
).
wptouchFadeToggle
(
350
);
});
$wpt
(
'
a#prowlopen
'
).
bind
(
touchStartOrClick
,
function
(
e
){
$wpt
(
'
#prowl-message
'
).
wptouchFadeToggle
(
350
);
});
$wpt
(
'
a#wordtwitopen
'
).
bind
(
touchStartOrClick
,
function
(
e
){
$wpt
(
'
#wptouch-wordtwit
'
).
wptouchFadeToggle
(
350
);
});
$wpt
(
'
a#wordtwitopen
'
).
bind
(
touchStartOrClick
,
function
(
e
){
$wpt
(
'
#wptouch-wordtwit
'
).
wptouchFadeToggle
(
350
);
});
$wpt
(
'
a#gigpressopen
'
).
bind
(
touchStartOrClick
,
function
(
e
){
$wpt
(
'
#wptouch-gigpress
'
).
wptouchFadeToggle
(
350
);
});
$wpt
(
'
a#gigpressopen
'
).
bind
(
touchStartOrClick
,
function
(
e
){
$wpt
(
'
#wptouch-gigpress
'
).
wptouchFadeToggle
(
350
);
});
$wpt
(
'
a#loginopen, #wptouch-login-inner a
'
).
bind
(
touchStartOrClick
,
function
(
e
){
$wpt
(
'
#wptouch-login
'
).
wptouchFadeToggle
(
350
);
});
$wpt
(
'
a#loginopen, #wptouch-login-inner a
'
).
bind
(
touchStartOrClick
,
function
(
e
){
$wpt
(
'
#wptouch-login
'
).
wptouchFadeToggle
(
350
);
});
$wpt
(
'
a#obook
'
).
bind
(
touchStartOrClick
,
function
()
{
$wpt
(
'
#bookmark-box
'
).
wptouchFadeToggle
(
350
);
});
$wpt
(
'
a#obook
'
).
bind
(
touchStartOrClick
,
function
()
{
$wpt
(
'
#bookmark-box
'
).
wptouchFadeToggle
(
350
);
});
$wpt
(
'
.singlentry img, .singlentry .wp-caption
'
).
each
(
function
()
{
if
(
$wpt
(
this
).
width
()
<=
250
)
{
$wpt
(
this
).
addClass
(
'
aligncenter
'
);
}
});
$wpt
(
'
.singlentry img, .singlentry .wp-caption
'
).
each
(
function
()
{
if
(
$wpt
(
this
).
width
()
<=
250
)
{
$wpt
(
this
).
addClass
(
'
aligncenter
'
);
}
});
if
(
$wpt
(
'
#FollowMeTabLeftSm
'
).
length
)
{
$wpt
(
'
#FollowMeTabLeftSm
'
).
remove
();
}
if
(
$wpt
(
'
#FollowMeTabLeftSm
'
).
length
)
{
$wpt
(
'
#FollowMeTabLeftSm
'
).
remove
();
}
$wpt
(
'
.post
'
).
fitVids
();
$wpt
(
'
.post
'
).
fitVids
();
}
$wpt
(
document
).
ready
(
function
()
{
doWPtouchReady
();
}
);
$wpt
(
document
).
ready
(
function
()
{
doWPtouchReady
();
}
);
/*!
* FitVids 1.0
...
...
@@ -142,14 +169,14 @@ $wpt( document ).ready( function() { doWPtouchReady(); } );
* Date: Thu Sept 01 18:00:00 2011 -0500
*/
(
function
(
$
){
$
.
fn
.
fitVids
=
function
(
options
)
{
var
settings
=
{
customSelector
:
null
}
var
div
=
document
.
createElement
(
'
div
'
),
ref
=
document
.
getElementsByTagName
(
'
base
'
)[
0
]
||
document
.
getElementsByTagName
(
'
script
'
)[
0
];
div
.
className
=
'
fit-vids-style
'
;
div
.
innerHTML
=
'
­<style>
\
$
.
fn
.
fitVids
=
function
(
options
)
{
var
settings
=
{
customSelector
:
null
}
var
div
=
document
.
createElement
(
'
div
'
),
ref
=
document
.
getElementsByTagName
(
'
base
'
)[
0
]
||
document
.
getElementsByTagName
(
'
script
'
)[
0
];
div
.
className
=
'
fit-vids-style
'
;
div
.
innerHTML
=
'
­<style>
\
.fluid-width-video-wrapper {
\
width: 100%;
\
position: relative;
\
...
...
@@ -166,29 +193,29 @@ width: 100%; \
height: 100%;
\
}
\
</style>
'
;
ref
.
parentNode
.
insertBefore
(
div
,
ref
);
if
(
options
)
{
$
.
extend
(
settings
,
options
);
}
return
this
.
each
(
function
(){
var
selectors
=
[
"
iframe[src^='http://player.vimeo.com']
"
,
"
iframe[src^='http://www.youtube.com']
"
,
"
iframe[src^='http://www.kickstarter.com']
"
,
"
object
"
,
"
embed
"
];
if
(
settings
.
customSelector
)
{
selectors
.
push
(
settings
.
customSelector
);
}
var
$allVideos
=
$
(
this
).
find
(
selectors
.
join
(
'
,
'
));
$allVideos
.
each
(
function
(){
var
$this
=
$
(
this
),
height
=
this
.
tagName
==
'
OBJECT
'
?
$this
.
attr
(
'
height
'
)
:
$this
.
height
(),
aspectRatio
=
height
/
$this
.
width
();
$this
.
wrap
(
'
<div class="fluid-width-video-wrapper" />
'
).
parent
(
'
.fluid-width-video-wrapper
'
).
css
(
'
padding-top
'
,
(
aspectRatio
*
100
)
+
"
%
"
);
$this
.
removeAttr
(
'
height
'
).
removeAttr
(
'
width
'
);
});
});
}
ref
.
parentNode
.
insertBefore
(
div
,
ref
);
if
(
options
)
{
$
.
extend
(
settings
,
options
);
}
return
this
.
each
(
function
(){
var
selectors
=
[
"
iframe[src^='http://player.vimeo.com']
"
,
"
iframe[src^='http://www.youtube.com']
"
,
"
iframe[src^='http://www.kickstarter.com']
"
,
"
object
"
,
"
embed
"
];
if
(
settings
.
customSelector
)
{
selectors
.
push
(
settings
.
customSelector
);
}
var
$allVideos
=
$
(
this
).
find
(
selectors
.
join
(
'
,
'
));
$allVideos
.
each
(
function
(){
var
$this
=
$
(
this
),
height
=
this
.
tagName
==
'
OBJECT
'
?
$this
.
attr
(
'
height
'
)
:
$this
.
height
(),
aspectRatio
=
height
/
$this
.
width
();
$this
.
wrap
(
'
<div class="fluid-width-video-wrapper" />
'
).
parent
(
'
.fluid-width-video-wrapper
'
).
css
(
'
padding-top
'
,
(
aspectRatio
*
100
)
+
"
%
"
);
$this
.
removeAttr
(
'
height
'
).
removeAttr
(
'
width
'
);
});
});
}
})(
jQuery
);
\ No newline at end of file
war/src/main/webapp/top-bar.ftl
View file @
e3088d67
...
...
@@ -68,7 +68,7 @@
B3log Solo
</a>
<span class="left"> ${onlineVisitor1Label}${onlineVisitorCnt}</span>
<span class="right" id="admin">
<span class="right" id="admin"
data-login="${isLoggedIn?string}"
>
<#if isLoggedIn>
<span>${userName}</span>
<#if isAdmin>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment