Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
syncEnrollments
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
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
Yeray Santana Hualde
syncEnrollments
Commits
902e8c75
Commit
902e8c75
authored
Apr 02, 2012
by
Taylor Otwell
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #479 from daylerees/docs-template
Offline Docs Template
parents
d41b1db7
2c459547
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
1832 additions
and
2 deletions
+1832
-2
bundles.php
application/bundles.php
+7
-1
routes.php
application/routes.php
+1
-1
style.css
bundles/docs/public/css/style.css
+231
-0
logoback.png
bundles/docs/public/img/logoback.png
+0
-0
modernizr-2.5.3.min.js
bundles/docs/public/js/modernizr-2.5.3.min.js
+4
-0
prettify.js
bundles/docs/public/js/prettify.js
+1477
-0
routes.php
bundles/docs/routes.php
+15
-0
home.blade.php
bundles/docs/views/home.blade.php
+35
-0
menu.blade.php
bundles/docs/views/menu.blade.php
+28
-0
template.blade.php
bundles/docs/views/template.blade.php
+34
-0
No files found.
application/bundles.php
View file @
902e8c75
...
@@ -33,4 +33,10 @@
...
@@ -33,4 +33,10 @@
|
|
*/
*/
return
array
();
return
array
(
\ No newline at end of file
// route the official docs
'docs'
=>
array
(
'handles'
=>
'docs'
),
);
\ No newline at end of file
application/routes.php
View file @
902e8c75
...
@@ -35,7 +35,7 @@
...
@@ -35,7 +35,7 @@
Route
::
get
(
'/'
,
function
()
Route
::
get
(
'/'
,
function
()
{
{
return
View
::
make
(
'home.index
'
);
return
Redirect
::
to
(
'docs
'
);
});
});
/*
/*
...
...
bundles/docs/public/css/style.css
0 → 100644
View file @
902e8c75
@import
url(http://fonts.googleapis.com/css?family=Droid+Sans)
;
article
,
aside
,
details
,
figcaption
,
figure
,
footer
,
header
,
hgroup
,
nav
,
section
{
display
:
block
;
}
audio
,
canvas
,
video
{
display
:
inline-block
;
*
display
:
inline
;
*
zoom
:
1
;
}
audio
:not
([
controls
])
{
display
:
none
;
}
[
hidden
]
{
display
:
none
;
}
html
{
font-size
:
100%
;
-webkit-text-size-adjust
:
100%
;
-ms-text-size-adjust
:
100%
;
}
html
,
button
,
input
,
select
,
textarea
{
font-family
:
sans-serif
;
color
:
#222
;
}
body
{
margin
:
0
;
font-size
:
1em
;
line-height
:
1.4
;
}
::-moz-selection
{
background
:
#E37B52
;
color
:
#fff
;
text-shadow
:
none
;
}
::selection
{
background
:
#E37B52
;
color
:
#fff
;
text-shadow
:
none
;
}
a
{
color
:
#00e
;
}
a
:visited
{
color
:
#551a8b
;
}
a
:hover
{
color
:
#06e
;
}
a
:focus
{
outline
:
thin
dotted
;
}
a
:hover
,
a
:active
{
outline
:
0
;
}
abbr
[
title
]
{
border-bottom
:
1px
dotted
;
}
b
,
strong
{
font-weight
:
bold
;
}
blockquote
{
margin
:
1em
40px
;
}
dfn
{
font-style
:
italic
;
}
hr
{
display
:
block
;
height
:
1px
;
border
:
0
;
border-top
:
1px
solid
#ccc
;
margin
:
1em
0
;
padding
:
0
;
}
ins
{
background
:
#ff9
;
color
:
#000
;
text-decoration
:
none
;
}
mark
{
background
:
#ff0
;
color
:
#000
;
font-style
:
italic
;
font-weight
:
bold
;
}
pre
,
code
,
kbd
,
samp
{
font-family
:
monospace
,
serif
;
_font-family
:
'courier new'
,
monospace
;
font-size
:
1em
;
}
pre
{
white-space
:
pre
;
white-space
:
pre-wrap
;
word-wrap
:
break-word
;
}
q
{
quotes
:
none
;
}
q
:before
,
q
:after
{
content
:
""
;
content
:
none
;
}
small
{
font-size
:
85%
;
}
sub
,
sup
{
font-size
:
75%
;
line-height
:
0
;
position
:
relative
;
vertical-align
:
baseline
;
}
sup
{
top
:
-0.5em
;
}
sub
{
bottom
:
-0.25em
;
}
ul
,
ol
{
margin
:
1em
0
;
padding
:
0
0
0
40px
;
}
dd
{
margin
:
0
0
0
40px
;
}
nav
ul
,
nav
ol
{
list-style
:
none
;
list-style-image
:
none
;
margin
:
0
;
padding
:
0
;
}
img
{
border
:
0
;
-ms-interpolation-mode
:
bicubic
;
vertical-align
:
middle
;
}
svg
:not
(
:root
)
{
overflow
:
hidden
;
}
figure
{
margin
:
0
;
}
form
{
margin
:
0
;
}
fieldset
{
border
:
0
;
margin
:
0
;
padding
:
0
;
}
label
{
cursor
:
pointer
;
}
legend
{
border
:
0
;
*
margin-left
:
-7px
;
padding
:
0
;
white-space
:
normal
;
}
button
,
input
,
select
,
textarea
{
font-size
:
100%
;
margin
:
0
;
vertical-align
:
baseline
;
*
vertical-align
:
middle
;
}
button
,
input
{
line-height
:
normal
;
}
button
,
input
[
type
=
"button"
],
input
[
type
=
"reset"
],
input
[
type
=
"submit"
]
{
cursor
:
pointer
;
-webkit-appearance
:
button
;
*
overflow
:
visible
;
}
button
[
disabled
],
input
[
disabled
]
{
cursor
:
default
;
}
input
[
type
=
"checkbox"
],
input
[
type
=
"radio"
]
{
box-sizing
:
border-box
;
padding
:
0
;
*
width
:
13px
;
*
height
:
13px
;
}
input
[
type
=
"search"
]
{
-webkit-appearance
:
textfield
;
-moz-box-sizing
:
content-box
;
-webkit-box-sizing
:
content-box
;
box-sizing
:
content-box
;
}
input
[
type
=
"search"
]
::-webkit-search-decoration
,
input
[
type
=
"search"
]
::-webkit-search-cancel-button
{
-webkit-appearance
:
none
;
}
button
::-moz-focus-inner
,
input
::-moz-focus-inner
{
border
:
0
;
padding
:
0
;
}
textarea
{
overflow
:
auto
;
vertical-align
:
top
;
resize
:
vertical
;
}
input
:valid
,
textarea
:valid
{
}
input
:invalid
,
textarea
:invalid
{
background-color
:
#f0dddd
;
}
table
{
border-collapse
:
collapse
;
border-spacing
:
0
;
}
td
{
vertical-align
:
top
;
}
body
{
font-family
:
'Droid Sans'
,
sans-serif
;
font-size
:
11pt
;
color
:
#555
;
}
.wrapper
{
width
:
760px
;
margin
:
2em
auto
;
}
.wrapper
>
header
{
border-bottom
:
1px
solid
#eee
;
background-image
:
url(../img/logoback.png)
;
background-repeat
:
no-repeat
;
background-position
:
right
;
text-shadow
:
1px
1px
0px
#fff
;
}
.wrapper
>
header
h1
{
color
:
#222
;
margin
:
0
;
}
.wrapper
>
header
h2
{
margin
:
0
;
color
:
#888
;
}
.slogan
{
font-size
:
0.8em
;
}
.main
{
overflow
:
hidden
;
}
.sidebar
{
width
:
180px
;
float
:
left
;
font-size
:
0.9em
;
}
.content
{
width
:
540px
;
float
:
right
;
border-left
:
1px
solid
#eee
;
padding-left
:
1.5em
;
}
a
,
a
:visited
{
color
:
#2972A3
;
text-decoration
:
none
;
}
a
:hover
{
color
:
#72ADD4
;
text-decoration
:
underline
;
}
.menu
{
list-style-type
:
none
;
margin
:
0
;
padding
:
0
;
}
.menu
ul
{
list-style-type
:
none
;
padding-left
:
1em
;
margin
:
0
;
}
.menu
ul
li
:before
{
content
:
"\2013"
;
text-decoration
:
none
;
color
:
#777
;
margin-right
:
0.2em
;
}
pre
,
code
{
font-family
:
Monaco
,
"Bitstream Vera Sans Mono"
,
"Lucida Console"
,
Terminal
,
monospace
;
}
pre
{
border
:
1px
solid
#eee
;
padding
:
0.5em
1em
;
font-size
:
0.8em
;
background-color
:
#f5f5f5
;
text-shadow
:
1px
1px
0
#fff
;
line-height
:
1.7em
;
}
code
{
background-color
:
#FFE5DB
;
font-size
:
0.8em
;
display
:
inline-block
;
padding
:
0.2em
0.4em
;
text-shadow
:
1px
1px
0
#fff
;
}
/* Prettify Styles -------------- */
.com
{
color
:
#93a1a1
;
}
.lit
{
color
:
#195f91
;
}
.pun
,
.opn
,
.clo
{
color
:
#93a1a1
;
}
.fun
{
color
:
#dc322f
;
}
.str
,
.atv
{
color
:
#D14
;
}
.kwd
,
.linenums
.tag
{
color
:
#1e347b
;
}
.typ
,
.atn
,
.dec
,
.var
{
color
:
teal
;
}
.pln
{
color
:
#48484c
;
}
.prettyprint
{
padding
:
0
;
text-shadow
:
1px
1px
0
#fff
;
}
.prettyprint
ol
{
color
:
#ccc
;
}
/* end ------------------------ */
@media
print
{
*
{
background
:
transparent
!important
;
color
:
black
!important
;
box-shadow
:
none
!important
;
text-shadow
:
none
!important
;
filter
:
none
!important
;
-ms-filter
:
none
!important
;
}
a
,
a
:visited
{
text-decoration
:
underline
;
}
a
[
href
]
:after
{
content
:
" ("
attr
(
href
)
")"
;
}
abbr
[
title
]
:after
{
content
:
" ("
attr
(
title
)
")"
;
}
.ir
a
:after
,
a
[
href
^=
"javascript:"
]
:after
,
a
[
href
^=
"#"
]
:after
{
content
:
""
;
}
pre
,
blockquote
{
border
:
1px
solid
#999
;
page-break-inside
:
avoid
;
}
thead
{
display
:
table-header-group
;
}
tr
,
img
{
page-break-inside
:
avoid
;
}
img
{
max-width
:
100%
!important
;
}
@page
{
margin
:
0.5cm
;
}
p
,
h2
,
h3
{
orphans
:
3
;
widows
:
3
;
}
h2
,
h3
{
page-break-after
:
avoid
;
}
}
bundles/docs/public/img/logoback.png
0 → 100644
View file @
902e8c75
8.28 KB
bundles/docs/public/js/modernizr-2.5.3.min.js
0 → 100644
View file @
902e8c75
/* Modernizr 2.5.3 (Custom Build) | MIT & BSD
* Build: http://www.modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load
*/
;
window
.
Modernizr
=
function
(
a
,
b
,
c
){
function
D
(
a
){
j
.
cssText
=
a
}
function
E
(
a
,
b
){
return
D
(
n
.
join
(
a
+
";"
)
+
(
b
||
""
))}
function
F
(
a
,
b
){
return
typeof
a
===
b
}
function
G
(
a
,
b
){
return
!!~
(
""
+
a
).
indexOf
(
b
)}
function
H
(
a
,
b
){
for
(
var
d
in
a
)
if
(
j
[
a
[
d
]]
!==
c
)
return
b
==
"pfx"
?
a
[
d
]:
!
0
;
return
!
1
}
function
I
(
a
,
b
,
d
){
for
(
var
e
in
a
){
var
f
=
b
[
a
[
e
]];
if
(
f
!==
c
)
return
d
===!
1
?
a
[
e
]:
F
(
f
,
"function"
)?
f
.
bind
(
d
||
b
):
f
}
return
!
1
}
function
J
(
a
,
b
,
c
){
var
d
=
a
.
charAt
(
0
).
toUpperCase
()
+
a
.
substr
(
1
),
e
=
(
a
+
" "
+
p
.
join
(
d
+
" "
)
+
d
).
split
(
" "
);
return
F
(
b
,
"string"
)
||
F
(
b
,
"undefined"
)?
H
(
e
,
b
):(
e
=
(
a
+
" "
+
q
.
join
(
d
+
" "
)
+
d
).
split
(
" "
),
I
(
e
,
b
,
c
))}
function
L
(){
e
.
input
=
function
(
c
){
for
(
var
d
=
0
,
e
=
c
.
length
;
d
<
e
;
d
++
)
u
[
c
[
d
]]
=
c
[
d
]
in
k
;
return
u
.
list
&&
(
u
.
list
=!!
b
.
createElement
(
"datalist"
)
&&!!
a
.
HTMLDataListElement
),
u
}(
"autocomplete autofocus list placeholder max min multiple pattern required step"
.
split
(
" "
)),
e
.
inputtypes
=
function
(
a
){
for
(
var
d
=
0
,
e
,
f
,
h
,
i
=
a
.
length
;
d
<
i
;
d
++
)
k
.
setAttribute
(
"type"
,
f
=
a
[
d
]),
e
=
k
.
type
!==
"text"
,
e
&&
(
k
.
value
=
l
,
k
.
style
.
cssText
=
"position:absolute;visibility:hidden;"
,
/^range$/
.
test
(
f
)
&&
k
.
style
.
WebkitAppearance
!==
c
?(
g
.
appendChild
(
k
),
h
=
b
.
defaultView
,
e
=
h
.
getComputedStyle
&&
h
.
getComputedStyle
(
k
,
null
).
WebkitAppearance
!==
"textfield"
&&
k
.
offsetHeight
!==
0
,
g
.
removeChild
(
k
)):
/^
(
search|tel
)
$/
.
test
(
f
)
||
(
/^
(
url|email
)
$/
.
test
(
f
)?
e
=
k
.
checkValidity
&&
k
.
checkValidity
()
===!
1
:
/^color$/
.
test
(
f
)?(
g
.
appendChild
(
k
),
g
.
offsetWidth
,
e
=
k
.
value
!=
l
,
g
.
removeChild
(
k
)):
e
=
k
.
value
!=
l
)),
t
[
a
[
d
]]
=!!
e
;
return
t
}(
"search tel url email datetime date month week time datetime-local number range color"
.
split
(
" "
))}
var
d
=
"2.5.3"
,
e
=
{},
f
=!
0
,
g
=
b
.
documentElement
,
h
=
"modernizr"
,
i
=
b
.
createElement
(
h
),
j
=
i
.
style
,
k
=
b
.
createElement
(
"input"
),
l
=
":)"
,
m
=
{}.
toString
,
n
=
" -webkit- -moz- -o- -ms- "
.
split
(
" "
),
o
=
"Webkit Moz O ms"
,
p
=
o
.
split
(
" "
),
q
=
o
.
toLowerCase
().
split
(
" "
),
r
=
{
svg
:
"http://www.w3.org/2000/svg"
},
s
=
{},
t
=
{},
u
=
{},
v
=
[],
w
=
v
.
slice
,
x
,
y
=
function
(
a
,
c
,
d
,
e
){
var
f
,
i
,
j
,
k
=
b
.
createElement
(
"div"
),
l
=
b
.
body
,
m
=
l
?
l
:
b
.
createElement
(
"body"
);
if
(
parseInt
(
d
,
10
))
while
(
d
--
)
j
=
b
.
createElement
(
"div"
),
j
.
id
=
e
?
e
[
d
]:
h
+
(
d
+
1
),
k
.
appendChild
(
j
);
return
f
=
[
"­"
,
"<style>"
,
a
,
"</style>"
].
join
(
""
),
k
.
id
=
h
,
m
.
innerHTML
+=
f
,
m
.
appendChild
(
k
),
l
||
(
m
.
style
.
background
=
""
,
g
.
appendChild
(
m
)),
i
=
c
(
k
,
a
),
l
?
k
.
parentNode
.
removeChild
(
k
):
m
.
parentNode
.
removeChild
(
m
),
!!
i
},
z
=
function
(
b
){
var
c
=
a
.
matchMedia
||
a
.
msMatchMedia
;
if
(
c
)
return
c
(
b
).
matches
;
var
d
;
return
y
(
"@media "
+
b
+
" { #"
+
h
+
" { position: absolute; } }"
,
function
(
b
){
d
=
(
a
.
getComputedStyle
?
getComputedStyle
(
b
,
null
):
b
.
currentStyle
)[
"position"
]
==
"absolute"
}),
d
},
A
=
function
(){
function
d
(
d
,
e
){
e
=
e
||
b
.
createElement
(
a
[
d
]
||
"div"
),
d
=
"on"
+
d
;
var
f
=
d
in
e
;
return
f
||
(
e
.
setAttribute
||
(
e
=
b
.
createElement
(
"div"
)),
e
.
setAttribute
&&
e
.
removeAttribute
&&
(
e
.
setAttribute
(
d
,
""
),
f
=
F
(
e
[
d
],
"function"
),
F
(
e
[
d
],
"undefined"
)
||
(
e
[
d
]
=
c
),
e
.
removeAttribute
(
d
))),
e
=
null
,
f
}
var
a
=
{
select
:
"input"
,
change
:
"input"
,
submit
:
"form"
,
reset
:
"form"
,
error
:
"img"
,
load
:
"img"
,
abort
:
"img"
};
return
d
}(),
B
=
{}.
hasOwnProperty
,
C
;
!
F
(
B
,
"undefined"
)
&&!
F
(
B
.
call
,
"undefined"
)?
C
=
function
(
a
,
b
){
return
B
.
call
(
a
,
b
)}:
C
=
function
(
a
,
b
){
return
b
in
a
&&
F
(
a
.
constructor
.
prototype
[
b
],
"undefined"
)},
Function
.
prototype
.
bind
||
(
Function
.
prototype
.
bind
=
function
(
b
){
var
c
=
this
;
if
(
typeof
c
!=
"function"
)
throw
new
TypeError
;
var
d
=
w
.
call
(
arguments
,
1
),
e
=
function
(){
if
(
this
instanceof
e
){
var
a
=
function
(){};
a
.
prototype
=
c
.
prototype
;
var
f
=
new
a
,
g
=
c
.
apply
(
f
,
d
.
concat
(
w
.
call
(
arguments
)));
return
Object
(
g
)
===
g
?
g
:
f
}
return
c
.
apply
(
b
,
d
.
concat
(
w
.
call
(
arguments
)))};
return
e
});
var
K
=
function
(
c
,
d
){
var
f
=
c
.
join
(
""
),
g
=
d
.
length
;
y
(
f
,
function
(
c
,
d
){
var
f
=
b
.
styleSheets
[
b
.
styleSheets
.
length
-
1
],
h
=
f
?
f
.
cssRules
&&
f
.
cssRules
[
0
]?
f
.
cssRules
[
0
].
cssText
:
f
.
cssText
||
""
:
""
,
i
=
c
.
childNodes
,
j
=
{};
while
(
g
--
)
j
[
i
[
g
].
id
]
=
i
[
g
];
e
.
touch
=
"ontouchstart"
in
a
||
a
.
DocumentTouch
&&
b
instanceof
DocumentTouch
||
(
j
.
touch
&&
j
.
touch
.
offsetTop
)
===
9
,
e
.
csstransforms3d
=
(
j
.
csstransforms3d
&&
j
.
csstransforms3d
.
offsetLeft
)
===
9
&&
j
.
csstransforms3d
.
offsetHeight
===
3
,
e
.
generatedcontent
=
(
j
.
generatedcontent
&&
j
.
generatedcontent
.
offsetHeight
)
>=
1
,
e
.
fontface
=
/src/i
.
test
(
h
)
&&
h
.
indexOf
(
d
.
split
(
" "
)[
0
])
===
0
},
g
,
d
)}([
'@font-face {font-family:"font";src:url("https://")}'
,[
"@media ("
,
n
.
join
(
"touch-enabled),("
),
h
,
")"
,
"{#touch{top:9px;position:absolute}}"
].
join
(
""
),[
"@media ("
,
n
.
join
(
"transform-3d),("
),
h
,
")"
,
"{#csstransforms3d{left:9px;position:absolute;height:3px;}}"
].
join
(
""
),[
'#generatedcontent:after{content:"'
,
l
,
'";visibility:hidden}'
].
join
(
""
)],[
"fontface"
,
"touch"
,
"csstransforms3d"
,
"generatedcontent"
]);
s
.
flexbox
=
function
(){
return
J
(
"flexOrder"
)},
s
.
canvas
=
function
(){
var
a
=
b
.
createElement
(
"canvas"
);
return
!!
a
.
getContext
&&!!
a
.
getContext
(
"2d"
)},
s
.
canvastext
=
function
(){
return
!!
e
.
canvas
&&!!
F
(
b
.
createElement
(
"canvas"
).
getContext
(
"2d"
).
fillText
,
"function"
)},
s
.
webgl
=
function
(){
try
{
var
d
=
b
.
createElement
(
"canvas"
),
e
;
e
=!
(
!
a
.
WebGLRenderingContext
||!
d
.
getContext
(
"experimental-webgl"
)
&&!
d
.
getContext
(
"webgl"
)),
d
=
c
}
catch
(
f
){
e
=!
1
}
return
e
},
s
.
touch
=
function
(){
return
e
.
touch
},
s
.
geolocation
=
function
(){
return
!!
navigator
.
geolocation
},
s
.
postmessage
=
function
(){
return
!!
a
.
postMessage
},
s
.
websqldatabase
=
function
(){
return
!!
a
.
openDatabase
},
s
.
indexedDB
=
function
(){
return
!!
J
(
"indexedDB"
,
a
)},
s
.
hashchange
=
function
(){
return
A
(
"hashchange"
,
a
)
&&
(
b
.
documentMode
===
c
||
b
.
documentMode
>
7
)},
s
.
history
=
function
(){
return
!!
a
.
history
&&!!
history
.
pushState
},
s
.
draganddrop
=
function
(){
var
a
=
b
.
createElement
(
"div"
);
return
"draggable"
in
a
||
"ondragstart"
in
a
&&
"ondrop"
in
a
},
s
.
websockets
=
function
(){
for
(
var
b
=-
1
,
c
=
p
.
length
;
++
b
<
c
;)
if
(
a
[
p
[
b
]
+
"WebSocket"
])
return
!
0
;
return
"WebSocket"
in
a
},
s
.
rgba
=
function
(){
return
D
(
"background-color:rgba(150,255,150,.5)"
),
G
(
j
.
backgroundColor
,
"rgba"
)},
s
.
hsla
=
function
(){
return
D
(
"background-color:hsla(120,40%,100%,.5)"
),
G
(
j
.
backgroundColor
,
"rgba"
)
||
G
(
j
.
backgroundColor
,
"hsla"
)},
s
.
multiplebgs
=
function
(){
return
D
(
"background:url(https://),url(https://),red url(https://)"
),
/
(
url
\s
*
\(
.*
?){3}
/
.
test
(
j
.
background
)},
s
.
backgroundsize
=
function
(){
return
J
(
"backgroundSize"
)},
s
.
borderimage
=
function
(){
return
J
(
"borderImage"
)},
s
.
borderradius
=
function
(){
return
J
(
"borderRadius"
)},
s
.
boxshadow
=
function
(){
return
J
(
"boxShadow"
)},
s
.
textshadow
=
function
(){
return
b
.
createElement
(
"div"
).
style
.
textShadow
===
""
},
s
.
opacity
=
function
(){
return
E
(
"opacity:.55"
),
/^0.55$/
.
test
(
j
.
opacity
)},
s
.
cssanimations
=
function
(){
return
J
(
"animationName"
)},
s
.
csscolumns
=
function
(){
return
J
(
"columnCount"
)},
s
.
cssgradients
=
function
(){
var
a
=
"background-image:"
,
b
=
"gradient(linear,left top,right bottom,from(#9f9),to(white));"
,
c
=
"linear-gradient(left top,#9f9, white);"
;
return
D
((
a
+
"-webkit- "
.
split
(
" "
).
join
(
b
+
a
)
+
n
.
join
(
c
+
a
)).
slice
(
0
,
-
a
.
length
)),
G
(
j
.
backgroundImage
,
"gradient"
)},
s
.
cssreflections
=
function
(){
return
J
(
"boxReflect"
)},
s
.
csstransforms
=
function
(){
return
!!
J
(
"transform"
)},
s
.
csstransforms3d
=
function
(){
var
a
=!!
J
(
"perspective"
);
return
a
&&
"webkitPerspective"
in
g
.
style
&&
(
a
=
e
.
csstransforms3d
),
a
},
s
.
csstransitions
=
function
(){
return
J
(
"transition"
)},
s
.
fontface
=
function
(){
return
e
.
fontface
},
s
.
generatedcontent
=
function
(){
return
e
.
generatedcontent
},
s
.
video
=
function
(){
var
a
=
b
.
createElement
(
"video"
),
c
=!
1
;
try
{
if
(
c
=!!
a
.
canPlayType
)
c
=
new
Boolean
(
c
),
c
.
ogg
=
a
.
canPlayType
(
'video/ogg; codecs="theora"'
).
replace
(
/^no$/
,
""
),
c
.
h264
=
a
.
canPlayType
(
'video/mp4; codecs="avc1.42E01E"'
).
replace
(
/^no$/
,
""
),
c
.
webm
=
a
.
canPlayType
(
'video/webm; codecs="vp8, vorbis"'
).
replace
(
/^no$/
,
""
)}
catch
(
d
){}
return
c
},
s
.
audio
=
function
(){
var
a
=
b
.
createElement
(
"audio"
),
c
=!
1
;
try
{
if
(
c
=!!
a
.
canPlayType
)
c
=
new
Boolean
(
c
),
c
.
ogg
=
a
.
canPlayType
(
'audio/ogg; codecs="vorbis"'
).
replace
(
/^no$/
,
""
),
c
.
mp3
=
a
.
canPlayType
(
"audio/mpeg;"
).
replace
(
/^no$/
,
""
),
c
.
wav
=
a
.
canPlayType
(
'audio/wav; codecs="1"'
).
replace
(
/^no$/
,
""
),
c
.
m4a
=
(
a
.
canPlayType
(
"audio/x-m4a;"
)
||
a
.
canPlayType
(
"audio/aac;"
)).
replace
(
/^no$/
,
""
)}
catch
(
d
){}
return
c
},
s
.
localstorage
=
function
(){
try
{
return
localStorage
.
setItem
(
h
,
h
),
localStorage
.
removeItem
(
h
),
!
0
}
catch
(
a
){
return
!
1
}},
s
.
sessionstorage
=
function
(){
try
{
return
sessionStorage
.
setItem
(
h
,
h
),
sessionStorage
.
removeItem
(
h
),
!
0
}
catch
(
a
){
return
!
1
}},
s
.
webworkers
=
function
(){
return
!!
a
.
Worker
},
s
.
applicationcache
=
function
(){
return
!!
a
.
applicationCache
},
s
.
svg
=
function
(){
return
!!
b
.
createElementNS
&&!!
b
.
createElementNS
(
r
.
svg
,
"svg"
).
createSVGRect
},
s
.
inlinesvg
=
function
(){
var
a
=
b
.
createElement
(
"div"
);
return
a
.
innerHTML
=
"<svg/>"
,(
a
.
firstChild
&&
a
.
firstChild
.
namespaceURI
)
==
r
.
svg
},
s
.
smil
=
function
(){
return
!!
b
.
createElementNS
&&
/SVGAnimate/
.
test
(
m
.
call
(
b
.
createElementNS
(
r
.
svg
,
"animate"
)))},
s
.
svgclippaths
=
function
(){
return
!!
b
.
createElementNS
&&
/SVGClipPath/
.
test
(
m
.
call
(
b
.
createElementNS
(
r
.
svg
,
"clipPath"
)))};
for
(
var
M
in
s
)
C
(
s
,
M
)
&&
(
x
=
M
.
toLowerCase
(),
e
[
x
]
=
s
[
M
](),
v
.
push
((
e
[
x
]?
""
:
"no-"
)
+
x
));
return
e
.
input
||
L
(),
e
.
addTest
=
function
(
a
,
b
){
if
(
typeof
a
==
"object"
)
for
(
var
d
in
a
)
C
(
a
,
d
)
&&
e
.
addTest
(
d
,
a
[
d
]);
else
{
a
=
a
.
toLowerCase
();
if
(
e
[
a
]
!==
c
)
return
e
;
b
=
typeof
b
==
"function"
?
b
():
b
,
g
.
className
+=
" "
+
(
b
?
""
:
"no-"
)
+
a
,
e
[
a
]
=
b
}
return
e
},
D
(
""
),
i
=
k
=
null
,
function
(
a
,
b
){
function
g
(
a
,
b
){
var
c
=
a
.
createElement
(
"p"
),
d
=
a
.
getElementsByTagName
(
"head"
)[
0
]
||
a
.
documentElement
;
return
c
.
innerHTML
=
"x<style>"
+
b
+
"</style>"
,
d
.
insertBefore
(
c
.
lastChild
,
d
.
firstChild
)}
function
h
(){
var
a
=
k
.
elements
;
return
typeof
a
==
"string"
?
a
.
split
(
" "
):
a
}
function
i
(
a
){
var
b
=
{},
c
=
a
.
createElement
,
e
=
a
.
createDocumentFragment
,
f
=
e
();
a
.
createElement
=
function
(
a
){
var
e
=
(
b
[
a
]
||
(
b
[
a
]
=
c
(
a
))).
cloneNode
();
return
k
.
shivMethods
&&
e
.
canHaveChildren
&&!
d
.
test
(
a
)?
f
.
appendChild
(
e
):
e
},
a
.
createDocumentFragment
=
Function
(
"h,f"
,
"return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("
+
h
().
join
().
replace
(
/
\w
+/g
,
function
(
a
){
return
b
[
a
]
=
c
(
a
),
f
.
createElement
(
a
),
'c("'
+
a
+
'")'
})
+
");return n}"
)(
k
,
f
)}
function
j
(
a
){
var
b
;
return
a
.
documentShived
?
a
:(
k
.
shivCSS
&&!
e
&&
(
b
=!!
g
(
a
,
"article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio{display:none}canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}mark{background:#FF0;color:#000}"
)),
f
||
(
b
=!
i
(
a
)),
b
&&
(
a
.
documentShived
=
b
),
a
)}
var
c
=
a
.
html5
||
{},
d
=
/^<|^
(?:
button|form|map|select|textarea
)
$/i
,
e
,
f
;(
function
(){
var
a
=
b
.
createElement
(
"a"
);
a
.
innerHTML
=
"<xyz></xyz>"
,
e
=
"hidden"
in
a
,
f
=
a
.
childNodes
.
length
==
1
||
function
(){
try
{
b
.
createElement
(
"a"
)}
catch
(
a
){
return
!
0
}
var
c
=
b
.
createDocumentFragment
();
return
typeof
c
.
cloneNode
==
"undefined"
||
typeof
c
.
createDocumentFragment
==
"undefined"
||
typeof
c
.
createElement
==
"undefined"
}()})();
var
k
=
{
elements
:
c
.
elements
||
"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video"
,
shivCSS
:
c
.
shivCSS
!==!
1
,
shivMethods
:
c
.
shivMethods
!==!
1
,
type
:
"default"
,
shivDocument
:
j
};
a
.
html5
=
k
,
j
(
b
)}(
this
,
b
),
e
.
_version
=
d
,
e
.
_prefixes
=
n
,
e
.
_domPrefixes
=
q
,
e
.
_cssomPrefixes
=
p
,
e
.
mq
=
z
,
e
.
hasEvent
=
A
,
e
.
testProp
=
function
(
a
){
return
H
([
a
])},
e
.
testAllProps
=
J
,
e
.
testStyles
=
y
,
e
.
prefixed
=
function
(
a
,
b
,
c
){
return
b
?
J
(
a
,
b
,
c
):
J
(
a
,
"pfx"
)},
g
.
className
=
g
.
className
.
replace
(
/
(
^|
\s)
no-js
(\s
|$
)
/
,
"$1$2"
)
+
(
f
?
" js "
+
v
.
join
(
" "
):
""
),
e
}(
this
,
this
.
document
),
function
(
a
,
b
,
c
){
function
d
(
a
){
return
o
.
call
(
a
)
==
"[object Function]"
}
function
e
(
a
){
return
typeof
a
==
"string"
}
function
f
(){}
function
g
(
a
){
return
!
a
||
a
==
"loaded"
||
a
==
"complete"
||
a
==
"uninitialized"
}
function
h
(){
var
a
=
p
.
shift
();
q
=
1
,
a
?
a
.
t
?
m
(
function
(){(
a
.
t
==
"c"
?
B
.
injectCss
:
B
.
injectJs
)(
a
.
s
,
0
,
a
.
a
,
a
.
x
,
a
.
e
,
1
)},
0
):(
a
(),
h
()):
q
=
0
}
function
i
(
a
,
c
,
d
,
e
,
f
,
i
,
j
){
function
k
(
b
){
if
(
!
o
&&
g
(
l
.
readyState
)
&&
(
u
.
r
=
o
=
1
,
!
q
&&
h
(),
l
.
onload
=
l
.
onreadystatechange
=
null
,
b
)){
a
!=
"img"
&&
m
(
function
(){
t
.
removeChild
(
l
)},
50
);
for
(
var
d
in
y
[
c
])
y
[
c
].
hasOwnProperty
(
d
)
&&
y
[
c
][
d
].
onload
()}}
var
j
=
j
||
B
.
errorTimeout
,
l
=
{},
o
=
0
,
r
=
0
,
u
=
{
t
:
d
,
s
:
c
,
e
:
f
,
a
:
i
,
x
:
j
};
y
[
c
]
===
1
&&
(
r
=
1
,
y
[
c
]
=
[],
l
=
b
.
createElement
(
a
)),
a
==
"object"
?
l
.
data
=
c
:(
l
.
src
=
c
,
l
.
type
=
a
),
l
.
width
=
l
.
height
=
"0"
,
l
.
onerror
=
l
.
onload
=
l
.
onreadystatechange
=
function
(){
k
.
call
(
this
,
r
)},
p
.
splice
(
e
,
0
,
u
),
a
!=
"img"
&&
(
r
||
y
[
c
]
===
2
?(
t
.
insertBefore
(
l
,
s
?
null
:
n
),
m
(
k
,
j
)):
y
[
c
].
push
(
l
))}
function
j
(
a
,
b
,
c
,
d
,
f
){
return
q
=
0
,
b
=
b
||
"j"
,
e
(
a
)?
i
(
b
==
"c"
?
v
:
u
,
a
,
b
,
this
.
i
++
,
c
,
d
,
f
):(
p
.
splice
(
this
.
i
++
,
0
,
a
),
p
.
length
==
1
&&
h
()),
this
}
function
k
(){
var
a
=
B
;
return
a
.
loader
=
{
load
:
j
,
i
:
0
},
a
}
var
l
=
b
.
documentElement
,
m
=
a
.
setTimeout
,
n
=
b
.
getElementsByTagName
(
"script"
)[
0
],
o
=
{}.
toString
,
p
=
[],
q
=
0
,
r
=
"MozAppearance"
in
l
.
style
,
s
=
r
&&!!
b
.
createRange
().
compareNode
,
t
=
s
?
l
:
n
.
parentNode
,
l
=
a
.
opera
&&
o
.
call
(
a
.
opera
)
==
"[object Opera]"
,
l
=!!
b
.
attachEvent
&&!
l
,
u
=
r
?
"object"
:
l
?
"script"
:
"img"
,
v
=
l
?
"script"
:
u
,
w
=
Array
.
isArray
||
function
(
a
){
return
o
.
call
(
a
)
==
"[object Array]"
},
x
=
[],
y
=
{},
z
=
{
timeout
:
function
(
a
,
b
){
return
b
.
length
&&
(
a
.
timeout
=
b
[
0
]),
a
}},
A
,
B
;
B
=
function
(
a
){
function
b
(
a
){
var
a
=
a
.
split
(
"!"
),
b
=
x
.
length
,
c
=
a
.
pop
(),
d
=
a
.
length
,
c
=
{
url
:
c
,
origUrl
:
c
,
prefixes
:
a
},
e
,
f
,
g
;
for
(
f
=
0
;
f
<
d
;
f
++
)
g
=
a
[
f
].
split
(
"="
),(
e
=
z
[
g
.
shift
()])
&&
(
c
=
e
(
c
,
g
));
for
(
f
=
0
;
f
<
b
;
f
++
)
c
=
x
[
f
](
c
);
return
c
}
function
g
(
a
,
e
,
f
,
g
,
i
){
var
j
=
b
(
a
),
l
=
j
.
autoCallback
;
j
.
url
.
split
(
"."
).
pop
().
split
(
"?"
).
shift
(),
j
.
bypass
||
(
e
&&
(
e
=
d
(
e
)?
e
:
e
[
a
]
||
e
[
g
]
||
e
[
a
.
split
(
"/"
).
pop
().
split
(
"?"
)[
0
]]
||
h
),
j
.
instead
?
j
.
instead
(
a
,
e
,
f
,
g
,
i
):(
y
[
j
.
url
]?
j
.
noexec
=!
0
:
y
[
j
.
url
]
=
1
,
f
.
load
(
j
.
url
,
j
.
forceCSS
||!
j
.
forceJS
&&
"css"
==
j
.
url
.
split
(
"."
).
pop
().
split
(
"?"
).
shift
()?
"c"
:
c
,
j
.
noexec
,
j
.
attrs
,
j
.
timeout
),(
d
(
e
)
||
d
(
l
))
&&
f
.
load
(
function
(){
k
(),
e
&&
e
(
j
.
origUrl
,
i
,
g
),
l
&&
l
(
j
.
origUrl
,
i
,
g
),
y
[
j
.
url
]
=
2
})))}
function
i
(
a
,
b
){
function
c
(
a
,
c
){
if
(
a
){
if
(
e
(
a
))
c
||
(
j
=
function
(){
var
a
=
[].
slice
.
call
(
arguments
);
k
.
apply
(
this
,
a
),
l
()}),
g
(
a
,
j
,
b
,
0
,
h
);
else
if
(
Object
(
a
)
===
a
)
for
(
n
in
m
=
function
(){
var
b
=
0
,
c
;
for
(
c
in
a
)
a
.
hasOwnProperty
(
c
)
&&
b
++
;
return
b
}(),
a
)
a
.
hasOwnProperty
(
n
)
&&
(
!
c
&&!--
m
&&
(
d
(
j
)?
j
=
function
(){
var
a
=
[].
slice
.
call
(
arguments
);
k
.
apply
(
this
,
a
),
l
()}:
j
[
n
]
=
function
(
a
){
return
function
(){
var
b
=
[].
slice
.
call
(
arguments
);
a
&&
a
.
apply
(
this
,
b
),
l
()}}(
k
[
n
])),
g
(
a
[
n
],
j
,
b
,
n
,
h
))}
else
!
c
&&
l
()}
var
h
=!!
a
.
test
,
i
=
a
.
load
||
a
.
both
,
j
=
a
.
callback
||
f
,
k
=
j
,
l
=
a
.
complete
||
f
,
m
,
n
;
c
(
h
?
a
.
yep
:
a
.
nope
,
!!
i
),
i
&&
c
(
i
)}
var
j
,
l
,
m
=
this
.
yepnope
.
loader
;
if
(
e
(
a
))
g
(
a
,
0
,
m
,
0
);
else
if
(
w
(
a
))
for
(
j
=
0
;
j
<
a
.
length
;
j
++
)
l
=
a
[
j
],
e
(
l
)?
g
(
l
,
0
,
m
,
0
):
w
(
l
)?
B
(
l
):
Object
(
l
)
===
l
&&
i
(
l
,
m
);
else
Object
(
a
)
===
a
&&
i
(
a
,
m
)},
B
.
addPrefix
=
function
(
a
,
b
){
z
[
a
]
=
b
},
B
.
addFilter
=
function
(
a
){
x
.
push
(
a
)},
B
.
errorTimeout
=
1
e4
,
b
.
readyState
==
null
&&
b
.
addEventListener
&&
(
b
.
readyState
=
"loading"
,
b
.
addEventListener
(
"DOMContentLoaded"
,
A
=
function
(){
b
.
removeEventListener
(
"DOMContentLoaded"
,
A
,
0
),
b
.
readyState
=
"complete"
},
0
)),
a
.
yepnope
=
k
(),
a
.
yepnope
.
executeStack
=
h
,
a
.
yepnope
.
injectJs
=
function
(
a
,
c
,
d
,
e
,
i
,
j
){
var
k
=
b
.
createElement
(
"script"
),
l
,
o
,
e
=
e
||
B
.
errorTimeout
;
k
.
src
=
a
;
for
(
o
in
d
)
k
.
setAttribute
(
o
,
d
[
o
]);
c
=
j
?
h
:
c
||
f
,
k
.
onreadystatechange
=
k
.
onload
=
function
(){
!
l
&&
g
(
k
.
readyState
)
&&
(
l
=
1
,
c
(),
k
.
onload
=
k
.
onreadystatechange
=
null
)},
m
(
function
(){
l
||
(
l
=
1
,
c
(
1
))},
e
),
i
?
k
.
onload
():
n
.
parentNode
.
insertBefore
(
k
,
n
)},
a
.
yepnope
.
injectCss
=
function
(
a
,
c
,
d
,
e
,
g
,
i
){
var
e
=
b
.
createElement
(
"link"
),
j
,
c
=
i
?
h
:
c
||
f
;
e
.
href
=
a
,
e
.
rel
=
"stylesheet"
,
e
.
type
=
"text/css"
;
for
(
j
in
d
)
e
.
setAttribute
(
j
,
d
[
j
]);
g
||
(
n
.
parentNode
.
insertBefore
(
e
,
n
),
m
(
c
,
0
))}}(
this
,
document
),
Modernizr
.
load
=
function
(){
yepnope
.
apply
(
window
,[].
slice
.
call
(
arguments
,
0
))};
bundles/docs/public/js/prettify.js
0 → 100644
View file @
902e8c75
// Copyright (C) 2006 Google Inc.
//
// 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
* some functions for browser-side pretty printing of code contained in html.
*
* <p>
* For a fairly comprehensive set of languages see the
* <a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html#langs">README</a>
* file that came with this source. At a minimum, the lexer should work on a
* number of languages including C and friends, Java, Python, Bash, SQL, HTML,
* XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk
* and a subset of Perl, but, because of commenting conventions, doesn't work on
* Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class.
* <p>
* Usage: <ol>
* <li> include this source file in an html page via
* {@code <script type="text/javascript" src="/path/to/prettify.js"></script>}
* <li> define style rules. See the example page for examples.
* <li> mark the {@code <pre>} and {@code <code>} tags in your source with
* {@code class=prettyprint.}
* You can also use the (html deprecated) {@code <xmp>} tag, but the pretty
* printer needs to do more substantial DOM manipulations to support that, so
* some css styles may not be preserved.
* </ol>
* That's it. I wanted to keep the API as simple as possible, so there's no
* need to specify which language the code is in, but if you wish, you can add
* another class to the {@code <pre>} or {@code <code>} element to specify the
* language, as in {@code <pre class="prettyprint lang-java">}. Any class that
* starts with "lang-" followed by a file extension, specifies the file type.
* See the "lang-*.js" files in this directory for code that implements
* per-language file handlers.
* <p>
* Change log:<br>
* cbeust, 2006/08/22
* <blockquote>
* Java annotations (start with "@") are now captured as literals ("lit")
* </blockquote>
* @requires console
*/
// JSLint declarations
/*global console, document, navigator, setTimeout, window */
/**
* Split {@code prettyPrint} into multiple timeouts so as not to interfere with
* UI events.
* If set to {@code false}, {@code prettyPrint()} is synchronous.
*/
window
[
'PR_SHOULD_USE_CONTINUATION'
]
=
true
;
(
function
()
{
// Keyword lists for various languages.
// We use things that coerce to strings to make them compact when minified
// and to defeat aggressive optimizers that fold large string constants.
var
FLOW_CONTROL_KEYWORDS
=
[
"break,continue,do,else,for,if,return,while"
];
var
C_KEYWORDS
=
[
FLOW_CONTROL_KEYWORDS
,
"auto,case,char,const,default,"
+
"double,enum,extern,float,goto,int,long,register,short,signed,sizeof,"
+
"static,struct,switch,typedef,union,unsigned,void,volatile"
];
var
COMMON_KEYWORDS
=
[
C_KEYWORDS
,
"catch,class,delete,false,import,"
+
"new,operator,private,protected,public,this,throw,true,try,typeof"
];
var
CPP_KEYWORDS
=
[
COMMON_KEYWORDS
,
"alignof,align_union,asm,axiom,bool,"
+
"concept,concept_map,const_cast,constexpr,decltype,"
+
"dynamic_cast,explicit,export,friend,inline,late_check,"
+
"mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,"
+
"template,typeid,typename,using,virtual,where"
];
var
JAVA_KEYWORDS
=
[
COMMON_KEYWORDS
,
"abstract,boolean,byte,extends,final,finally,implements,import,"
+
"instanceof,null,native,package,strictfp,super,synchronized,throws,"
+
"transient"
];
var
CSHARP_KEYWORDS
=
[
JAVA_KEYWORDS
,
"as,base,by,checked,decimal,delegate,descending,dynamic,event,"
+
"fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,"
+
"object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,"
+
"stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"
];
var
COFFEE_KEYWORDS
=
"all,and,by,catch,class,else,extends,false,finally,"
+
"for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,"
+
"true,try,unless,until,when,while,yes"
;
var
JSCRIPT_KEYWORDS
=
[
COMMON_KEYWORDS
,
"debugger,eval,export,function,get,null,set,undefined,var,with,"
+
"Infinity,NaN"
];
var
PERL_KEYWORDS
=
"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,"
+
"goto,if,import,last,local,my,next,no,our,print,package,redo,require,"
+
"sub,undef,unless,until,use,wantarray,while,BEGIN,END"
;
var
PYTHON_KEYWORDS
=
[
FLOW_CONTROL_KEYWORDS
,
"and,as,assert,class,def,del,"
+
"elif,except,exec,finally,from,global,import,in,is,lambda,"
+
"nonlocal,not,or,pass,print,raise,try,with,yield,"
+
"False,True,None"
];
var
RUBY_KEYWORDS
=
[
FLOW_CONTROL_KEYWORDS
,
"alias,and,begin,case,class,"
+
"def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,"
+
"rescue,retry,self,super,then,true,undef,unless,until,when,yield,"
+
"BEGIN,END"
];
var
SH_KEYWORDS
=
[
FLOW_CONTROL_KEYWORDS
,
"case,done,elif,esac,eval,fi,"
+
"function,in,local,set,then,until"
];
var
ALL_KEYWORDS
=
[
CPP_KEYWORDS
,
CSHARP_KEYWORDS
,
JSCRIPT_KEYWORDS
,
PERL_KEYWORDS
+
PYTHON_KEYWORDS
,
RUBY_KEYWORDS
,
SH_KEYWORDS
];
var
C_TYPES
=
/^
(
DIR|FILE|vector|
(
de|priority_
)?
queue|list|stack|
(
const_
)?
iterator|
(
multi
)?(
set|map
)
|bitset|u
?(
int|float
)\d
*
)
/
;
// token style names. correspond to css classes
/**
* token style for a string literal
* @const
*/
var
PR_STRING
=
'str'
;
/**
* token style for a keyword
* @const
*/
var
PR_KEYWORD
=
'kwd'
;
/**
* token style for a comment
* @const
*/
var
PR_COMMENT
=
'com'
;
/**
* token style for a type
* @const
*/
var
PR_TYPE
=
'typ'
;
/**
* token style for a literal value. e.g. 1, null, true.
* @const
*/
var
PR_LITERAL
=
'lit'
;
/**
* token style for a punctuation string.
* @const
*/
var
PR_PUNCTUATION
=
'pun'
;
/**
* token style for a punctuation string.
* @const
*/
var
PR_PLAIN
=
'pln'
;
/**
* token style for an sgml tag.
* @const
*/
var
PR_TAG
=
'tag'
;
/**
* token style for a markup declaration such as a DOCTYPE.
* @const
*/
var
PR_DECLARATION
=
'dec'
;
/**
* token style for embedded source.
* @const
*/
var
PR_SOURCE
=
'src'
;
/**
* token style for an sgml attribute name.
* @const
*/
var
PR_ATTRIB_NAME
=
'atn'
;
/**
* token style for an sgml attribute value.
* @const
*/
var
PR_ATTRIB_VALUE
=
'atv'
;
/**
* A class that indicates a section of markup that is not code, e.g. to allow
* embedding of line numbers within code listings.
* @const
*/
var
PR_NOCODE
=
'nocode'
;
/**
* A set of tokens that can precede a regular expression literal in
* javascript
* http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html
* has the full list, but I've removed ones that might be problematic when
* seen in languages that don't support regular expression literals.
*
* <p>Specifically, I've removed any keywords that can't precede a regexp
* literal in a syntactically legal javascript program, and I've removed the
* "in" keyword since it's not a keyword in many languages, and might be used
* as a count of inches.
*
* <p>The link a above does not accurately describe EcmaScript rules since
* it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
* very well in practice.
*
* @private
* @const
*/
var
REGEXP_PRECEDER_PATTERN
=
'(?:^^
\\
.?|[+-]|
\\
!|
\\
!=|
\\
!==|
\\
#|
\\
%|
\\
%=|&|&&|&&=|&=|
\\
(|
\\
*|
\\
*=|
\\
+=|
\\
,|
\\
-=|
\\
->|
\\
/|
\\
/=|:|::|
\\
;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|
\\
?|
\\
@|
\\
[|
\\
^|
\\
^=|
\\
^
\\
^|
\\
^
\\
^=|
\\
{|
\\
||
\\
|=|
\\
|
\\
||
\\
|
\\
|=|
\\
~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)
\\
s*'
;
// CAVEAT: this does not properly handle the case where a regular
// expression immediately follows another since a regular expression may
// have flags for case-sensitivity and the like. Having regexp tokens
// adjacent is not valid in any language I'm aware of, so I'm punting.
// TODO: maybe style special characters inside a regexp as punctuation.
/**
* Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
* matches the union of the sets of strings matched by the input RegExp.
* Since it matches globally, if the input strings have a start-of-input
* anchor (/^.../), it is ignored for the purposes of unioning.
* @param {Array.<RegExp>} regexs non multiline, non-global regexs.
* @return {RegExp} a global regex.
*/
function
combinePrefixPatterns
(
regexs
)
{
var
capturedGroupIndex
=
0
;
var
needToFoldCase
=
false
;
var
ignoreCase
=
false
;
for
(
var
i
=
0
,
n
=
regexs
.
length
;
i
<
n
;
++
i
)
{
var
regex
=
regexs
[
i
];
if
(
regex
.
ignoreCase
)
{
ignoreCase
=
true
;
}
else
if
(
/
[
a-z
]
/i
.
test
(
regex
.
source
.
replace
(
/
\\
u
[
0-9a-f
]{4}
|
\\
x
[
0-9a-f
]{2}
|
\\[^
ux
]
/gi
,
''
)))
{
needToFoldCase
=
true
;
ignoreCase
=
false
;
break
;
}
}
var
escapeCharToCodeUnit
=
{
'b'
:
8
,
't'
:
9
,
'n'
:
0xa
,
'v'
:
0xb
,
'f'
:
0xc
,
'r'
:
0xd
};
function
decodeEscape
(
charsetPart
)
{
var
cc0
=
charsetPart
.
charCodeAt
(
0
);
if
(
cc0
!==
92
/* \\ */
)
{
return
cc0
;
}
var
c1
=
charsetPart
.
charAt
(
1
);
cc0
=
escapeCharToCodeUnit
[
c1
];
if
(
cc0
)
{
return
cc0
;
}
else
if
(
'0'
<=
c1
&&
c1
<=
'7'
)
{
return
parseInt
(
charsetPart
.
substring
(
1
),
8
);
}
else
if
(
c1
===
'u'
||
c1
===
'x'
)
{
return
parseInt
(
charsetPart
.
substring
(
2
),
16
);
}
else
{
return
charsetPart
.
charCodeAt
(
1
);
}
}
function
encodeEscape
(
charCode
)
{
if
(
charCode
<
0x20
)
{
return
(
charCode
<
0x10
?
'
\\
x0'
:
'
\\
x'
)
+
charCode
.
toString
(
16
);
}
var
ch
=
String
.
fromCharCode
(
charCode
);
if
(
ch
===
'
\
\'
|| ch === '
-
' || ch === '
[
' || ch === '
]
') {
ch = '
\\
' + ch;
}
return ch;
}
function caseFoldCharset(charSet) {
var charsetParts = charSet.substring(1, charSet.length - 1).match(
new RegExp(
'
\\\\
u
[
0
-
9
A
-
Fa
-
f
]{
4
}
'
+ '
|
\\\\
x
[
0
-
9
A
-
Fa
-
f
]{
2
}
'
+ '
|
\\\\
[
0
-
3
][
0
-
7
]{
0
,
2
}
'
+ '
|
\\\\
[
0
-
7
]{
1
,
2
}
'
+ '
|
\\\\
[
\\
s
\\
S
]
'
+ '
|-
'
+ '
|
[
^-
\\\\
]
',
'
g
'));
var groups = [];
var ranges = [];
var inverse = charsetParts[0] === '
^
';
for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
var p = charsetParts[i];
if (/
\\
[bdsw]/i.test(p)) { // Don'
t
muck
with
named
groups
.
groups
.
push
(
p
);
}
else
{
var
start
=
decodeEscape
(
p
);
var
end
;
if
(
i
+
2
<
n
&&
'-'
===
charsetParts
[
i
+
1
])
{
end
=
decodeEscape
(
charsetParts
[
i
+
2
]);
i
+=
2
;
}
else
{
end
=
start
;
}
ranges
.
push
([
start
,
end
]);
// If the range might intersect letters, then expand it.
// This case handling is too simplistic.
// It does not deal with non-latin case folding.
// It works for latin source code identifiers though.
if
(
!
(
end
<
65
||
start
>
122
))
{
if
(
!
(
end
<
65
||
start
>
90
))
{
ranges
.
push
([
Math
.
max
(
65
,
start
)
|
32
,
Math
.
min
(
end
,
90
)
|
32
]);
}
if
(
!
(
end
<
97
||
start
>
122
))
{
ranges
.
push
([
Math
.
max
(
97
,
start
)
&
~
32
,
Math
.
min
(
end
,
122
)
&
~
32
]);
}
}
}
}
// [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
// -> [[1, 12], [14, 14], [16, 17]]
ranges
.
sort
(
function
(
a
,
b
)
{
return
(
a
[
0
]
-
b
[
0
])
||
(
b
[
1
]
-
a
[
1
]);
});
var
consolidatedRanges
=
[];
var
lastRange
=
[
NaN
,
NaN
];
for
(
var
i
=
0
;
i
<
ranges
.
length
;
++
i
)
{
var
range
=
ranges
[
i
];
if
(
range
[
0
]
<=
lastRange
[
1
]
+
1
)
{
lastRange
[
1
]
=
Math
.
max
(
lastRange
[
1
],
range
[
1
]);
}
else
{
consolidatedRanges
.
push
(
lastRange
=
range
);
}
}
var
out
=
[
'['
];
if
(
inverse
)
{
out
.
push
(
'^'
);
}
out
.
push
.
apply
(
out
,
groups
);
for
(
var
i
=
0
;
i
<
consolidatedRanges
.
length
;
++
i
)
{
var
range
=
consolidatedRanges
[
i
];
out
.
push
(
encodeEscape
(
range
[
0
]));
if
(
range
[
1
]
>
range
[
0
])
{
if
(
range
[
1
]
+
1
>
range
[
0
])
{
out
.
push
(
'-'
);
}
out
.
push
(
encodeEscape
(
range
[
1
]));
}
}
out
.
push
(
']'
);
return
out
.
join
(
''
);
}
function
allowAnywhereFoldCaseAndRenumberGroups
(
regex
)
{
// Split into character sets, escape sequences, punctuation strings
// like ('(', '(?:', ')', '^'), and runs of characters that do not
// include any of the above.
var
parts
=
regex
.
source
.
match
(
new
RegExp
(
'(?:'
+
'
\\
[(?:[^
\\
x5C
\\
x5D]|
\\\\
[
\\
s
\\
S])*
\\
]'
// a character set
+
'|
\\\\
u[A-Fa-f0-9]{4}'
// a unicode escape
+
'|
\\\\
x[A-Fa-f0-9]{2}'
// a hex escape
+
'|
\\\\
[0-9]+'
// a back-reference or octal escape
+
'|
\\\\
[^ux0-9]'
// other escape sequence
+
'|
\\
(
\\
?[:!=]'
// start of a non-capturing group
+
'|[
\\
(
\\
)
\\
^]'
// start/emd of a group, or line start
+
'|[^
\\
x5B
\\
x5C
\\
(
\\
)
\\
^]+'
// run of other characters
+
')'
,
'g'
));
var
n
=
parts
.
length
;
// Maps captured group numbers to the number they will occupy in
// the output or to -1 if that has not been determined, or to
// undefined if they need not be capturing in the output.
var
capturedGroups
=
[];
// Walk over and identify back references to build the capturedGroups
// mapping.
for
(
var
i
=
0
,
groupIndex
=
0
;
i
<
n
;
++
i
)
{
var
p
=
parts
[
i
];
if
(
p
===
'('
)
{
// groups are 1-indexed, so max group index is count of '('
++
groupIndex
;
}
else
if
(
'
\
\'
=== p.charAt(0)) {
var decimalValue = +p.substring(1);
if (decimalValue && decimalValue <= groupIndex) {
capturedGroups[decimalValue] = -1;
}
}
}
// Renumber groups and reduce capturing groups to non-capturing groups
// where possible.
for (var i = 1; i < capturedGroups.length; ++i) {
if (-1 === capturedGroups[i]) {
capturedGroups[i] = ++capturedGroupIndex;
}
}
for (var i = 0, groupIndex = 0; i < n; ++i) {
var p = parts[i];
if (p === '
(
') {
++groupIndex;
if (capturedGroups[groupIndex] === undefined) {
parts[i] = '
(?:
';
}
} else if ('
\\
' === p.charAt(0)) {
var decimalValue = +p.substring(1);
if (decimalValue && decimalValue <= groupIndex) {
parts[i] = '
\\
' + capturedGroups[groupIndex];
}
}
}
// Remove any prefix anchors so that the output will match anywhere.
// ^^ really does mean an anchored match though.
for (var i = 0, groupIndex = 0; i < n; ++i) {
if ('
^
' === parts[i] && '
^
' !== parts[i + 1]) { parts[i] = ''; }
}
// Expand letters to groups to handle mixing of case-sensitive and
// case-insensitive patterns if necessary.
if (regex.ignoreCase && needToFoldCase) {
for (var i = 0; i < n; ++i) {
var p = parts[i];
var ch0 = p.charAt(0);
if (p.length >= 2 && ch0 === '
[
') {
parts[i] = caseFoldCharset(p);
} else if (ch0 !== '
\\
') {
// TODO: handle letters in numeric escapes.
parts[i] = p.replace(
/[a-zA-Z]/g,
function (ch) {
var cc = ch.charCodeAt(0);
return '
[
' + String.fromCharCode(cc & ~32, cc | 32) + '
]
';
});
}
}
}
return parts.join('');
}
var rewritten = [];
for (var i = 0, n = regexs.length; i < n; ++i) {
var regex = regexs[i];
if (regex.global || regex.multiline) { throw new Error('' + regex); }
rewritten.push(
'
(?:
' + allowAnywhereFoldCaseAndRenumberGroups(regex) + '
)
');
}
return new RegExp(rewritten.join('
|
'), ignoreCase ? '
gi
' : '
g
');
}
/**
* Split markup into a string of source code and an array mapping ranges in
* that string to the text nodes in which they appear.
*
* <p>
* The HTML DOM structure:</p>
* <pre>
* (Element "p"
* (Element "b"
* (Text "print ")) ; #1
* (Text "'
Hello
'") ; #2
* (Element "br") ; #3
* (Text " + '
World
';")) ; #4
* </pre>
* <p>
* corresponds to the HTML
* {@code <p><b>print </b>'
Hello
'<br> + '
World
';</p>}.</p>
*
* <p>
* It will produce the output:</p>
* <pre>
* {
* sourceCode: "print '
Hello
'
\
n + '
World
';",
* // 1 2
* // 012345678901234 5678901234567
* spans: [0, #1, 6, #2, 14, #3, 15, #4]
* }
* </pre>
* <p>
* where #1 is a reference to the {@code "print "} text node above, and so
* on for the other text nodes.
* </p>
*
* <p>
* The {@code} spans array is an array of pairs. Even elements are the start
* indices of substrings, and odd elements are the text nodes (or BR elements)
* that contain the text for those substrings.
* Substrings continue until the next index or the end of the source.
* </p>
*
* @param {Node} node an HTML DOM subtree containing source-code.
* @return {Object} source code and the text nodes in which they occur.
*/
function extractSourceSpans(node) {
var nocode = /(?:^|
\
s)nocode(?:
\
s|$)/;
var chunks = [];
var length = 0;
var spans = [];
var k = 0;
var whitespace;
if (node.currentStyle) {
whitespace = node.currentStyle.whiteSpace;
} else if (window.getComputedStyle) {
whitespace = document.defaultView.getComputedStyle(node, null)
.getPropertyValue('
white
-
space
');
}
var isPreformatted = whitespace && '
pre
' === whitespace.substring(0, 3);
function walk(node) {
switch (node.nodeType) {
case 1: // Element
if (nocode.test(node.className)) { return; }
for (var child = node.firstChild; child; child = child.nextSibling) {
walk(child);
}
var nodeName = node.nodeName;
if ('
BR
' === nodeName || '
LI
' === nodeName) {
chunks[k] = '
\
n
';
spans[k << 1] = length++;
spans[(k++ << 1) | 1] = node;
}
break;
case 3: case 4: // Text
var text = node.nodeValue;
if (text.length) {
if (!isPreformatted) {
text = text.replace(/[
\
t
\
r
\
n]+/g, '
');
} else {
text = text.replace(/
\
r
\
n?/g, '
\
n
'); // Normalize newlines.
}
// TODO: handle tabs here?
chunks[k] = text;
spans[k << 1] = length;
length += text.length;
spans[(k++ << 1) | 1] = node;
}
break;
}
}
walk(node);
return {
sourceCode: chunks.join('').replace(/
\
n$/, ''),
spans: spans
};
}
/**
* Apply the given language handler to sourceCode and add the resulting
* decorations to out.
* @param {number} basePos the index of sourceCode within the chunk of source
* whose decorations are already present on out.
*/
function appendDecorations(basePos, sourceCode, langHandler, out) {
if (!sourceCode) { return; }
var job = {
sourceCode: sourceCode,
basePos: basePos
};
langHandler(job);
out.push.apply(out, job.decorations);
}
var notWs = /
\
S/;
/**
* Given an element, if it contains only one child element and any text nodes
* it contains contain only space characters, return the sole child element.
* Otherwise returns undefined.
* <p>
* This is meant to return the CODE element in {@code <pre><code ...>} when
* there is a single child element that contains all the non-space textual
* content, but not to return anything where there are multiple child elements
* as in {@code <pre><code>...</code><code>...</code></pre>} or when there
* is textual content.
*/
function childContentWrapper(element) {
var wrapper = undefined;
for (var c = element.firstChild; c; c = c.nextSibling) {
var type = c.nodeType;
wrapper = (type === 1) // Element Node
? (wrapper ? element : c)
: (type === 3) // Text Node
? (notWs.test(c.nodeValue) ? element : wrapper)
: wrapper;
}
return wrapper === element ? undefined : wrapper;
}
/** Given triples of [style, pattern, context] returns a lexing function,
* The lexing function interprets the patterns to find token boundaries and
* returns a decoration list of the form
* [index_0, style_0, index_1, style_1, ..., index_n, style_n]
* where index_n is an index into the sourceCode, and style_n is a style
* constant like PR_PLAIN. index_n-1 <= index_n, and style_n-1 applies to
* all characters in sourceCode[index_n-1:index_n].
*
* The stylePatterns is a list whose elements have the form
* [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
*
* Style is a style constant like PR_PLAIN, or can be a string of the
* form '
lang
-
FOO
', where FOO is a language extension describing the
* language of the portion of the token in $1 after pattern executes.
* E.g., if style is '
lang
-
lisp
', and group 1 contains the text
* '
(
hello
(
world
))
', then that portion of the token will be passed to the
* registered lisp handler for formatting.
* The text before and after group 1 will be restyled using this decorator
* so decorators should take care that this doesn'
t
result
in
infinite
*
recursion
.
For
example
,
the
HTML
lexer
rule
for
SCRIPT
elements
looks
*
something
like
[
'lang-js'
,
/<
[
s
]
cript>
(
.+
?)
<
\/
script>/
].
This
may
match
*
'<script>foo()<
\
/script>'
,
which
would
cause
the
current
decorator
to
*
be
called
with
'<script>'
which
would
not
match
the
same
rule
since
*
group
1
must
not
be
empty
,
so
it
would
be
instead
styled
as
PR_TAG
by
*
the
generic
tag
rule
.
The
handler
registered
for
the
'js'
extension
would
*
then
be
called
with
'foo()'
,
and
finally
,
the
current
decorator
would
*
be
called
with
'<
\
/script>'
which
would
not
match
the
original
rule
and
*
so
the
generic
tag
rule
would
identify
it
as
a
tag
.
*
*
Pattern
must
only
match
prefixes
,
and
if
it
matches
a
prefix
,
then
that
*
match
is
considered
a
token
with
the
same
style
.
*
*
Context
is
applied
to
the
last
non
-
whitespace
,
non
-
comment
token
*
recognized
.
*
*
Shortcut
is
an
optional
string
of
characters
,
any
of
which
,
if
the
first
*
character
,
gurantee
that
this
pattern
and
only
this
pattern
matches
.
*
*
@
param
{
Array
}
shortcutStylePatterns
patterns
that
always
start
with
*
a
known
character
.
Must
have
a
shortcut
string
.
*
@
param
{
Array
}
fallthroughStylePatterns
patterns
that
will
be
tried
in
*
order
if
the
shortcut
ones
fail
.
May
have
shortcuts
.
*
*
@
return
{
function
(
Object
)}
a
*
function
that
takes
source
code
and
returns
a
list
of
decorations
.
*
/
function
createSimpleLexer
(
shortcutStylePatterns
,
fallthroughStylePatterns
)
{
var
shortcuts
=
{};
var
tokenizer
;
(
function
()
{
var
allPatterns
=
shortcutStylePatterns
.
concat
(
fallthroughStylePatterns
);
var
allRegexs
=
[];
var
regexKeys
=
{};
for
(
var
i
=
0
,
n
=
allPatterns
.
length
;
i
<
n
;
++
i
)
{
var
patternParts
=
allPatterns
[
i
];
var
shortcutChars
=
patternParts
[
3
];
if
(
shortcutChars
)
{
for
(
var
c
=
shortcutChars
.
length
;
--
c
>=
0
;)
{
shortcuts
[
shortcutChars
.
charAt
(
c
)]
=
patternParts
;
}
}
var
regex
=
patternParts
[
1
];
var
k
=
''
+
regex
;
if
(
!
regexKeys
.
hasOwnProperty
(
k
))
{
allRegexs
.
push
(
regex
);
regexKeys
[
k
]
=
null
;
}
}
allRegexs
.
push
(
/
[\0
-
\u
ffff
]
/
);
tokenizer
=
combinePrefixPatterns
(
allRegexs
);
})();
var
nPatterns
=
fallthroughStylePatterns
.
length
;
/**
* Lexes job.sourceCode and produces an output array job.decorations of
* style classes preceded by the position at which they start in
* job.sourceCode in order.
*
* @param {Object} job an object like <pre>{
* sourceCode: {string} sourceText plain text,
* basePos: {int} position of job.sourceCode in the larger chunk of
* sourceCode.
* }</pre>
*/
var
decorate
=
function
(
job
)
{
var
sourceCode
=
job
.
sourceCode
,
basePos
=
job
.
basePos
;
/** Even entries are positions in source in ascending order. Odd enties
* are style markers (e.g., PR_COMMENT) that run from that position until
* the end.
* @type {Array.<number|string>}
*/
var
decorations
=
[
basePos
,
PR_PLAIN
];
var
pos
=
0
;
// index into sourceCode
var
tokens
=
sourceCode
.
match
(
tokenizer
)
||
[];
var
styleCache
=
{};
for
(
var
ti
=
0
,
nTokens
=
tokens
.
length
;
ti
<
nTokens
;
++
ti
)
{
var
token
=
tokens
[
ti
];
var
style
=
styleCache
[
token
];
var
match
=
void
0
;
var
isEmbedded
;
if
(
typeof
style
===
'string'
)
{
isEmbedded
=
false
;
}
else
{
var
patternParts
=
shortcuts
[
token
.
charAt
(
0
)];
if
(
patternParts
)
{
match
=
token
.
match
(
patternParts
[
1
]);
style
=
patternParts
[
0
];
}
else
{
for
(
var
i
=
0
;
i
<
nPatterns
;
++
i
)
{
patternParts
=
fallthroughStylePatterns
[
i
];
match
=
token
.
match
(
patternParts
[
1
]);
if
(
match
)
{
style
=
patternParts
[
0
];
break
;
}
}
if
(
!
match
)
{
// make sure that we make progress
style
=
PR_PLAIN
;
}
}
isEmbedded
=
style
.
length
>=
5
&&
'lang-'
===
style
.
substring
(
0
,
5
);
if
(
isEmbedded
&&
!
(
match
&&
typeof
match
[
1
]
===
'string'
))
{
isEmbedded
=
false
;
style
=
PR_SOURCE
;
}
if
(
!
isEmbedded
)
{
styleCache
[
token
]
=
style
;
}
}
var
tokenStart
=
pos
;
pos
+=
token
.
length
;
if
(
!
isEmbedded
)
{
decorations
.
push
(
basePos
+
tokenStart
,
style
);
}
else
{
// Treat group 1 as an embedded block of source code.
var
embeddedSource
=
match
[
1
];
var
embeddedSourceStart
=
token
.
indexOf
(
embeddedSource
);
var
embeddedSourceEnd
=
embeddedSourceStart
+
embeddedSource
.
length
;
if
(
match
[
2
])
{
// If embeddedSource can be blank, then it would match at the
// beginning which would cause us to infinitely recurse on the
// entire token, so we catch the right context in match[2].
embeddedSourceEnd
=
token
.
length
-
match
[
2
].
length
;
embeddedSourceStart
=
embeddedSourceEnd
-
embeddedSource
.
length
;
}
var
lang
=
style
.
substring
(
5
);
// Decorate the left of the embedded source
appendDecorations
(
basePos
+
tokenStart
,
token
.
substring
(
0
,
embeddedSourceStart
),
decorate
,
decorations
);
// Decorate the embedded source
appendDecorations
(
basePos
+
tokenStart
+
embeddedSourceStart
,
embeddedSource
,
langHandlerForExtension
(
lang
,
embeddedSource
),
decorations
);
// Decorate the right of the embedded section
appendDecorations
(
basePos
+
tokenStart
+
embeddedSourceEnd
,
token
.
substring
(
embeddedSourceEnd
),
decorate
,
decorations
);
}
}
job
.
decorations
=
decorations
;
};
return
decorate
;
}
/** returns a function that produces a list of decorations from source text.
*
* This code treats ", ', and ` as string delimiters, and \ as a string
* escape. It does not recognize perl's qq() style strings.
* It has no special handling for double delimiter escapes as in basic, or
* the tripled delimiters used in python, but should work on those regardless
* although in those cases a single string literal may be broken up into
* multiple adjacent string literals.
*
* It recognizes C, C++, and shell style comments.
*
* @param {Object} options a set of optional parameters.
* @return {function (Object)} a function that examines the source code
* in the input job and builds the decoration list.
*/
function
sourceDecorator
(
options
)
{
var
shortcutStylePatterns
=
[],
fallthroughStylePatterns
=
[];
if
(
options
[
'tripleQuotedStrings'
])
{
// '''multi-line-string''', 'single-line-string', and double-quoted
shortcutStylePatterns
.
push
(
[
PR_STRING
,
/^
(?:\'\'\'(?:[^\'\\]
|
\\[\s\S]
|
\'{1,2}(?=[^\']))
*
(?:\'\'\'
|$
)
|
\"\"\"(?:[^\"\\]
|
\\[\s\S]
|
\"{1,2}(?=[^\"]))
*
(?:\"\"\"
|$
)
|
\'(?:[^\\\']
|
\\[\s\S])
*
(?:\'
|$
)
|
\"(?:[^\\\"]
|
\\[\s\S])
*
(?:\"
|$
))
/
,
null
,
'
\'
"'
]);
}
else
if
(
options
[
'multiLineStrings'
])
{
// 'multi-line-string', "multi-line-string"
shortcutStylePatterns
.
push
(
[
PR_STRING
,
/^
(?:\'(?:[^\\\']
|
\\[\s\S])
*
(?:\'
|$
)
|
\"(?:[^\\\"]
|
\\[\s\S])
*
(?:\"
|$
)
|
\`(?:[^\\\`]
|
\\[\s\S])
*
(?:\`
|$
))
/
,
null
,
'
\'
"`'
]);
}
else
{
// 'single-line-string', "single-line-string"
shortcutStylePatterns
.
push
(
[
PR_STRING
,
/^
(?:\'(?:[^\\\'\r\n]
|
\\
.
)
*
(?:\'
|$
)
|
\"(?:[^\\\"\r\n]
|
\\
.
)
*
(?:\"
|$
))
/
,
null
,
'"
\'
'
]);
}
if
(
options
[
'verbatimStrings'
])
{
// verbatim-string-literal production from the C# grammar. See issue 93.
fallthroughStylePatterns
.
push
(
[
PR_STRING
,
/^@
\"(?:[^\"]
|
\"\")
*
(?:\"
|$
)
/
,
null
]);
}
var
hc
=
options
[
'hashComments'
];
if
(
hc
)
{
if
(
options
[
'cStyleComments'
])
{
if
(
hc
>
1
)
{
// multiline hash comments
shortcutStylePatterns
.
push
(
[
PR_COMMENT
,
/^#
(?:
##
(?:[^
#
]
|#
(?!
##
))
*
(?:
###|$
)
|.*
)
/
,
null
,
'#'
]);
}
else
{
// Stop C preprocessor declarations at an unclosed open comment
shortcutStylePatterns
.
push
(
[
PR_COMMENT
,
/^#
(?:(?:
define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning
)\b
|
[^\r\n]
*
)
/
,
null
,
'#'
]);
}
fallthroughStylePatterns
.
push
(
[
PR_STRING
,
/^<
(?:(?:(?:\.\.\/)
*|
\/?)(?:[\w
-
]
+
(?:\/[\w
-
]
+
)
+
)?[\w
-
]
+
\.
h|
[
a-z
]\w
*
)
>/
,
null
]);
}
else
{
shortcutStylePatterns
.
push
([
PR_COMMENT
,
/^#
[^\r\n]
*/
,
null
,
'#'
]);
}
}
if
(
options
[
'cStyleComments'
])
{
fallthroughStylePatterns
.
push
([
PR_COMMENT
,
/^
\/\/[^\r\n]
*/
,
null
]);
fallthroughStylePatterns
.
push
(
[
PR_COMMENT
,
/^
\/\*[\s\S]
*
?(?:\*\/
|$
)
/
,
null
]);
}
if
(
options
[
'regexLiterals'
])
{
/**
* @const
*/
var
REGEX_LITERAL
=
(
// A regular expression literal starts with a slash that is
// not followed by * or / so that it is not confused with
// comments.
'/(?=[^/*])'
// and then contains any number of raw characters,
+
'(?:[^/
\\
x5B
\\
x5C]'
// escape sequences (\x5C),
+
'|
\\
x5C[
\\
s
\\
S]'
// or non-nesting character sets (\x5B\x5D);
+
'|
\\
x5B(?:[^
\\
x5C
\\
x5D]|
\\
x5C[
\\
s
\\
S])*(?:
\\
x5D|$))+'
// finally closed by a /.
+
'/'
);
fallthroughStylePatterns
.
push
(
[
'lang-regex'
,
new
RegExp
(
'^'
+
REGEXP_PRECEDER_PATTERN
+
'('
+
REGEX_LITERAL
+
')'
)
]);
}
var
types
=
options
[
'types'
];
if
(
types
)
{
fallthroughStylePatterns
.
push
([
PR_TYPE
,
types
]);
}
var
keywords
=
(
""
+
options
[
'keywords'
]).
replace
(
/^ | $/g
,
''
);
if
(
keywords
.
length
)
{
fallthroughStylePatterns
.
push
(
[
PR_KEYWORD
,
new
RegExp
(
'^(?:'
+
keywords
.
replace
(
/
[\s
,
]
+/g
,
'|'
)
+
')
\\
b'
),
null
]);
}
shortcutStylePatterns
.
push
([
PR_PLAIN
,
/^
\s
+/
,
null
,
'
\
r
\
n
\
t
\
xA0'
]);
fallthroughStylePatterns
.
push
(
// TODO(mikesamuel): recognize non-latin letters and numerals in idents
[
PR_LITERAL
,
/^@
[
a-z_$
][
a-z_$@0-9
]
*/i
,
null
],
[
PR_TYPE
,
/^
(?:[
@_
]?[
A-Z
]
+
[
a-z
][
A-Za-z_$@0-9
]
*|
\w
+_t
\b)
/
,
null
],
[
PR_PLAIN
,
/^
[
a-z_$
][
a-z_$@0-9
]
*/i
,
null
],
[
PR_LITERAL
,
new
RegExp
(
'^(?:'
// A hex number
+
'0x[a-f0-9]+'
// or an octal or decimal number,
+
'|(?:
\\
d(?:_
\\
d+)*
\\
d*(?:
\\
.
\\
d*)?|
\\
.
\\
d
\\
+)'
// possibly in scientific notation
+
'(?:e[+
\\
-]?
\\
d+)?'
+
')'
// with an optional modifier like UL for unsigned long
+
'[a-z]*'
,
'i'
),
null
,
'0123456789'
],
// Don't treat escaped quotes in bash as starting strings. See issue 144.
[
PR_PLAIN
,
/^
\\[\s\S]?
/
,
null
],
[
PR_PUNCTUATION
,
/^.
[^\s\w\.
$@
\'\"\`\/\#\\]
*/
,
null
]);
return
createSimpleLexer
(
shortcutStylePatterns
,
fallthroughStylePatterns
);
}
var
decorateSource
=
sourceDecorator
({
'keywords'
:
ALL_KEYWORDS
,
'hashComments'
:
true
,
'cStyleComments'
:
true
,
'multiLineStrings'
:
true
,
'regexLiterals'
:
true
});
/**
* Given a DOM subtree, wraps it in a list, and puts each line into its own
* list item.
*
* @param {Node} node modified in place. Its content is pulled into an
* HTMLOListElement, and each line is moved into a separate list item.
* This requires cloning elements, so the input might not have unique
* IDs after numbering.
*/
function
numberLines
(
node
,
opt_startLineNum
)
{
var
nocode
=
/
(?:
^|
\s)
nocode
(?:\s
|$
)
/
;
var
lineBreak
=
/
\r\n?
|
\n
/
;
var
document
=
node
.
ownerDocument
;
var
whitespace
;
if
(
node
.
currentStyle
)
{
whitespace
=
node
.
currentStyle
.
whiteSpace
;
}
else
if
(
window
.
getComputedStyle
)
{
whitespace
=
document
.
defaultView
.
getComputedStyle
(
node
,
null
)
.
getPropertyValue
(
'white-space'
);
}
// If it's preformatted, then we need to split lines on line breaks
// in addition to <BR>s.
var
isPreformatted
=
whitespace
&&
'pre'
===
whitespace
.
substring
(
0
,
3
);
var
li
=
document
.
createElement
(
'LI'
);
while
(
node
.
firstChild
)
{
li
.
appendChild
(
node
.
firstChild
);
}
// An array of lines. We split below, so this is initialized to one
// un-split line.
var
listItems
=
[
li
];
function
walk
(
node
)
{
switch
(
node
.
nodeType
)
{
case
1
:
// Element
if
(
nocode
.
test
(
node
.
className
))
{
break
;
}
if
(
'BR'
===
node
.
nodeName
)
{
breakAfter
(
node
);
// Discard the <BR> since it is now flush against a </LI>.
if
(
node
.
parentNode
)
{
node
.
parentNode
.
removeChild
(
node
);
}
}
else
{
for
(
var
child
=
node
.
firstChild
;
child
;
child
=
child
.
nextSibling
)
{
walk
(
child
);
}
}
break
;
case
3
:
case
4
:
// Text
if
(
isPreformatted
)
{
var
text
=
node
.
nodeValue
;
var
match
=
text
.
match
(
lineBreak
);
if
(
match
)
{
var
firstLine
=
text
.
substring
(
0
,
match
.
index
);
node
.
nodeValue
=
firstLine
;
var
tail
=
text
.
substring
(
match
.
index
+
match
[
0
].
length
);
if
(
tail
)
{
var
parent
=
node
.
parentNode
;
parent
.
insertBefore
(
document
.
createTextNode
(
tail
),
node
.
nextSibling
);
}
breakAfter
(
node
);
if
(
!
firstLine
)
{
// Don't leave blank text nodes in the DOM.
node
.
parentNode
.
removeChild
(
node
);
}
}
}
break
;
}
}
// Split a line after the given node.
function
breakAfter
(
lineEndNode
)
{
// If there's nothing to the right, then we can skip ending the line
// here, and move root-wards since splitting just before an end-tag
// would require us to create a bunch of empty copies.
while
(
!
lineEndNode
.
nextSibling
)
{
lineEndNode
=
lineEndNode
.
parentNode
;
if
(
!
lineEndNode
)
{
return
;
}
}
function
breakLeftOf
(
limit
,
copy
)
{
// Clone shallowly if this node needs to be on both sides of the break.
var
rightSide
=
copy
?
limit
.
cloneNode
(
false
)
:
limit
;
var
parent
=
limit
.
parentNode
;
if
(
parent
)
{
// We clone the parent chain.
// This helps us resurrect important styling elements that cross lines.
// E.g. in <i>Foo<br>Bar</i>
// should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.
var
parentClone
=
breakLeftOf
(
parent
,
1
);
// Move the clone and everything to the right of the original
// onto the cloned parent.
var
next
=
limit
.
nextSibling
;
parentClone
.
appendChild
(
rightSide
);
for
(
var
sibling
=
next
;
sibling
;
sibling
=
next
)
{
next
=
sibling
.
nextSibling
;
parentClone
.
appendChild
(
sibling
);
}
}
return
rightSide
;
}
var
copiedListItem
=
breakLeftOf
(
lineEndNode
.
nextSibling
,
0
);
// Walk the parent chain until we reach an unattached LI.
for
(
var
parent
;
// Check nodeType since IE invents document fragments.
(
parent
=
copiedListItem
.
parentNode
)
&&
parent
.
nodeType
===
1
;)
{
copiedListItem
=
parent
;
}
// Put it on the list of lines for later processing.
listItems
.
push
(
copiedListItem
);
}
// Split lines while there are lines left to split.
for
(
var
i
=
0
;
// Number of lines that have been split so far.
i
<
listItems
.
length
;
// length updated by breakAfter calls.
++
i
)
{
walk
(
listItems
[
i
]);
}
// Make sure numeric indices show correctly.
if
(
opt_startLineNum
===
(
opt_startLineNum
|
0
))
{
listItems
[
0
].
setAttribute
(
'value'
,
opt_startLineNum
);
}
var
ol
=
document
.
createElement
(
'OL'
);
ol
.
className
=
'linenums'
;
var
offset
=
Math
.
max
(
0
,
((
opt_startLineNum
-
1
/* zero index */
))
|
0
)
||
0
;
for
(
var
i
=
0
,
n
=
listItems
.
length
;
i
<
n
;
++
i
)
{
li
=
listItems
[
i
];
// Stick a class on the LIs so that stylesheets can
// color odd/even rows, or any other row pattern that
// is co-prime with 10.
li
.
className
=
'L'
+
((
i
+
offset
)
%
10
);
if
(
!
li
.
firstChild
)
{
li
.
appendChild
(
document
.
createTextNode
(
'
\
xA0'
));
}
ol
.
appendChild
(
li
);
}
node
.
appendChild
(
ol
);
}
/**
* Breaks {@code job.sourceCode} around style boundaries in
* {@code job.decorations} and modifies {@code job.sourceNode} in place.
* @param {Object} job like <pre>{
* sourceCode: {string} source as plain text,
* spans: {Array.<number|Node>} alternating span start indices into source
* and the text node or element (e.g. {@code <BR>}) corresponding to that
* span.
* decorations: {Array.<number|string} an array of style classes preceded
* by the position at which they start in job.sourceCode in order
* }</pre>
* @private
*/
function
recombineTagsAndDecorations
(
job
)
{
var
isIE
=
/
\b
MSIE
\b
/
.
test
(
navigator
.
userAgent
);
var
newlineRe
=
/
\n
/g
;
var
source
=
job
.
sourceCode
;
var
sourceLength
=
source
.
length
;
// Index into source after the last code-unit recombined.
var
sourceIndex
=
0
;
var
spans
=
job
.
spans
;
var
nSpans
=
spans
.
length
;
// Index into spans after the last span which ends at or before sourceIndex.
var
spanIndex
=
0
;
var
decorations
=
job
.
decorations
;
var
nDecorations
=
decorations
.
length
;
// Index into decorations after the last decoration which ends at or before
// sourceIndex.
var
decorationIndex
=
0
;
// Remove all zero-length decorations.
decorations
[
nDecorations
]
=
sourceLength
;
var
decPos
,
i
;
for
(
i
=
decPos
=
0
;
i
<
nDecorations
;)
{
if
(
decorations
[
i
]
!==
decorations
[
i
+
2
])
{
decorations
[
decPos
++
]
=
decorations
[
i
++
];
decorations
[
decPos
++
]
=
decorations
[
i
++
];
}
else
{
i
+=
2
;
}
}
nDecorations
=
decPos
;
// Simplify decorations.
for
(
i
=
decPos
=
0
;
i
<
nDecorations
;)
{
var
startPos
=
decorations
[
i
];
// Conflate all adjacent decorations that use the same style.
var
startDec
=
decorations
[
i
+
1
];
var
end
=
i
+
2
;
while
(
end
+
2
<=
nDecorations
&&
decorations
[
end
+
1
]
===
startDec
)
{
end
+=
2
;
}
decorations
[
decPos
++
]
=
startPos
;
decorations
[
decPos
++
]
=
startDec
;
i
=
end
;
}
nDecorations
=
decorations
.
length
=
decPos
;
var
decoration
=
null
;
while
(
spanIndex
<
nSpans
)
{
var
spanStart
=
spans
[
spanIndex
];
var
spanEnd
=
spans
[
spanIndex
+
2
]
||
sourceLength
;
var
decStart
=
decorations
[
decorationIndex
];
var
decEnd
=
decorations
[
decorationIndex
+
2
]
||
sourceLength
;
var
end
=
Math
.
min
(
spanEnd
,
decEnd
);
var
textNode
=
spans
[
spanIndex
+
1
];
var
styledText
;
if
(
textNode
.
nodeType
!==
1
// Don't muck with <BR>s or <LI>s
// Don't introduce spans around empty text nodes.
&&
(
styledText
=
source
.
substring
(
sourceIndex
,
end
)))
{
// This may seem bizarre, and it is. Emitting LF on IE causes the
// code to display with spaces instead of line breaks.
// Emitting Windows standard issue linebreaks (CRLF) causes a blank
// space to appear at the beginning of every line but the first.
// Emitting an old Mac OS 9 line separator makes everything spiffy.
if
(
isIE
)
{
styledText
=
styledText
.
replace
(
newlineRe
,
'
\
r'
);
}
textNode
.
nodeValue
=
styledText
;
var
document
=
textNode
.
ownerDocument
;
var
span
=
document
.
createElement
(
'SPAN'
);
span
.
className
=
decorations
[
decorationIndex
+
1
];
var
parentNode
=
textNode
.
parentNode
;
parentNode
.
replaceChild
(
span
,
textNode
);
span
.
appendChild
(
textNode
);
if
(
sourceIndex
<
spanEnd
)
{
// Split off a text node.
spans
[
spanIndex
+
1
]
=
textNode
// TODO: Possibly optimize by using '' if there's no flicker.
=
document
.
createTextNode
(
source
.
substring
(
end
,
spanEnd
));
parentNode
.
insertBefore
(
textNode
,
span
.
nextSibling
);
}
}
sourceIndex
=
end
;
if
(
sourceIndex
>=
spanEnd
)
{
spanIndex
+=
2
;
}
if
(
sourceIndex
>=
decEnd
)
{
decorationIndex
+=
2
;
}
}
}
/** Maps language-specific file extensions to handlers. */
var
langHandlerRegistry
=
{};
/** Register a language handler for the given file extensions.
* @param {function (Object)} handler a function from source code to a list
* of decorations. Takes a single argument job which describes the
* state of the computation. The single parameter has the form
* {@code {
* sourceCode: {string} as plain text.
* decorations: {Array.<number|string>} an array of style classes
* preceded by the position at which they start in
* job.sourceCode in order.
* The language handler should assigned this field.
* basePos: {int} the position of source in the larger source chunk.
* All positions in the output decorations array are relative
* to the larger source chunk.
* } }
* @param {Array.<string>} fileExtensions
*/
function
registerLangHandler
(
handler
,
fileExtensions
)
{
for
(
var
i
=
fileExtensions
.
length
;
--
i
>=
0
;)
{
var
ext
=
fileExtensions
[
i
];
if
(
!
langHandlerRegistry
.
hasOwnProperty
(
ext
))
{
langHandlerRegistry
[
ext
]
=
handler
;
}
else
if
(
window
[
'console'
])
{
console
[
'warn'
](
'cannot override language handler %s'
,
ext
);
}
}
}
function
langHandlerForExtension
(
extension
,
source
)
{
if
(
!
(
extension
&&
langHandlerRegistry
.
hasOwnProperty
(
extension
)))
{
// Treat it as markup if the first non whitespace character is a < and
// the last non-whitespace character is a >.
extension
=
/^
\s
*</
.
test
(
source
)
?
'default-markup'
:
'default-code'
;
}
return
langHandlerRegistry
[
extension
];
}
registerLangHandler
(
decorateSource
,
[
'default-code'
]);
registerLangHandler
(
createSimpleLexer
(
[],
[
[
PR_PLAIN
,
/^
[^
<?
]
+/
],
[
PR_DECLARATION
,
/^<!
\w[^
>
]
*
(?:
>|$
)
/
],
[
PR_COMMENT
,
/^<
\!
--
[\s\S]
*
?(?:
-
\-
>|$
)
/
],
// Unescaped content in an unknown language
[
'lang-'
,
/^<
\?([\s\S]
+
?)(?:\?
>|$
)
/
],
[
'lang-'
,
/^<%
([\s\S]
+
?)(?:
%>|$
)
/
],
[
PR_PUNCTUATION
,
/^
(?:
<
[
%?
]
|
[
%?
]
>
)
/
],
[
'lang-'
,
/^<xmp
\b[^
>
]
*>
([\s\S]
+
?)
<
\/
xmp
\b[^
>
]
*>/i
],
// Unescaped content in javascript. (Or possibly vbscript).
[
'lang-js'
,
/^<script
\b[^
>
]
*>
([\s\S]
*
?)(
<
\/
script
\b[^
>
]
*>
)
/i
],
// Contains unescaped stylesheet content
[
'lang-css'
,
/^<style
\b[^
>
]
*>
([\s\S]
*
?)(
<
\/
style
\b[^
>
]
*>
)
/i
],
[
'lang-in.tag'
,
/^
(
<
\/?[
a-z
][^
<>
]
*>
)
/i
]
]),
[
'default-markup'
,
'htm'
,
'html'
,
'mxml'
,
'xhtml'
,
'xml'
,
'xsl'
]);
registerLangHandler
(
createSimpleLexer
(
[
[
PR_PLAIN
,
/^
[\s]
+/
,
null
,
'
\
t
\
r
\
n'
],
[
PR_ATTRIB_VALUE
,
/^
(?:\"[^\"]
*
\"?
|
\'[^\']
*
\'?)
/
,
null
,
'
\
"
\'
'
]
],
[
[
PR_TAG
,
/^^<
\/?[
a-z
](?:[\w
.:-
]
*
\w)?
|
\/?
>$/i
],
[
PR_ATTRIB_NAME
,
/^
(?!
style
[\s
=
]
|on
)[
a-z
](?:[\w
:-
]
*
\w)?
/i
],
[
'lang-uq.val'
,
/^=
\s
*
([^
>
\'\"\s]
*
(?:[^
>
\'\"\s\/]
|
\/(?=\s)))
/
],
[
PR_PUNCTUATION
,
/^
[
=<>
\/]
+/
],
[
'lang-js'
,
/^on
\w
+
\s
*=
\s
*
\"([^\"]
+
)\"
/i
],
[
'lang-js'
,
/^on
\w
+
\s
*=
\s
*
\'([^\']
+
)\'
/i
],
[
'lang-js'
,
/^on
\w
+
\s
*=
\s
*
([^\"\'
>
\s]
+
)
/i
],
[
'lang-css'
,
/^style
\s
*=
\s
*
\"([^\"]
+
)\"
/i
],
[
'lang-css'
,
/^style
\s
*=
\s
*
\'([^\']
+
)\'
/i
],
[
'lang-css'
,
/^style
\s
*=
\s
*
([^\"\'
>
\s]
+
)
/i
]
]),
[
'in.tag'
]);
registerLangHandler
(
createSimpleLexer
([],
[[
PR_ATTRIB_VALUE
,
/^
[\s\S]
+/
]]),
[
'uq.val'
]);
registerLangHandler
(
sourceDecorator
({
'keywords'
:
CPP_KEYWORDS
,
'hashComments'
:
true
,
'cStyleComments'
:
true
,
'types'
:
C_TYPES
}),
[
'c'
,
'cc'
,
'cpp'
,
'cxx'
,
'cyc'
,
'm'
]);
registerLangHandler
(
sourceDecorator
({
'keywords'
:
'null,true,false'
}),
[
'json'
]);
registerLangHandler
(
sourceDecorator
({
'keywords'
:
CSHARP_KEYWORDS
,
'hashComments'
:
true
,
'cStyleComments'
:
true
,
'verbatimStrings'
:
true
,
'types'
:
C_TYPES
}),
[
'cs'
]);
registerLangHandler
(
sourceDecorator
({
'keywords'
:
JAVA_KEYWORDS
,
'cStyleComments'
:
true
}),
[
'java'
]);
registerLangHandler
(
sourceDecorator
({
'keywords'
:
SH_KEYWORDS
,
'hashComments'
:
true
,
'multiLineStrings'
:
true
}),
[
'bsh'
,
'csh'
,
'sh'
]);
registerLangHandler
(
sourceDecorator
({
'keywords'
:
PYTHON_KEYWORDS
,
'hashComments'
:
true
,
'multiLineStrings'
:
true
,
'tripleQuotedStrings'
:
true
}),
[
'cv'
,
'py'
]);
registerLangHandler
(
sourceDecorator
({
'keywords'
:
PERL_KEYWORDS
,
'hashComments'
:
true
,
'multiLineStrings'
:
true
,
'regexLiterals'
:
true
}),
[
'perl'
,
'pl'
,
'pm'
]);
registerLangHandler
(
sourceDecorator
({
'keywords'
:
RUBY_KEYWORDS
,
'hashComments'
:
true
,
'multiLineStrings'
:
true
,
'regexLiterals'
:
true
}),
[
'rb'
]);
registerLangHandler
(
sourceDecorator
({
'keywords'
:
JSCRIPT_KEYWORDS
,
'cStyleComments'
:
true
,
'regexLiterals'
:
true
}),
[
'js'
]);
registerLangHandler
(
sourceDecorator
({
'keywords'
:
COFFEE_KEYWORDS
,
'hashComments'
:
3
,
// ### style block comments
'cStyleComments'
:
true
,
'multilineStrings'
:
true
,
'tripleQuotedStrings'
:
true
,
'regexLiterals'
:
true
}),
[
'coffee'
]);
registerLangHandler
(
createSimpleLexer
([],
[[
PR_STRING
,
/^
[\s\S]
+/
]]),
[
'regex'
]);
function
applyDecorator
(
job
)
{
var
opt_langExtension
=
job
.
langExtension
;
try
{
// Extract tags, and convert the source code to plain text.
var
sourceAndSpans
=
extractSourceSpans
(
job
.
sourceNode
);
/** Plain text. @type {string} */
var
source
=
sourceAndSpans
.
sourceCode
;
job
.
sourceCode
=
source
;
job
.
spans
=
sourceAndSpans
.
spans
;
job
.
basePos
=
0
;
// Apply the appropriate language handler
langHandlerForExtension
(
opt_langExtension
,
source
)(
job
);
// Integrate the decorations and tags back into the source code,
// modifying the sourceNode in place.
recombineTagsAndDecorations
(
job
);
}
catch
(
e
)
{
if
(
'console'
in
window
)
{
console
[
'log'
](
e
&&
e
[
'stack'
]
?
e
[
'stack'
]
:
e
);
}
}
}
/**
* @param sourceCodeHtml {string} The HTML to pretty print.
* @param opt_langExtension {string} The language name to use.
* Typically, a filename extension like 'cpp' or 'java'.
* @param opt_numberLines {number|boolean} True to number lines,
* or the 1-indexed number of the first line in sourceCodeHtml.
*/
function
prettyPrintOne
(
sourceCodeHtml
,
opt_langExtension
,
opt_numberLines
)
{
var
container
=
document
.
createElement
(
'PRE'
);
// This could cause images to load and onload listeners to fire.
// E.g. <img onerror="alert(1337)" src="nosuchimage.png">.
// We assume that the inner HTML is from a trusted source.
container
.
innerHTML
=
sourceCodeHtml
;
if
(
opt_numberLines
)
{
numberLines
(
container
,
opt_numberLines
);
}
var
job
=
{
langExtension
:
opt_langExtension
,
numberLines
:
opt_numberLines
,
sourceNode
:
container
};
applyDecorator
(
job
);
return
container
.
innerHTML
;
}
function
prettyPrint
(
opt_whenDone
)
{
function
byTagName
(
tn
)
{
return
document
.
getElementsByTagName
(
tn
);
}
// fetch a list of nodes to rewrite
var
codeSegments
=
[
byTagName
(
'pre'
),
byTagName
(
'code'
),
byTagName
(
'xmp'
)];
var
elements
=
[];
for
(
var
i
=
0
;
i
<
codeSegments
.
length
;
++
i
)
{
for
(
var
j
=
0
,
n
=
codeSegments
[
i
].
length
;
j
<
n
;
++
j
)
{
elements
.
push
(
codeSegments
[
i
][
j
]);
}
}
codeSegments
=
null
;
var
clock
=
Date
;
if
(
!
clock
[
'now'
])
{
clock
=
{
'now'
:
function
()
{
return
+
(
new
Date
);
}
};
}
// The loop is broken into a series of continuations to make sure that we
// don't make the browser unresponsive when rewriting a large page.
var
k
=
0
;
var
prettyPrintingJob
;
var
langExtensionRe
=
/
\b
lang
(?:
uage
)?
-
([\w
.
]
+
)(?!\S)
/
;
var
prettyPrintRe
=
/
\b
prettyprint
\b
/
;
function
doWork
()
{
var
endTime
=
(
window
[
'PR_SHOULD_USE_CONTINUATION'
]
?
clock
[
'now'
]()
+
250
/* ms */
:
Infinity
);
for
(;
k
<
elements
.
length
&&
clock
[
'now'
]()
<
endTime
;
k
++
)
{
var
cs
=
elements
[
k
];
var
className
=
cs
.
className
;
if
(
className
.
indexOf
(
'prettyprint'
)
>=
0
)
{
// If the classes includes a language extensions, use it.
// Language extensions can be specified like
// <pre class="prettyprint lang-cpp">
// the language extension "cpp" is used to find a language handler as
// passed to PR.registerLangHandler.
// HTML5 recommends that a language be specified using "language-"
// as the prefix instead. Google Code Prettify supports both.
// http://dev.w3.org/html5/spec-author-view/the-code-element.html
var
langExtension
=
className
.
match
(
langExtensionRe
);
// Support <pre class="prettyprint"><code class="language-c">
var
wrapper
;
if
(
!
langExtension
&&
(
wrapper
=
childContentWrapper
(
cs
))
&&
"CODE"
===
wrapper
.
tagName
)
{
langExtension
=
wrapper
.
className
.
match
(
langExtensionRe
);
}
if
(
langExtension
)
{
langExtension
=
langExtension
[
1
];
}
// make sure this is not nested in an already prettified element
var
nested
=
false
;
for
(
var
p
=
cs
.
parentNode
;
p
;
p
=
p
.
parentNode
)
{
if
((
p
.
tagName
===
'pre'
||
p
.
tagName
===
'code'
||
p
.
tagName
===
'xmp'
)
&&
p
.
className
&&
p
.
className
.
indexOf
(
'prettyprint'
)
>=
0
)
{
nested
=
true
;
break
;
}
}
if
(
!
nested
)
{
// Look for a class like linenums or linenums:<n> where <n> is the
// 1-indexed number of the first line.
var
lineNums
=
cs
.
className
.
match
(
/
\b
linenums
\b(?:
:
(\d
+
))?
/
);
lineNums
=
lineNums
?
lineNums
[
1
]
&&
lineNums
[
1
].
length
?
+
lineNums
[
1
]
:
true
:
false
;
if
(
lineNums
)
{
numberLines
(
cs
,
lineNums
);
}
// do the pretty printing
prettyPrintingJob
=
{
langExtension
:
langExtension
,
sourceNode
:
cs
,
numberLines
:
lineNums
};
applyDecorator
(
prettyPrintingJob
);
}
}
}
if
(
k
<
elements
.
length
)
{
// finish up in a continuation
setTimeout
(
doWork
,
250
);
}
else
if
(
opt_whenDone
)
{
opt_whenDone
();
}
}
doWork
();
}
/**
* Find all the {@code <pre>} and {@code <code>} tags in the DOM with
* {@code class=prettyprint} and prettify them.
*
* @param {Function?} opt_whenDone if specified, called when the last entry
* has been finished.
*/
window
[
'prettyPrintOne'
]
=
prettyPrintOne
;
/**
* Pretty print a chunk of code.
*
* @param {string} sourceCodeHtml code as html
* @return {string} code as html, but prettier
*/
window
[
'prettyPrint'
]
=
prettyPrint
;
/**
* Contains functions for creating and registering new language handlers.
* @type {Object}
*/
window
[
'PR'
]
=
{
'createSimpleLexer'
:
createSimpleLexer
,
'registerLangHandler'
:
registerLangHandler
,
'sourceDecorator'
:
sourceDecorator
,
'PR_ATTRIB_NAME'
:
PR_ATTRIB_NAME
,
'PR_ATTRIB_VALUE'
:
PR_ATTRIB_VALUE
,
'PR_COMMENT'
:
PR_COMMENT
,
'PR_DECLARATION'
:
PR_DECLARATION
,
'PR_KEYWORD'
:
PR_KEYWORD
,
'PR_LITERAL'
:
PR_LITERAL
,
'PR_NOCODE'
:
PR_NOCODE
,
'PR_PLAIN'
:
PR_PLAIN
,
'PR_PUNCTUATION'
:
PR_PUNCTUATION
,
'PR_SOURCE'
:
PR_SOURCE
,
'PR_STRING'
:
PR_STRING
,
'PR_TAG'
:
PR_TAG
,
'PR_TYPE'
:
PR_TYPE
};
})();
bundles/docs/routes.php
0 → 100644
View file @
902e8c75
<?php
View
::
composer
(
'docs::template'
,
function
(
$view
)
{
Asset
::
add
(
'stylesheet'
,
'css/style.css'
);
Asset
::
add
(
'modernizr'
,
'js/modernizr-2.5.3.min.js'
);
Asset
::
container
(
'footer'
)
->
add
(
'prettify'
,
'js/prettify.js'
);
});
Route
::
get
(
'(:bundle)'
,
function
()
{
return
View
::
make
(
'docs::home'
);
});
bundles/docs/views/home.blade.php
0 → 100644
View file @
902e8c75
@
layout
(
'docs::template'
)
@
section
(
'content'
)
<
h3
>
Learn
the
terrain
.</
h3
>
<
p
>
You
've landed yourself on our <code>default</code> home page. The route that
is generating this page lives at:
</p>
<pre>APP_PATH/routes.php</pre>
<pre class="prettyprint lang-php linenums">
return array(
'
welcome
' => '
Welcome
to
our
website
!
',
);
</pre>
<p>And the view sitting before you can be found at:</p>
<pre>APP_PATH/views/home/index.php</pre>
<h3>Create something beautiful.</h3>
<p>
Now that you'
re
up
and
running
,
it
'
s
time
to
start
creating
!
Here
are
some
links
to
help
you
get
started
:
</
p
>
<
ul
>
<
li
><
a
href
=
"http://laravel.com"
>
Official
Website
</
a
></
li
>
<
li
><
a
href
=
"http://forums.laravel.com"
>
Laravel
Forums
</
a
></
li
>
<
li
><
a
href
=
"http://github.com/laravel/laravel"
>
GitHub
Repository
</
a
></
li
>
</
ul
>
@
endsection
bundles/docs/views/menu.blade.php
0 → 100644
View file @
902e8c75
<h3>
Documentation
</h3>
<ul
class=
"menu"
>
<li><a
href=
"#"
>
Menu Item
</a></li>
<li><a
href=
"#"
>
Menu Item
</a></li>
<li><a
href=
"#"
>
Menu Item
</a>
<ul>
<li><a
href=
"#"
>
Sub Menu Item
</a></li>
<li><a
href=
"#"
>
Sub Menu Item
</a></li>
</ul>
</li>
<li><a
href=
"#"
>
Menu Item
</a></li>
<li><a
href=
"#"
>
Menu Item
</a></li>
<li><a
href=
"#"
>
Menu Item
</a>
<ul>
<li><a
href=
"#"
>
Sub Menu Item
</a></li>
<li><a
href=
"#"
>
Sub Menu Item
</a></li>
<li><a
href=
"#"
>
Sub Menu Item
</a></li>
</ul>
</li>
<li><a
href=
"#"
>
Menu Item
</a></li>
<li><a
href=
"#"
>
Menu Item
</a></li>
<li><a
href=
"#"
>
Menu Item
</a></li>
<li><a
href=
"#"
>
Menu Item
</a></li>
<li><a
href=
"#"
>
Menu Item
</a></li>
<li><a
href=
"#"
>
Menu Item
</a></li>
<li><a
href=
"#"
>
Menu Item
</a></li>
</ul>
\ No newline at end of file
bundles/docs/views/template.blade.php
0 → 100644
View file @
902e8c75
<!doctype html>
<html
lang=
"en"
>
<head>
<meta
charset=
"utf-8"
>
<meta
http-equiv=
"X-UA-Compatible"
content=
"IE=edge,chrome=1"
>
<title>
Laravel: A Framework For Web Artisans
</title>
<meta
name=
"viewport"
content=
"width=device-width"
>
{{ Asset::bundle('docs')->styles(); }}
{{ Asset::bundle('docs')->scripts(); }}
</head>
<body
onload=
"prettyPrint()"
>
<div
class=
"wrapper"
>
<header>
<h1>
Laravel
</h1>
<h2>
A Framework For Web Artisans
</h2>
<p>
You have successfully installed the Laravel framework. Laravel is a simple framework
that helps web artisans create beautiful, creative applications using elegant, expressive
syntax. You'll love using it.
</p>
</header>
<div
role=
"main"
class=
"main"
>
<aside
class=
"sidebar"
>
@include('docs::menu')
</aside>
<div
class=
"content"
>
@yield('content')
</div>
</div>
</div>
{{ Asset::container('footer')->bundle('docs')->scripts(); }}
</body>
</html>
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