Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
MCMS
Commits
53f587bc
Commit
53f587bc
authored
Dec 27, 2019
by
zhongyh
Browse files
提交资源文件
parent
f40087b8
Changes
278
Hide whitespace changes
Inline
Side-by-side
Too many changes to show.
To preserve performance only
20 of 278+
files are displayed.
Plain diff
Email patch
src/main/webapp/static/plugins/codemirror/5.48.4/mode/haml/test.js
0 → 100644
View file @
53f587bc
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
(
function
()
{
var
mode
=
CodeMirror
.
getMode
({
tabSize
:
4
,
indentUnit
:
2
},
"
haml
"
);
function
MT
(
name
)
{
test
.
mode
(
name
,
mode
,
Array
.
prototype
.
slice
.
call
(
arguments
,
1
));
}
// Requires at least one media query
MT
(
"
elementName
"
,
"
[tag %h1] Hey There
"
);
MT
(
"
oneElementPerLine
"
,
"
[tag %h1] Hey There %h2
"
);
MT
(
"
idSelector
"
,
"
[tag %h1][attribute #test] Hey There
"
);
MT
(
"
classSelector
"
,
"
[tag %h1][attribute .hello] Hey There
"
);
MT
(
"
docType
"
,
"
[tag !!! XML]
"
);
MT
(
"
comment
"
,
"
[comment / Hello WORLD]
"
);
MT
(
"
notComment
"
,
"
[tag %h1] This is not a / comment
"
);
MT
(
"
attributes
"
,
"
[tag %a]([variable title][operator =][string
\"
test
\"
]){[atom :title] [operator =>] [string
\"
test
\"
]}
"
);
MT
(
"
htmlCode
"
,
"
[tag&bracket <][tag h1][tag&bracket >]Title[tag&bracket </][tag h1][tag&bracket >]
"
);
MT
(
"
rubyBlock
"
,
"
[operator =][variable-2 @item]
"
);
MT
(
"
selectorRubyBlock
"
,
"
[tag %a.selector=] [variable-2 @item]
"
);
MT
(
"
nestedRubyBlock
"
,
"
[tag %a]
"
,
"
[operator =][variable puts] [string
\"
test
\"
]
"
);
MT
(
"
multilinePlaintext
"
,
"
[tag %p]
"
,
"
Hello,
"
,
"
World
"
);
MT
(
"
multilineRuby
"
,
"
[tag %p]
"
,
"
[comment -# this is a comment]
"
,
"
[comment and this is a comment too]
"
,
"
Date/Time
"
,
"
[operator -] [variable now] [operator =] [tag DateTime][operator .][property now]
"
,
"
[tag %strong=] [variable now]
"
,
"
[operator -] [keyword if] [variable now] [operator >] [tag DateTime][operator .][property parse]([string
\"
December 31, 2006
\"
])
"
,
"
[operator =][string
\"
Happy
\"
]
"
,
"
[operator =][string
\"
Belated
\"
]
"
,
"
[operator =][string
\"
Birthday
\"
]
"
);
MT
(
"
multilineComment
"
,
"
[comment /]
"
,
"
[comment Multiline]
"
,
"
[comment Comment]
"
);
MT
(
"
hamlComment
"
,
"
[comment -# this is a comment]
"
);
MT
(
"
multilineHamlComment
"
,
"
[comment -# this is a comment]
"
,
"
[comment and this is a comment too]
"
);
MT
(
"
multilineHTMLComment
"
,
"
[comment <!--]
"
,
"
[comment what a comment]
"
,
"
[comment -->]
"
);
MT
(
"
hamlAfterRubyTag
"
,
"
[attribute .block]
"
,
"
[tag %strong=] [variable now]
"
,
"
[attribute .test]
"
,
"
[operator =][variable now]
"
,
"
[attribute .right]
"
);
MT
(
"
stretchedRuby
"
,
"
[operator =] [variable puts] [string
\"
Hello
\"
],
"
,
"
[string
\"
World
\"
]
"
);
MT
(
"
interpolationInHashAttribute
"
,
//"[tag %div]{[atom :id] [operator =>] [string \"#{][variable test][string }_#{][variable ting][string }\"]} test");
"
[tag %div]{[atom :id] [operator =>] [string
\"
#{][variable test][string }_#{][variable ting][string }
\"
]} test
"
);
MT
(
"
interpolationInHTMLAttribute
"
,
"
[tag %div]([variable title][operator =][string
\"
#{][variable test][string }_#{][variable ting]()[string }
\"
]) Test
"
);
})();
src/main/webapp/static/plugins/codemirror/5.48.4/mode/handlebars/handlebars.js
0 → 100644
View file @
53f587bc
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
(
function
(
mod
)
{
if
(
typeof
exports
==
"
object
"
&&
typeof
module
==
"
object
"
)
// CommonJS
mod
(
require
(
"
../../lib/codemirror
"
),
require
(
"
../../addon/mode/simple
"
),
require
(
"
../../addon/mode/multiplex
"
));
else
if
(
typeof
define
==
"
function
"
&&
define
.
amd
)
// AMD
define
([
"
../../lib/codemirror
"
,
"
../../addon/mode/simple
"
,
"
../../addon/mode/multiplex
"
],
mod
);
else
// Plain browser env
mod
(
CodeMirror
);
})(
function
(
CodeMirror
)
{
"
use strict
"
;
CodeMirror
.
defineSimpleMode
(
"
handlebars-tags
"
,
{
start
:
[
{
regex
:
/
\{\{\{
/
,
push
:
"
handlebars_raw
"
,
token
:
"
tag
"
},
{
regex
:
/
\{\{
!--/
,
push
:
"
dash_comment
"
,
token
:
"
comment
"
},
{
regex
:
/
\{\{
!/
,
push
:
"
comment
"
,
token
:
"
comment
"
},
{
regex
:
/
\{\{
/
,
push
:
"
handlebars
"
,
token
:
"
tag
"
}
],
handlebars_raw
:
[
{
regex
:
/
\}\}\}
/
,
pop
:
true
,
token
:
"
tag
"
},
],
handlebars
:
[
{
regex
:
/
\}\}
/
,
pop
:
true
,
token
:
"
tag
"
},
// Double and single quotes
{
regex
:
/"
(?:[^\\
"
]
|
\\
.
)
*"
?
/
,
token
:
"
string
"
},
{
regex
:
/'
(?:[^\\
'
]
|
\\
.
)
*'
?
/
,
token
:
"
string
"
},
// Handlebars keywords
{
regex
:
/>|
[
#
\/]([
A-Za-z_
]\w
*
)
/
,
token
:
"
keyword
"
},
{
regex
:
/
(?:
else|this
)\b
/
,
token
:
"
keyword
"
},
// Numeral
{
regex
:
/
\d
+/i
,
token
:
"
number
"
},
// Atoms like = and .
{
regex
:
/=|~|@|true|false/
,
token
:
"
atom
"
},
// Paths
{
regex
:
/
(?:\.\.\/)
*
(?:[
A-Za-z_
][\w\.]
*
)
+/
,
token
:
"
variable-2
"
}
],
dash_comment
:
[
{
regex
:
/--
\}\}
/
,
pop
:
true
,
token
:
"
comment
"
},
// Commented code
{
regex
:
/./
,
token
:
"
comment
"
}
],
comment
:
[
{
regex
:
/
\}\}
/
,
pop
:
true
,
token
:
"
comment
"
},
{
regex
:
/./
,
token
:
"
comment
"
}
],
meta
:
{
blockCommentStart
:
"
{{--
"
,
blockCommentEnd
:
"
--}}
"
}
});
CodeMirror
.
defineMode
(
"
handlebars
"
,
function
(
config
,
parserConfig
)
{
var
handlebars
=
CodeMirror
.
getMode
(
config
,
"
handlebars-tags
"
);
if
(
!
parserConfig
||
!
parserConfig
.
base
)
return
handlebars
;
return
CodeMirror
.
multiplexingMode
(
CodeMirror
.
getMode
(
config
,
parserConfig
.
base
),
{
open
:
"
{{
"
,
close
:
"
}}
"
,
mode
:
handlebars
,
parseDelimiters
:
true
}
);
});
CodeMirror
.
defineMIME
(
"
text/x-handlebars-template
"
,
"
handlebars
"
);
});
src/main/webapp/static/plugins/codemirror/5.48.4/mode/handlebars/index.html
0 → 100644
View file @
53f587bc
<!doctype html>
<title>
CodeMirror: Handlebars mode
</title>
<meta
charset=
"utf-8"
/>
<link
rel=
stylesheet
href=
"../../doc/docs.css"
>
<link
rel=
"stylesheet"
href=
"../../lib/codemirror.css"
>
<script
src=
"../../lib/codemirror.js"
></script>
<script
src=
"../../addon/mode/simple.js"
></script>
<script
src=
"../../addon/mode/multiplex.js"
></script>
<script
src=
"../../addon/edit/matchbrackets.js"
></script>
<script
src=
"../xml/xml.js"
></script>
<script
src=
"handlebars.js"
></script>
<style>
.CodeMirror
{
border-top
:
1px
solid
black
;
border-bottom
:
1px
solid
black
;}
</style>
<div
id=
nav
>
<a
href=
"https://codemirror.net"
><h1>
CodeMirror
</h1><img
id=
logo
src=
"../../doc/logo.png"
></a>
<ul>
<li><a
href=
"../../index.html"
>
Home
</a>
<li><a
href=
"../../doc/manual.html"
>
Manual
</a>
<li><a
href=
"https://github.com/codemirror/codemirror"
>
Code
</a>
</ul>
<ul>
<li><a
href=
"../index.html"
>
Language modes
</a>
<li><a
class=
active
href=
"#"
>
HTML mixed
</a>
</ul>
</div>
<article>
<h2>
Handlebars
</h2>
<form><textarea
id=
"code"
name=
"code"
>
{{> breadcrumbs}}
{{!--
You can use the t function to get
content translated to the current locale, es:
{{t 'article_list'}}
--}}
<h1>
{{t 'article_list'}}
</h1>
{{! one line comment }}
{{{propertyContainingRawHtml}}}
{{#each articles}}
{{~title}}
<p>
{{excerpt body size=120 ellipsis=true}}
</p>
{{#with author}}
written by {{first_name}} {{last_name}}
from category: {{../category.title}}
{{#if @../last}}foobar!{{/if}}
{{/with~}}
{{#if promoted.latest}}Read this one! {{else}} This is ok! {{/if}}
{{#if @last}}
<hr>
{{/if}}
{{/each}}
{{#form new_comment}}
<input
type=
"text"
name=
"body"
>
{{/form}}
</textarea></form>
<script>
var
editor
=
CodeMirror
.
fromTextArea
(
document
.
getElementById
(
"
code
"
),
{
lineNumbers
:
true
,
matchBrackets
:
true
,
mode
:
{
name
:
"
handlebars
"
,
base
:
"
text/html
"
}
});
</script>
<p>
Handlebars syntax highlighting for CodeMirror.
</p>
<p><strong>
MIME types defined:
</strong>
<code>
text/x-handlebars-template
</code></p>
<p>
Supported options:
<code>
base
</code>
to set the mode to
wrap. For example, use
</p>
<pre>
mode: {name: "handlebars", base: "text/html"}
</pre>
<p>
to highlight an HTML template.
</p>
</article>
src/main/webapp/static/plugins/codemirror/5.48.4/mode/haskell-literate/haskell-literate.js
0 → 100644
View file @
53f587bc
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
(
function
(
mod
)
{
if
(
typeof
exports
==
"
object
"
&&
typeof
module
==
"
object
"
)
// CommonJS
mod
(
require
(
"
../../lib/codemirror
"
),
require
(
"
../haskell/haskell
"
))
else
if
(
typeof
define
==
"
function
"
&&
define
.
amd
)
// AMD
define
([
"
../../lib/codemirror
"
,
"
../haskell/haskell
"
],
mod
)
else
// Plain browser env
mod
(
CodeMirror
)
})(
function
(
CodeMirror
)
{
"
use strict
"
CodeMirror
.
defineMode
(
"
haskell-literate
"
,
function
(
config
,
parserConfig
)
{
var
baseMode
=
CodeMirror
.
getMode
(
config
,
(
parserConfig
&&
parserConfig
.
base
)
||
"
haskell
"
)
return
{
startState
:
function
()
{
return
{
inCode
:
false
,
baseState
:
CodeMirror
.
startState
(
baseMode
)
}
},
token
:
function
(
stream
,
state
)
{
if
(
stream
.
sol
())
{
if
(
state
.
inCode
=
stream
.
eat
(
"
>
"
))
return
"
meta
"
}
if
(
state
.
inCode
)
{
return
baseMode
.
token
(
stream
,
state
.
baseState
)
}
else
{
stream
.
skipToEnd
()
return
"
comment
"
}
},
innerMode
:
function
(
state
)
{
return
state
.
inCode
?
{
state
:
state
.
baseState
,
mode
:
baseMode
}
:
null
}
}
},
"
haskell
"
)
CodeMirror
.
defineMIME
(
"
text/x-literate-haskell
"
,
"
haskell-literate
"
)
});
src/main/webapp/static/plugins/codemirror/5.48.4/mode/haskell-literate/index.html
0 → 100644
View file @
53f587bc
<!doctype html>
<title>
CodeMirror: Haskell-literate mode
</title>
<meta
charset=
"utf-8"
/>
<link
rel=
stylesheet
href=
"../../doc/docs.css"
>
<link
rel=
"stylesheet"
href=
"../../lib/codemirror.css"
>
<script
src=
"../../lib/codemirror.js"
></script>
<script
src=
"haskell-literate.js"
></script>
<script
src=
"../haskell/haskell.js"
></script>
<style>
.CodeMirror
{
border-top
:
1px
solid
#DDDDDD
;
border-bottom
:
1px
solid
#DDDDDD
;
}
</style>
<div
id=
nav
>
<a
href=
"https://codemirror.net"
><h1>
CodeMirror
</h1><img
id=
logo
src=
"../../doc/logo.png"
></a>
<ul>
<li><a
href=
"../../index.html"
>
Home
</a>
<li><a
href=
"../../doc/manual.html"
>
Manual
</a>
<li><a
href=
"https://github.com/codemirror/codemirror"
>
Code
</a>
</ul>
<ul>
<li><a
href=
"../index.html"
>
Language modes
</a>
<li><a
class=
active
href=
"#"
>
Haskell-literate
</a>
</ul>
</div>
<article>
<h2>
Haskell literate mode
</h2>
<form>
<textarea
id=
"code"
name=
"code"
>
> {-# LANGUAGE OverloadedStrings #-}
> {-# OPTIONS_GHC -fno-warn-unused-do-bind #-}
> import Control.Applicative ((
<
$
>
), (
<
*
>
))
> import Data.Maybe (isJust)
> import Data.Text (Text)
> import Text.Blaze ((!))
> import qualified Data.Text as T
> import qualified Happstack.Server as Happstack
> import qualified Text.Blaze.Html5 as H
> import qualified Text.Blaze.Html5.Attributes as A
> import Text.Digestive
> import Text.Digestive.Blaze.Html5
> import Text.Digestive.Happstack
> import Text.Digestive.Util
Simple forms and validation
---------------------------
Let's start by creating a very simple datatype to represent a user:
> data User = User
> { userName :: Text
> , userMail :: Text
> } deriving (Show)
And dive in immediately to create a `Form` for a user. The `Form v m a` type
has three parameters:
- `v`: the type for messages and errors (usually a `String`-like type, `Text` in
this case);
- `m`: the monad we are operating in, not specified here;
- `a`: the return type of the `Form`, in this case, this is obviously `User`.
> userForm :: Monad m => Form Text m User
We create forms by using the `Applicative` interface. A few form types are
provided in the `Text.Digestive.Form` module, such as `text`, `string`,
`bool`...
In the `digestive-functors` library, the developer is required to label each
field using the `.:` operator. This might look like a bit of a burden, but it
allows you to do some really useful stuff, like separating the `Form` from the
actual HTML layout.
> userForm = User
>
<
$
>
"name" .: text Nothing
>
<
*
>
"mail" .: check "Not a valid email address" checkEmail (text Nothing)
The `check` function enables you to validate the result of a form. For example,
we can validate the email address with a really naive `checkEmail` function.
> checkEmail :: Text -> Bool
> checkEmail = isJust . T.find (== '@')
More validation
---------------
For our example, we also want descriptions of Haskell libraries, and in order to
do that, we need package versions...
> type Version = [Int]
We want to let the user input a version number such as `0.1.0.0`. This means we
need to validate if the input `Text` is of this form, and then we need to parse
it to a `Version` type. Fortunately, we can do this in a single function:
`validate` allows conversion between values, which can optionally fail.
`readMaybe :: Read a => String -> Maybe a` is a utility function imported from
`Text.Digestive.Util`.
> validateVersion :: Text -> Result Text Version
> validateVersion = maybe (Error "Cannot parse version") Success .
> mapM (readMaybe . T.unpack) . T.split (== '.')
A quick test in GHCi:
ghci> validateVersion (T.pack "0.3.2.1")
Success [0,3,2,1]
ghci> validateVersion (T.pack "0.oops")
Error "Cannot parse version"
It works! This means we can now easily add a `Package` type and a `Form` for it:
> data Category = Web | Text | Math
> deriving (Bounded, Enum, Eq, Show)
> data Package = Package Text Version Category
> deriving (Show)
> packageForm :: Monad m => Form Text m Package
> packageForm = Package
>
<
$
>
"name" .: text Nothing
>
<
*
>
"version" .: validate validateVersion (text (Just "0.0.0.1"))
>
<
*
>
"category" .: choice categories Nothing
> where
> categories = [(x, T.pack (show x)) | x
<-
[
minBound
..
maxBound
]]
Composing
forms
---------------
A
release
has
an
author
and
a
package.
Let
'
s
use
this
to
illustrate
the
composability
of
the
digestive-functors
library:
we
can
reuse
the
forms
we
have
written
earlier
on.
>
data Release = Release User Package
> deriving (Show)
> releaseForm :: Monad m => Form Text m Release
> releaseForm = Release
>
<
$
>
"author" .: userForm
>
<
*
>
"package" .: packageForm
Views
-----
As mentioned before, one of the advantages of using digestive-functors is
separation of forms and their actual HTML layout. In order to do this, we have
another type, `View`.
We can get a `View` from a `Form` by supplying input. A `View` contains more
information than a `Form`, it has:
- the original form;
- the input given by the user;
- any errors that have occurred.
It is this view that we convert to HTML. For this tutorial, we use the
[blaze-html] library, and some helpers from the `digestive-functors-blaze`
library.
[blaze-html]: http://jaspervdj.be/blaze/
Let's write a view for the `User` form. As you can see, we here refer to the
different fields in the `userForm`. The `errorList` will generate a list of
errors for the `"mail"` field.
> userView :: View H.Html -> H.Html
> userView view = do
> label "name" view "Name: "
> inputText "name" view
> H.br
>
> errorList "mail" view
> label "mail" view "Email address: "
> inputText "mail" view
> H.br
Like forms, views are also composable: let's illustrate that by adding a view
for the `releaseForm`, in which we reuse `userView`. In order to do this, we
take only the parts relevant to the author from the view by using `subView`. We
can then pass the resulting view to our own `userView`.
We have no special view code for `Package`, so we can just add that to
`releaseView` as well. `childErrorList` will generate a list of errors for each
child of the specified form. In this case, this means a list of errors from
`"package.name"` and `"package.version"`. Note how we use `foo.bar` to refer to
nested forms.
> releaseView :: View H.Html -> H.Html
> releaseView view = do
> H.h2 "Author"
> userView $ subView "author" view
>
> H.h2 "Package"
> childErrorList "package" view
>
> label "package.name" view "Name: "
> inputText "package.name" view
> H.br
>
> label "package.version" view "Version: "
> inputText "package.version" view
> H.br
>
> label "package.category" view "Category: "
> inputSelect "package.category" view
> H.br
The attentive reader might have wondered what the type parameter for `View` is:
it is the `String`-like type used for e.g. error messages.
But wait! We have
releaseForm :: Monad m => Form Text m Release
releaseView :: View H.Html -> H.Html
... doesn't this mean that we need a `View Text` rather than a `View Html`? The
answer is yes -- but having `View Html` allows us to write these views more
easily with the `digestive-functors-blaze` library. Fortunately, we will be able
to fix this using the `Functor` instance of `View`.
fmap :: Monad m => (v -> w) -> View v -> View w
A backend
---------
To finish this tutorial, we need to be able to actually run this code. We need
an HTTP server for that, and we use [Happstack] for this tutorial. The
`digestive-functors-happstack` library gives about everything we need for this.
[Happstack]: http://happstack.com/
> site :: Happstack.ServerPart Happstack.Response
> site = do
> Happstack.decodeBody $ Happstack.defaultBodyPolicy "/tmp" 4096 4096 4096
> r
<-
runForm
"
test
"
releaseForm
>
case r of
> (view, Nothing) -> do
> let view' = fmap H.toHtml view
> Happstack.ok $ Happstack.toResponse $
> template $
> form view' "/" $ do
> releaseView view'
> H.br
> inputSubmit "Submit"
> (_, Just release) -> Happstack.ok $ Happstack.toResponse $
> template $ do
> css
> H.h1 "Release received"
> H.p $ H.toHtml $ show release
>
> main :: IO ()
> main = Happstack.simpleHTTP Happstack.nullConf site
Utilities
---------
> template :: H.Html -> H.Html
> template body = H.docTypeHtml $ do
> H.head $ do
> H.title "digestive-functors tutorial"
> css
> H.body body
> css :: H.Html
> css = H.style ! A.type_ "text/css" $ do
> "label {width: 130px; float: left; clear: both}"
> "ul.digestive-functors-error-list {"
> " color: red;"
> " list-style-type: none;"
> " padding-left: 0px;"
> "}"
</textarea>
</form>
<p><strong>
MIME types
defined:
</strong>
<code>
text/x-literate-haskell
</code>
.
</p>
<p>
Parser configuration parameters recognized:
<code>
base
</code>
to
set the base mode (defaults to
<code>
"haskell"
</code>
).
</p>
<script>
var
editor
=
CodeMirror
.
fromTextArea
(
document
.
getElementById
(
"
code
"
),
{
mode
:
"
haskell-literate
"
});
</script>
</article>
src/main/webapp/static/plugins/codemirror/5.48.4/mode/haskell/haskell.js
0 → 100644
View file @
53f587bc
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
(
function
(
mod
)
{
if
(
typeof
exports
==
"
object
"
&&
typeof
module
==
"
object
"
)
// CommonJS
mod
(
require
(
"
../../lib/codemirror
"
));
else
if
(
typeof
define
==
"
function
"
&&
define
.
amd
)
// AMD
define
([
"
../../lib/codemirror
"
],
mod
);
else
// Plain browser env
mod
(
CodeMirror
);
})(
function
(
CodeMirror
)
{
"
use strict
"
;
CodeMirror
.
defineMode
(
"
haskell
"
,
function
(
_config
,
modeConfig
)
{
function
switchState
(
source
,
setState
,
f
)
{
setState
(
f
);
return
f
(
source
,
setState
);
}
// These should all be Unicode extended, as per the Haskell 2010 report
var
smallRE
=
/
[
a-z_
]
/
;
var
largeRE
=
/
[
A-Z
]
/
;
var
digitRE
=
/
\d
/
;
var
hexitRE
=
/
[
0-9A-Fa-f
]
/
;
var
octitRE
=
/
[
0-7
]
/
;
var
idRE
=
/
[
a-z_A-Z0-9'
\x
a1-
\u
ffff
]
/
;
var
symbolRE
=
/
[
-!#$%&*+.
\/
<=>?@
\\
^|~:
]
/
;
var
specialRE
=
/
[
(),;[
\]
`{}
]
/
;
var
whiteCharRE
=
/
[
\t\v\f]
/
;
// newlines are handled in tokenizer
function
normal
(
source
,
setState
)
{
if
(
source
.
eatWhile
(
whiteCharRE
))
{
return
null
;
}
var
ch
=
source
.
next
();
if
(
specialRE
.
test
(
ch
))
{
if
(
ch
==
'
{
'
&&
source
.
eat
(
'
-
'
))
{
var
t
=
"
comment
"
;
if
(
source
.
eat
(
'
#
'
))
{
t
=
"
meta
"
;
}
return
switchState
(
source
,
setState
,
ncomment
(
t
,
1
));
}
return
null
;
}
if
(
ch
==
'
\'
'
)
{
if
(
source
.
eat
(
'
\\
'
))
{
source
.
next
();
// should handle other escapes here
}
else
{
source
.
next
();
}
if
(
source
.
eat
(
'
\'
'
))
{
return
"
string
"
;
}
return
"
string error
"
;
}
if
(
ch
==
'
"
'
)
{
return
switchState
(
source
,
setState
,
stringLiteral
);
}
if
(
largeRE
.
test
(
ch
))
{
source
.
eatWhile
(
idRE
);
if
(
source
.
eat
(
'
.
'
))
{
return
"
qualifier
"
;
}
return
"
variable-2
"
;
}
if
(
smallRE
.
test
(
ch
))
{
source
.
eatWhile
(
idRE
);
return
"
variable
"
;
}
if
(
digitRE
.
test
(
ch
))
{
if
(
ch
==
'
0
'
)
{
if
(
source
.
eat
(
/
[
xX
]
/
))
{
source
.
eatWhile
(
hexitRE
);
// should require at least 1
return
"
integer
"
;
}
if
(
source
.
eat
(
/
[
oO
]
/
))
{
source
.
eatWhile
(
octitRE
);
// should require at least 1
return
"
number
"
;
}
}
source
.
eatWhile
(
digitRE
);
var
t
=
"
number
"
;
if
(
source
.
match
(
/^
\.\d
+/
))
{
t
=
"
number
"
;
}
if
(
source
.
eat
(
/
[
eE
]
/
))
{
t
=
"
number
"
;
source
.
eat
(
/
[
-+
]
/
);
source
.
eatWhile
(
digitRE
);
// should require at least 1
}
return
t
;
}
if
(
ch
==
"
.
"
&&
source
.
eat
(
"
.
"
))
return
"
keyword
"
;
if
(
symbolRE
.
test
(
ch
))
{
if
(
ch
==
'
-
'
&&
source
.
eat
(
/-/
))
{
source
.
eatWhile
(
/-/
);
if
(
!
source
.
eat
(
symbolRE
))
{
source
.
skipToEnd
();
return
"
comment
"
;
}
}
var
t
=
"
variable
"
;
if
(
ch
==
'
:
'
)
{
t
=
"
variable-2
"
;
}
source
.
eatWhile
(
symbolRE
);
return
t
;
}
return
"
error
"
;
}
function
ncomment
(
type
,
nest
)
{
if
(
nest
==
0
)
{
return
normal
;
}
return
function
(
source
,
setState
)
{
var
currNest
=
nest
;
while
(
!
source
.
eol
())
{
var
ch
=
source
.
next
();
if
(
ch
==
'
{
'
&&
source
.
eat
(
'
-
'
))
{
++
currNest
;
}
else
if
(
ch
==
'
-
'
&&
source
.
eat
(
'
}
'
))
{
--
currNest
;
if
(
currNest
==
0
)
{
setState
(
normal
);
return
type
;
}
}
}
setState
(
ncomment
(
type
,
currNest
));
return
type
;
};
}
function
stringLiteral
(
source
,
setState
)
{
while
(
!
source
.
eol
())
{
var
ch
=
source
.
next
();
if
(
ch
==
'
"
'
)
{
setState
(
normal
);
return
"
string
"
;
}
if
(
ch
==
'
\\
'
)
{
if
(
source
.
eol
()
||
source
.
eat
(
whiteCharRE
))
{
setState
(
stringGap
);
return
"
string
"
;
}
if
(
source
.
eat
(
'
&
'
))
{
}
else
{
source
.
next
();
// should handle other escapes here
}
}
}
setState
(
normal
);
return
"
string error
"
;
}
function
stringGap
(
source
,
setState
)
{
if
(
source
.
eat
(
'
\\
'
))
{
return
switchState
(
source
,
setState
,
stringLiteral
);
}
source
.
next
();
setState
(
normal
);
return
"
error
"
;
}
var
wellKnownWords
=
(
function
()
{
var
wkw
=
{};
function
setType
(
t
)
{
return
function
()
{
for
(
var
i
=
0
;
i
<
arguments
.
length
;
i
++
)
wkw
[
arguments
[
i
]]
=
t
;
};
}
setType
(
"
keyword
"
)(
"
case
"
,
"
class
"
,
"
data
"
,
"
default
"
,
"
deriving
"
,
"
do
"
,
"
else
"
,
"
foreign
"
,
"
if
"
,
"
import
"
,
"
in
"
,
"
infix
"
,
"
infixl
"
,
"
infixr
"
,
"
instance
"
,
"
let
"
,
"
module
"
,
"
newtype
"
,
"
of
"
,
"
then
"
,
"
type
"
,
"
where
"
,
"
_
"
);
setType
(
"
keyword
"
)(
"
\
.
\
.
"
,
"
:
"
,
"
::
"
,
"
=
"
,
"
\\
"
,
"
<-
"
,
"
->
"
,
"
@
"
,
"
~
"
,
"
=>
"
);
setType
(
"
builtin
"
)(
"
!!
"
,
"
$!
"
,
"
$
"
,
"
&&
"
,
"
+
"
,
"
++
"
,
"
-
"
,
"
.
"
,
"
/
"
,
"
/=
"
,
"
<
"
,
"
<*
"
,
"
<=
"
,
"
<$>
"
,
"
<*>
"
,
"
=<<
"
,
"
==
"
,
"
>
"
,
"
>=
"
,
"
>>
"
,
"
>>=
"
,
"
^
"
,
"
^^
"
,
"
||
"
,
"
*
"
,
"
*>
"
,
"
**
"
);
setType
(
"
builtin
"
)(
"
Applicative
"
,
"
Bool
"
,
"
Bounded
"
,
"
Char
"
,
"
Double
"
,
"
EQ
"
,
"
Either
"
,
"
Enum
"
,
"
Eq
"
,
"
False
"
,
"
FilePath
"
,
"
Float
"
,
"
Floating
"
,
"
Fractional
"
,
"
Functor
"
,
"
GT
"
,
"
IO
"
,
"
IOError
"
,
"
Int
"
,
"
Integer
"
,
"
Integral
"
,
"
Just
"
,
"
LT
"
,
"
Left
"
,
"
Maybe
"
,
"
Monad
"
,
"
Nothing
"
,
"
Num
"
,
"
Ord
"
,
"
Ordering
"
,
"
Rational
"
,
"
Read
"
,
"
ReadS
"
,
"
Real
"
,
"
RealFloat
"
,
"
RealFrac
"
,
"
Right
"
,
"
Show
"
,
"
ShowS
"
,
"
String
"
,
"
True
"
);
setType
(
"
builtin
"
)(
"
abs
"
,
"
acos
"
,
"
acosh
"
,
"
all
"
,
"
and
"
,
"
any
"
,
"
appendFile
"
,
"
asTypeOf
"
,
"
asin
"
,
"
asinh
"
,
"
atan
"
,
"
atan2
"
,
"
atanh
"
,
"
break
"
,
"
catch
"
,
"
ceiling
"
,
"
compare
"
,
"
concat
"
,
"
concatMap
"
,
"
const
"
,
"
cos
"
,
"
cosh
"
,
"
curry
"
,
"
cycle
"
,
"
decodeFloat
"
,
"
div
"
,
"
divMod
"
,
"
drop
"
,
"
dropWhile
"
,
"
either
"
,
"
elem
"
,
"
encodeFloat
"
,
"
enumFrom
"
,
"
enumFromThen
"
,
"
enumFromThenTo
"
,
"
enumFromTo
"
,
"
error
"
,
"
even
"
,
"
exp
"
,
"
exponent
"
,
"
fail
"
,
"
filter
"
,
"
flip
"
,
"
floatDigits
"
,
"
floatRadix
"
,
"
floatRange
"
,
"
floor
"
,
"
fmap
"
,
"
foldl
"
,
"
foldl1
"
,
"
foldr
"
,
"
foldr1
"
,
"
fromEnum
"
,
"
fromInteger
"
,
"
fromIntegral
"
,
"
fromRational
"
,
"
fst
"
,
"
gcd
"
,
"
getChar
"
,
"
getContents
"
,
"
getLine
"
,
"
head
"
,
"
id
"
,
"
init
"
,
"
interact
"
,
"
ioError
"
,
"
isDenormalized
"
,
"
isIEEE
"
,
"
isInfinite
"
,
"
isNaN
"
,
"
isNegativeZero
"
,
"
iterate
"
,
"
last
"
,
"
lcm
"
,
"
length
"
,
"
lex
"
,
"
lines
"
,
"
log
"
,
"
logBase
"
,
"
lookup
"
,
"
map
"
,
"
mapM
"
,
"
mapM_
"
,
"
max
"
,
"
maxBound
"
,
"
maximum
"
,
"
maybe
"
,
"
min
"
,
"
minBound
"
,
"
minimum
"
,
"
mod
"
,
"
negate
"
,
"
not
"
,
"
notElem
"
,
"
null
"
,
"
odd
"
,
"
or
"
,
"
otherwise
"
,
"
pi
"
,
"
pred
"
,
"
print
"
,
"
product
"
,
"
properFraction
"
,
"
pure
"
,
"
putChar
"
,
"
putStr
"
,
"
putStrLn
"
,
"
quot
"
,
"
quotRem
"
,
"
read
"
,
"
readFile
"
,
"
readIO
"
,
"
readList
"
,
"
readLn
"
,
"
readParen
"
,
"
reads
"
,
"
readsPrec
"
,
"
realToFrac
"
,
"
recip
"
,
"
rem
"
,
"
repeat
"
,
"
replicate
"
,
"
return
"
,
"
reverse
"
,
"
round
"
,
"
scaleFloat
"
,
"
scanl
"
,
"
scanl1
"
,
"
scanr
"
,
"
scanr1
"
,
"
seq
"
,
"
sequence
"
,
"
sequence_
"
,
"
show
"
,
"
showChar
"
,
"
showList
"
,
"
showParen
"
,
"
showString
"
,
"
shows
"
,
"
showsPrec
"
,
"
significand
"
,
"
signum
"
,
"
sin
"
,
"
sinh
"
,
"
snd
"
,
"
span
"
,
"
splitAt
"
,
"
sqrt
"
,
"
subtract
"
,
"
succ
"
,
"
sum
"
,
"
tail
"
,
"
take
"
,
"
takeWhile
"
,
"
tan
"
,
"
tanh
"
,
"
toEnum
"
,
"
toInteger
"
,
"
toRational
"
,
"
truncate
"
,
"
uncurry
"
,
"
undefined
"
,
"
unlines
"
,
"
until
"
,
"
unwords
"
,
"
unzip
"
,
"
unzip3
"
,
"
userError
"
,
"
words
"
,
"
writeFile
"
,
"
zip
"
,
"
zip3
"
,
"
zipWith
"
,
"
zipWith3
"
);
var
override
=
modeConfig
.
overrideKeywords
;
if
(
override
)
for
(
var
word
in
override
)
if
(
override
.
hasOwnProperty
(
word
))
wkw
[
word
]
=
override
[
word
];
return
wkw
;
})();
return
{
startState
:
function
()
{
return
{
f
:
normal
};
},
copyState
:
function
(
s
)
{
return
{
f
:
s
.
f
};
},
token
:
function
(
stream
,
state
)
{
var
t
=
state
.
f
(
stream
,
function
(
s
)
{
state
.
f
=
s
;
});
var
w
=
stream
.
current
();
return
wellKnownWords
.
hasOwnProperty
(
w
)
?
wellKnownWords
[
w
]
:
t
;
},
blockCommentStart
:
"
{-
"
,
blockCommentEnd
:
"
-}
"
,
lineComment
:
"
--
"
};
});
CodeMirror
.
defineMIME
(
"
text/x-haskell
"
,
"
haskell
"
);
});
src/main/webapp/static/plugins/codemirror/5.48.4/mode/haskell/index.html
0 → 100644
View file @
53f587bc
<!doctype html>
<title>
CodeMirror: Haskell mode
</title>
<meta
charset=
"utf-8"
/>
<link
rel=
stylesheet
href=
"../../doc/docs.css"
>
<link
rel=
"stylesheet"
href=
"../../lib/codemirror.css"
>
<link
rel=
"stylesheet"
href=
"../../theme/elegant.css"
>
<script
src=
"../../lib/codemirror.js"
></script>
<script
src=
"../../addon/edit/matchbrackets.js"
></script>
<script
src=
"haskell.js"
></script>
<style>
.CodeMirror
{
border-top
:
1px
solid
black
;
border-bottom
:
1px
solid
black
;}
</style>
<div
id=
nav
>
<a
href=
"https://codemirror.net"
><h1>
CodeMirror
</h1><img
id=
logo
src=
"../../doc/logo.png"
></a>
<ul>
<li><a
href=
"../../index.html"
>
Home
</a>
<li><a
href=
"../../doc/manual.html"
>
Manual
</a>
<li><a
href=
"https://github.com/codemirror/codemirror"
>
Code
</a>
</ul>
<ul>
<li><a
href=
"../index.html"
>
Language modes
</a>
<li><a
class=
active
href=
"#"
>
Haskell
</a>
</ul>
</div>
<article>
<h2>
Haskell mode
</h2>
<form><textarea
id=
"code"
name=
"code"
>
module UniquePerms (
uniquePerms
)
where
-- | Find all unique permutations of a list where there might be duplicates.
uniquePerms :: (Eq a) => [a] -> [[a]]
uniquePerms = permBag . makeBag
-- | An unordered collection where duplicate values are allowed,
-- but represented with a single value and a count.
type Bag a = [(a, Int)]
makeBag :: (Eq a) => [a] -> Bag a
makeBag [] = []
makeBag (a:as) = mix a $ makeBag as
where
mix a [] = [(a,1)]
mix a (bn@(b,n):bs) | a == b = (b,n+1):bs
| otherwise = bn : mix a bs
permBag :: Bag a -> [[a]]
permBag [] = [[]]
permBag bs = concatMap (\(f,cs) -> map (f:) $ permBag cs) . oneOfEach $ bs
where
oneOfEach [] = []
oneOfEach (an@(a,n):bs) =
let bs' = if n == 1 then bs else (a,n-1):bs
in (a,bs') : mapSnd (an:) (oneOfEach bs)
apSnd f (a,b) = (a, f b)
mapSnd = map . apSnd
</textarea></form>
<script>
var
editor
=
CodeMirror
.
fromTextArea
(
document
.
getElementById
(
"
code
"
),
{
lineNumbers
:
true
,
matchBrackets
:
true
,
theme
:
"
elegant
"
});
</script>
<p><strong>
MIME types defined:
</strong>
<code>
text/x-haskell
</code>
.
</p>
</article>
src/main/webapp/static/plugins/codemirror/5.48.4/mode/haxe/haxe.js
0 → 100644
View file @
53f587bc
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
(
function
(
mod
)
{
if
(
typeof
exports
==
"
object
"
&&
typeof
module
==
"
object
"
)
// CommonJS
mod
(
require
(
"
../../lib/codemirror
"
));
else
if
(
typeof
define
==
"
function
"
&&
define
.
amd
)
// AMD
define
([
"
../../lib/codemirror
"
],
mod
);
else
// Plain browser env
mod
(
CodeMirror
);
})(
function
(
CodeMirror
)
{
"
use strict
"
;
CodeMirror
.
defineMode
(
"
haxe
"
,
function
(
config
,
parserConfig
)
{
var
indentUnit
=
config
.
indentUnit
;
// Tokenizer
function
kw
(
type
)
{
return
{
type
:
type
,
style
:
"
keyword
"
};}
var
A
=
kw
(
"
keyword a
"
),
B
=
kw
(
"
keyword b
"
),
C
=
kw
(
"
keyword c
"
);
var
operator
=
kw
(
"
operator
"
),
atom
=
{
type
:
"
atom
"
,
style
:
"
atom
"
},
attribute
=
{
type
:
"
attribute
"
,
style
:
"
attribute
"
};
var
type
=
kw
(
"
typedef
"
);
var
keywords
=
{
"
if
"
:
A
,
"
while
"
:
A
,
"
else
"
:
B
,
"
do
"
:
B
,
"
try
"
:
B
,
"
return
"
:
C
,
"
break
"
:
C
,
"
continue
"
:
C
,
"
new
"
:
C
,
"
throw
"
:
C
,
"
var
"
:
kw
(
"
var
"
),
"
inline
"
:
attribute
,
"
static
"
:
attribute
,
"
using
"
:
kw
(
"
import
"
),
"
public
"
:
attribute
,
"
private
"
:
attribute
,
"
cast
"
:
kw
(
"
cast
"
),
"
import
"
:
kw
(
"
import
"
),
"
macro
"
:
kw
(
"
macro
"
),
"
function
"
:
kw
(
"
function
"
),
"
catch
"
:
kw
(
"
catch
"
),
"
untyped
"
:
kw
(
"
untyped
"
),
"
callback
"
:
kw
(
"
cb
"
),
"
for
"
:
kw
(
"
for
"
),
"
switch
"
:
kw
(
"
switch
"
),
"
case
"
:
kw
(
"
case
"
),
"
default
"
:
kw
(
"
default
"
),
"
in
"
:
operator
,
"
never
"
:
kw
(
"
property_access
"
),
"
trace
"
:
kw
(
"
trace
"
),
"
class
"
:
type
,
"
abstract
"
:
type
,
"
enum
"
:
type
,
"
interface
"
:
type
,
"
typedef
"
:
type
,
"
extends
"
:
type
,
"
implements
"
:
type
,
"
dynamic
"
:
type
,
"
true
"
:
atom
,
"
false
"
:
atom
,
"
null
"
:
atom
};
var
isOperatorChar
=
/
[
+
\-
*&%=<>!?|
]
/
;
function
chain
(
stream
,
state
,
f
)
{
state
.
tokenize
=
f
;
return
f
(
stream
,
state
);
}
function
toUnescaped
(
stream
,
end
)
{
var
escaped
=
false
,
next
;
while
((
next
=
stream
.
next
())
!=
null
)
{
if
(
next
==
end
&&
!
escaped
)
return
true
;
escaped
=
!
escaped
&&
next
==
"
\\
"
;
}
}
// Used as scratch variables to communicate multiple values without
// consing up tons of objects.
var
type
,
content
;
function
ret
(
tp
,
style
,
cont
)
{
type
=
tp
;
content
=
cont
;
return
style
;
}
function
haxeTokenBase
(
stream
,
state
)
{
var
ch
=
stream
.
next
();
if
(
ch
==
'
"
'
||
ch
==
"
'
"
)
{
return
chain
(
stream
,
state
,
haxeTokenString
(
ch
));
}
else
if
(
/
[\[\]
{}
\(\)
,;
\:\.]
/
.
test
(
ch
))
{
return
ret
(
ch
);
}
else
if
(
ch
==
"
0
"
&&
stream
.
eat
(
/x/i
))
{
stream
.
eatWhile
(
/
[\d
a-f
]
/i
);
return
ret
(
"
number
"
,
"
number
"
);
}
else
if
(
/
\d
/
.
test
(
ch
)
||
ch
==
"
-
"
&&
stream
.
eat
(
/
\d
/
))
{
stream
.
match
(
/^
\d
*
(?:\.\d
*
(?!\.))?(?:[
eE
][
+
\-]?\d
+
)?
/
);
return
ret
(
"
number
"
,
"
number
"
);
}
else
if
(
state
.
reAllowed
&&
(
ch
==
"
~
"
&&
stream
.
eat
(
/
\/
/
)))
{
toUnescaped
(
stream
,
"
/
"
);
stream
.
eatWhile
(
/
[
gimsu
]
/
);
return
ret
(
"
regexp
"
,
"
string-2
"
);
}
else
if
(
ch
==
"
/
"
)
{
if
(
stream
.
eat
(
"
*
"
))
{
return
chain
(
stream
,
state
,
haxeTokenComment
);
}
else
if
(
stream
.
eat
(
"
/
"
))
{
stream
.
skipToEnd
();
return
ret
(
"
comment
"
,
"
comment
"
);
}
else
{
stream
.
eatWhile
(
isOperatorChar
);
return
ret
(
"
operator
"
,
null
,
stream
.
current
());
}
}
else
if
(
ch
==
"
#
"
)
{
stream
.
skipToEnd
();
return
ret
(
"
conditional
"
,
"
meta
"
);
}
else
if
(
ch
==
"
@
"
)
{
stream
.
eat
(
/:/
);
stream
.
eatWhile
(
/
[\w
_
]
/
);
return
ret
(
"
metadata
"
,
"
meta
"
);
}
else
if
(
isOperatorChar
.
test
(
ch
))
{
stream
.
eatWhile
(
isOperatorChar
);
return
ret
(
"
operator
"
,
null
,
stream
.
current
());
}
else
{
var
word
;
if
(
/
[
A-Z
]
/
.
test
(
ch
))
{
stream
.
eatWhile
(
/
[\w
_<>
]
/
);
word
=
stream
.
current
();
return
ret
(
"
type
"
,
"
variable-3
"
,
word
);
}
else
{
stream
.
eatWhile
(
/
[\w
_
]
/
);
var
word
=
stream
.
current
(),
known
=
keywords
.
propertyIsEnumerable
(
word
)
&&
keywords
[
word
];
return
(
known
&&
state
.
kwAllowed
)
?
ret
(
known
.
type
,
known
.
style
,
word
)
:
ret
(
"
variable
"
,
"
variable
"
,
word
);
}
}
}
function
haxeTokenString
(
quote
)
{
return
function
(
stream
,
state
)
{
if
(
toUnescaped
(
stream
,
quote
))
state
.
tokenize
=
haxeTokenBase
;
return
ret
(
"
string
"
,
"
string
"
);
};
}
function
haxeTokenComment
(
stream
,
state
)
{
var
maybeEnd
=
false
,
ch
;
while
(
ch
=
stream
.
next
())
{
if
(
ch
==
"
/
"
&&
maybeEnd
)
{
state
.
tokenize
=
haxeTokenBase
;
break
;
}
maybeEnd
=
(
ch
==
"
*
"
);
}
return
ret
(
"
comment
"
,
"
comment
"
);
}
// Parser
var
atomicTypes
=
{
"
atom
"
:
true
,
"
number
"
:
true
,
"
variable
"
:
true
,
"
string
"
:
true
,
"
regexp
"
:
true
};
function
HaxeLexical
(
indented
,
column
,
type
,
align
,
prev
,
info
)
{
this
.
indented
=
indented
;
this
.
column
=
column
;
this
.
type
=
type
;
this
.
prev
=
prev
;
this
.
info
=
info
;
if
(
align
!=
null
)
this
.
align
=
align
;
}
function
inScope
(
state
,
varname
)
{
for
(
var
v
=
state
.
localVars
;
v
;
v
=
v
.
next
)
if
(
v
.
name
==
varname
)
return
true
;
}
function
parseHaxe
(
state
,
style
,
type
,
content
,
stream
)
{
var
cc
=
state
.
cc
;
// Communicate our context to the combinators.
// (Less wasteful than consing up a hundred closures on every call.)
cx
.
state
=
state
;
cx
.
stream
=
stream
;
cx
.
marked
=
null
,
cx
.
cc
=
cc
;
if
(
!
state
.
lexical
.
hasOwnProperty
(
"
align
"
))
state
.
lexical
.
align
=
true
;
while
(
true
)
{
var
combinator
=
cc
.
length
?
cc
.
pop
()
:
statement
;
if
(
combinator
(
type
,
content
))
{
while
(
cc
.
length
&&
cc
[
cc
.
length
-
1
].
lex
)
cc
.
pop
()();
if
(
cx
.
marked
)
return
cx
.
marked
;
if
(
type
==
"
variable
"
&&
inScope
(
state
,
content
))
return
"
variable-2
"
;
if
(
type
==
"
variable
"
&&
imported
(
state
,
content
))
return
"
variable-3
"
;
return
style
;
}
}
}
function
imported
(
state
,
typename
)
{
if
(
/
[
a-z
]
/
.
test
(
typename
.
charAt
(
0
)))
return
false
;
var
len
=
state
.
importedtypes
.
length
;
for
(
var
i
=
0
;
i
<
len
;
i
++
)
if
(
state
.
importedtypes
[
i
]
==
typename
)
return
true
;
}
function
registerimport
(
importname
)
{
var
state
=
cx
.
state
;
for
(
var
t
=
state
.
importedtypes
;
t
;
t
=
t
.
next
)
if
(
t
.
name
==
importname
)
return
;
state
.
importedtypes
=
{
name
:
importname
,
next
:
state
.
importedtypes
};
}
// Combinator utils
var
cx
=
{
state
:
null
,
column
:
null
,
marked
:
null
,
cc
:
null
};
function
pass
()
{
for
(
var
i
=
arguments
.
length
-
1
;
i
>=
0
;
i
--
)
cx
.
cc
.
push
(
arguments
[
i
]);
}
function
cont
()
{
pass
.
apply
(
null
,
arguments
);
return
true
;
}
function
inList
(
name
,
list
)
{
for
(
var
v
=
list
;
v
;
v
=
v
.
next
)
if
(
v
.
name
==
name
)
return
true
;
return
false
;
}
function
register
(
varname
)
{
var
state
=
cx
.
state
;
if
(
state
.
context
)
{
cx
.
marked
=
"
def
"
;
if
(
inList
(
varname
,
state
.
localVars
))
return
;
state
.
localVars
=
{
name
:
varname
,
next
:
state
.
localVars
};
}
else
if
(
state
.
globalVars
)
{
if
(
inList
(
varname
,
state
.
globalVars
))
return
;
state
.
globalVars
=
{
name
:
varname
,
next
:
state
.
globalVars
};
}
}
// Combinators
var
defaultVars
=
{
name
:
"
this
"
,
next
:
null
};
function
pushcontext
()
{
if
(
!
cx
.
state
.
context
)
cx
.
state
.
localVars
=
defaultVars
;
cx
.
state
.
context
=
{
prev
:
cx
.
state
.
context
,
vars
:
cx
.
state
.
localVars
};
}
function
popcontext
()
{
cx
.
state
.
localVars
=
cx
.
state
.
context
.
vars
;
cx
.
state
.
context
=
cx
.
state
.
context
.
prev
;
}
popcontext
.
lex
=
true
;
function
pushlex
(
type
,
info
)
{
var
result
=
function
()
{
var
state
=
cx
.
state
;
state
.
lexical
=
new
HaxeLexical
(
state
.
indented
,
cx
.
stream
.
column
(),
type
,
null
,
state
.
lexical
,
info
);
};
result
.
lex
=
true
;
return
result
;
}
function
poplex
()
{
var
state
=
cx
.
state
;
if
(
state
.
lexical
.
prev
)
{
if
(
state
.
lexical
.
type
==
"
)
"
)
state
.
indented
=
state
.
lexical
.
indented
;
state
.
lexical
=
state
.
lexical
.
prev
;
}
}
poplex
.
lex
=
true
;
function
expect
(
wanted
)
{
function
f
(
type
)
{
if
(
type
==
wanted
)
return
cont
();
else
if
(
wanted
==
"
;
"
)
return
pass
();
else
return
cont
(
f
);
}
return
f
;
}
function
statement
(
type
)
{
if
(
type
==
"
@
"
)
return
cont
(
metadef
);
if
(
type
==
"
var
"
)
return
cont
(
pushlex
(
"
vardef
"
),
vardef1
,
expect
(
"
;
"
),
poplex
);
if
(
type
==
"
keyword a
"
)
return
cont
(
pushlex
(
"
form
"
),
expression
,
statement
,
poplex
);
if
(
type
==
"
keyword b
"
)
return
cont
(
pushlex
(
"
form
"
),
statement
,
poplex
);
if
(
type
==
"
{
"
)
return
cont
(
pushlex
(
"
}
"
),
pushcontext
,
block
,
poplex
,
popcontext
);
if
(
type
==
"
;
"
)
return
cont
();
if
(
type
==
"
attribute
"
)
return
cont
(
maybeattribute
);
if
(
type
==
"
function
"
)
return
cont
(
functiondef
);
if
(
type
==
"
for
"
)
return
cont
(
pushlex
(
"
form
"
),
expect
(
"
(
"
),
pushlex
(
"
)
"
),
forspec1
,
expect
(
"
)
"
),
poplex
,
statement
,
poplex
);
if
(
type
==
"
variable
"
)
return
cont
(
pushlex
(
"
stat
"
),
maybelabel
);
if
(
type
==
"
switch
"
)
return
cont
(
pushlex
(
"
form
"
),
expression
,
pushlex
(
"
}
"
,
"
switch
"
),
expect
(
"
{
"
),
block
,
poplex
,
poplex
);
if
(
type
==
"
case
"
)
return
cont
(
expression
,
expect
(
"
:
"
));
if
(
type
==
"
default
"
)
return
cont
(
expect
(
"
:
"
));
if
(
type
==
"
catch
"
)
return
cont
(
pushlex
(
"
form
"
),
pushcontext
,
expect
(
"
(
"
),
funarg
,
expect
(
"
)
"
),
statement
,
poplex
,
popcontext
);
if
(
type
==
"
import
"
)
return
cont
(
importdef
,
expect
(
"
;
"
));
if
(
type
==
"
typedef
"
)
return
cont
(
typedef
);
return
pass
(
pushlex
(
"
stat
"
),
expression
,
expect
(
"
;
"
),
poplex
);
}
function
expression
(
type
)
{
if
(
atomicTypes
.
hasOwnProperty
(
type
))
return
cont
(
maybeoperator
);
if
(
type
==
"
type
"
)
return
cont
(
maybeoperator
);
if
(
type
==
"
function
"
)
return
cont
(
functiondef
);
if
(
type
==
"
keyword c
"
)
return
cont
(
maybeexpression
);
if
(
type
==
"
(
"
)
return
cont
(
pushlex
(
"
)
"
),
maybeexpression
,
expect
(
"
)
"
),
poplex
,
maybeoperator
);
if
(
type
==
"
operator
"
)
return
cont
(
expression
);
if
(
type
==
"
[
"
)
return
cont
(
pushlex
(
"
]
"
),
commasep
(
maybeexpression
,
"
]
"
),
poplex
,
maybeoperator
);
if
(
type
==
"
{
"
)
return
cont
(
pushlex
(
"
}
"
),
commasep
(
objprop
,
"
}
"
),
poplex
,
maybeoperator
);
return
cont
();
}
function
maybeexpression
(
type
)
{
if
(
type
.
match
(
/
[
;
\}\)\]
,
]
/
))
return
pass
();
return
pass
(
expression
);
}
function
maybeoperator
(
type
,
value
)
{
if
(
type
==
"
operator
"
&&
/
\+\+
|--/
.
test
(
value
))
return
cont
(
maybeoperator
);
if
(
type
==
"
operator
"
||
type
==
"
:
"
)
return
cont
(
expression
);
if
(
type
==
"
;
"
)
return
;
if
(
type
==
"
(
"
)
return
cont
(
pushlex
(
"
)
"
),
commasep
(
expression
,
"
)
"
),
poplex
,
maybeoperator
);
if
(
type
==
"
.
"
)
return
cont
(
property
,
maybeoperator
);
if
(
type
==
"
[
"
)
return
cont
(
pushlex
(
"
]
"
),
expression
,
expect
(
"
]
"
),
poplex
,
maybeoperator
);
}
function
maybeattribute
(
type
)
{
if
(
type
==
"
attribute
"
)
return
cont
(
maybeattribute
);
if
(
type
==
"
function
"
)
return
cont
(
functiondef
);
if
(
type
==
"
var
"
)
return
cont
(
vardef1
);
}
function
metadef
(
type
)
{
if
(
type
==
"
:
"
)
return
cont
(
metadef
);
if
(
type
==
"
variable
"
)
return
cont
(
metadef
);
if
(
type
==
"
(
"
)
return
cont
(
pushlex
(
"
)
"
),
commasep
(
metaargs
,
"
)
"
),
poplex
,
statement
);
}
function
metaargs
(
type
)
{
if
(
type
==
"
variable
"
)
return
cont
();
}
function
importdef
(
type
,
value
)
{
if
(
type
==
"
variable
"
&&
/
[
A-Z
]
/
.
test
(
value
.
charAt
(
0
)))
{
registerimport
(
value
);
return
cont
();
}
else
if
(
type
==
"
variable
"
||
type
==
"
property
"
||
type
==
"
.
"
||
value
==
"
*
"
)
return
cont
(
importdef
);
}
function
typedef
(
type
,
value
)
{
if
(
type
==
"
variable
"
&&
/
[
A-Z
]
/
.
test
(
value
.
charAt
(
0
)))
{
registerimport
(
value
);
return
cont
();
}
else
if
(
type
==
"
type
"
&&
/
[
A-Z
]
/
.
test
(
value
.
charAt
(
0
)))
{
return
cont
();
}
}
function
maybelabel
(
type
)
{
if
(
type
==
"
:
"
)
return
cont
(
poplex
,
statement
);
return
pass
(
maybeoperator
,
expect
(
"
;
"
),
poplex
);
}
function
property
(
type
)
{
if
(
type
==
"
variable
"
)
{
cx
.
marked
=
"
property
"
;
return
cont
();}
}
function
objprop
(
type
)
{
if
(
type
==
"
variable
"
)
cx
.
marked
=
"
property
"
;
if
(
atomicTypes
.
hasOwnProperty
(
type
))
return
cont
(
expect
(
"
:
"
),
expression
);
}
function
commasep
(
what
,
end
)
{
function
proceed
(
type
)
{
if
(
type
==
"
,
"
)
return
cont
(
what
,
proceed
);
if
(
type
==
end
)
return
cont
();
return
cont
(
expect
(
end
));
}
return
function
(
type
)
{
if
(
type
==
end
)
return
cont
();
else
return
pass
(
what
,
proceed
);
};
}
function
block
(
type
)
{
if
(
type
==
"
}
"
)
return
cont
();
return
pass
(
statement
,
block
);
}
function
vardef1
(
type
,
value
)
{
if
(
type
==
"
variable
"
){
register
(
value
);
return
cont
(
typeuse
,
vardef2
);}
return
cont
();
}
function
vardef2
(
type
,
value
)
{
if
(
value
==
"
=
"
)
return
cont
(
expression
,
vardef2
);
if
(
type
==
"
,
"
)
return
cont
(
vardef1
);
}
function
forspec1
(
type
,
value
)
{
if
(
type
==
"
variable
"
)
{
register
(
value
);
return
cont
(
forin
,
expression
)
}
else
{
return
pass
()
}
}
function
forin
(
_type
,
value
)
{
if
(
value
==
"
in
"
)
return
cont
();
}
function
functiondef
(
type
,
value
)
{
//function names starting with upper-case letters are recognised as types, so cludging them together here.
if
(
type
==
"
variable
"
||
type
==
"
type
"
)
{
register
(
value
);
return
cont
(
functiondef
);}
if
(
value
==
"
new
"
)
return
cont
(
functiondef
);
if
(
type
==
"
(
"
)
return
cont
(
pushlex
(
"
)
"
),
pushcontext
,
commasep
(
funarg
,
"
)
"
),
poplex
,
typeuse
,
statement
,
popcontext
);
}
function
typeuse
(
type
)
{
if
(
type
==
"
:
"
)
return
cont
(
typestring
);
}
function
typestring
(
type
)
{
if
(
type
==
"
type
"
)
return
cont
();
if
(
type
==
"
variable
"
)
return
cont
();
if
(
type
==
"
{
"
)
return
cont
(
pushlex
(
"
}
"
),
commasep
(
typeprop
,
"
}
"
),
poplex
);
}
function
typeprop
(
type
)
{
if
(
type
==
"
variable
"
)
return
cont
(
typeuse
);
}
function
funarg
(
type
,
value
)
{
if
(
type
==
"
variable
"
)
{
register
(
value
);
return
cont
(
typeuse
);}
}
// Interface
return
{
startState
:
function
(
basecolumn
)
{
var
defaulttypes
=
[
"
Int
"
,
"
Float
"
,
"
String
"
,
"
Void
"
,
"
Std
"
,
"
Bool
"
,
"
Dynamic
"
,
"
Array
"
];
var
state
=
{
tokenize
:
haxeTokenBase
,
reAllowed
:
true
,
kwAllowed
:
true
,
cc
:
[],
lexical
:
new
HaxeLexical
((
basecolumn
||
0
)
-
indentUnit
,
0
,
"
block
"
,
false
),
localVars
:
parserConfig
.
localVars
,
importedtypes
:
defaulttypes
,
context
:
parserConfig
.
localVars
&&
{
vars
:
parserConfig
.
localVars
},
indented
:
0
};
if
(
parserConfig
.
globalVars
&&
typeof
parserConfig
.
globalVars
==
"
object
"
)
state
.
globalVars
=
parserConfig
.
globalVars
;
return
state
;
},
token
:
function
(
stream
,
state
)
{
if
(
stream
.
sol
())
{
if
(
!
state
.
lexical
.
hasOwnProperty
(
"
align
"
))
state
.
lexical
.
align
=
false
;
state
.
indented
=
stream
.
indentation
();
}
if
(
stream
.
eatSpace
())
return
null
;
var
style
=
state
.
tokenize
(
stream
,
state
);
if
(
type
==
"
comment
"
)
return
style
;
state
.
reAllowed
=
!!
(
type
==
"
operator
"
||
type
==
"
keyword c
"
||
type
.
match
(
/^
[\[
{}
\(
,;:
]
$/
));
state
.
kwAllowed
=
type
!=
'
.
'
;
return
parseHaxe
(
state
,
style
,
type
,
content
,
stream
);
},
indent
:
function
(
state
,
textAfter
)
{
if
(
state
.
tokenize
!=
haxeTokenBase
)
return
0
;
var
firstChar
=
textAfter
&&
textAfter
.
charAt
(
0
),
lexical
=
state
.
lexical
;
if
(
lexical
.
type
==
"
stat
"
&&
firstChar
==
"
}
"
)
lexical
=
lexical
.
prev
;
var
type
=
lexical
.
type
,
closing
=
firstChar
==
type
;
if
(
type
==
"
vardef
"
)
return
lexical
.
indented
+
4
;
else
if
(
type
==
"
form
"
&&
firstChar
==
"
{
"
)
return
lexical
.
indented
;
else
if
(
type
==
"
stat
"
||
type
==
"
form
"
)
return
lexical
.
indented
+
indentUnit
;
else
if
(
lexical
.
info
==
"
switch
"
&&
!
closing
)
return
lexical
.
indented
+
(
/^
(?:
case|default
)\b
/
.
test
(
textAfter
)
?
indentUnit
:
2
*
indentUnit
);
else
if
(
lexical
.
align
)
return
lexical
.
column
+
(
closing
?
0
:
1
);
else
return
lexical
.
indented
+
(
closing
?
0
:
indentUnit
);
},
electricChars
:
"
{}
"
,
blockCommentStart
:
"
/*
"
,
blockCommentEnd
:
"
*/
"
,
lineComment
:
"
//
"
};
});
CodeMirror
.
defineMIME
(
"
text/x-haxe
"
,
"
haxe
"
);
CodeMirror
.
defineMode
(
"
hxml
"
,
function
()
{
return
{
startState
:
function
()
{
return
{
define
:
false
,
inString
:
false
};
},
token
:
function
(
stream
,
state
)
{
var
ch
=
stream
.
peek
();
var
sol
=
stream
.
sol
();
///* comments */
if
(
ch
==
"
#
"
)
{
stream
.
skipToEnd
();
return
"
comment
"
;
}
if
(
sol
&&
ch
==
"
-
"
)
{
var
style
=
"
variable-2
"
;
stream
.
eat
(
/-/
);
if
(
stream
.
peek
()
==
"
-
"
)
{
stream
.
eat
(
/-/
);
style
=
"
keyword a
"
;
}
if
(
stream
.
peek
()
==
"
D
"
)
{
stream
.
eat
(
/
[
D
]
/
);
style
=
"
keyword c
"
;
state
.
define
=
true
;
}
stream
.
eatWhile
(
/
[
A-Z
]
/i
);
return
style
;
}
var
ch
=
stream
.
peek
();
if
(
state
.
inString
==
false
&&
ch
==
"
'
"
)
{
state
.
inString
=
true
;
stream
.
next
();
}
if
(
state
.
inString
==
true
)
{
if
(
stream
.
skipTo
(
"
'
"
))
{
}
else
{
stream
.
skipToEnd
();
}
if
(
stream
.
peek
()
==
"
'
"
)
{
stream
.
next
();
state
.
inString
=
false
;
}
return
"
string
"
;
}
stream
.
next
();
return
null
;
},
lineComment
:
"
#
"
};
});
CodeMirror
.
defineMIME
(
"
text/x-hxml
"
,
"
hxml
"
);
});
src/main/webapp/static/plugins/codemirror/5.48.4/mode/haxe/index.html
0 → 100644
View file @
53f587bc
<!doctype html>
<title>
CodeMirror: Haxe mode
</title>
<meta
charset=
"utf-8"
/>
<link
rel=
stylesheet
href=
"../../doc/docs.css"
>
<link
rel=
"stylesheet"
href=
"../../lib/codemirror.css"
>
<script
src=
"../../lib/codemirror.js"
></script>
<script
src=
"haxe.js"
></script>
<style>
.CodeMirror
{
border-top
:
1px
solid
black
;
border-bottom
:
1px
solid
black
;}
</style>
<div
id=
nav
>
<a
href=
"https://codemirror.net"
><h1>
CodeMirror
</h1><img
id=
logo
src=
"../../doc/logo.png"
></a>
<ul>
<li><a
href=
"../../index.html"
>
Home
</a>
<li><a
href=
"../../doc/manual.html"
>
Manual
</a>
<li><a
href=
"https://github.com/codemirror/codemirror"
>
Code
</a>
</ul>
<ul>
<li><a
href=
"../index.html"
>
Language modes
</a>
<li><a
class=
active
href=
"#"
>
Haxe
</a>
</ul>
</div>
<article>
<h2>
Haxe mode
</h2>
<div><p><textarea
id=
"code-haxe"
name=
"code"
>
import one.two.Three;
@attr("test")
class Foo
<
T
>
extends Three
{
public function new()
{
noFoo = 12;
}
public static inline function doFoo(obj:{k:Int, l:Float}):Int
{
for(i in 0...10)
{
obj.k++;
trace(i);
var var1 = new Array();
if(var1.length > 1)
throw "Error";
}
// The following line should not be colored, the variable is scoped out
var1;
/* Multi line
* Comment test
*/
return obj.k;
}
private function bar():Void
{
#if flash
var t1:String = "1.21";
#end
try {
doFoo({k:3, l:1.2});
}
catch (e : String) {
trace(e);
}
var t2:Float = cast(3.2);
var t3:haxe.Timer = new haxe.Timer();
var t4 = {k:Std.int(t2), l:Std.parseFloat(t1)};
var t5 = ~/123+.*$/i;
doFoo(t4);
untyped t1 = 4;
bob = new Foo
<
Int
>
}
public var okFoo(default, never):Float;
var noFoo(getFoo, null):Int;
function getFoo():Int {
return noFoo;
}
public var three:Int;
}
enum Color
{
red;
green;
blue;
grey( v : Int );
rgb (r:Int,g:Int,b:Int);
}
</textarea></p>
<p>
Hxml mode:
</p>
<p><textarea
id=
"code-hxml"
>
-cp test
-js path/to/file.js
#-remap nme:flash
--next
-D source-map-content
-cmd 'test'
-lib lime
</textarea></p>
</div>
<script>
var
editor
=
CodeMirror
.
fromTextArea
(
document
.
getElementById
(
"
code-haxe
"
),
{
mode
:
"
haxe
"
,
lineNumbers
:
true
,
indentUnit
:
4
,
indentWithTabs
:
true
});
editor
=
CodeMirror
.
fromTextArea
(
document
.
getElementById
(
"
code-hxml
"
),
{
mode
:
"
hxml
"
,
lineNumbers
:
true
,
indentUnit
:
4
,
indentWithTabs
:
true
});
</script>
<p><strong>
MIME types defined:
</strong>
<code>
text/x-haxe, text/x-hxml
</code>
.
</p>
</article>
src/main/webapp/static/plugins/codemirror/5.48.4/mode/htmlembedded/htmlembedded.js
0 → 100644
View file @
53f587bc
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
(
function
(
mod
)
{
if
(
typeof
exports
==
"
object
"
&&
typeof
module
==
"
object
"
)
// CommonJS
mod
(
require
(
"
../../lib/codemirror
"
),
require
(
"
../htmlmixed/htmlmixed
"
),
require
(
"
../../addon/mode/multiplex
"
));
else
if
(
typeof
define
==
"
function
"
&&
define
.
amd
)
// AMD
define
([
"
../../lib/codemirror
"
,
"
../htmlmixed/htmlmixed
"
,
"
../../addon/mode/multiplex
"
],
mod
);
else
// Plain browser env
mod
(
CodeMirror
);
})(
function
(
CodeMirror
)
{
"
use strict
"
;
CodeMirror
.
defineMode
(
"
htmlembedded
"
,
function
(
config
,
parserConfig
)
{
var
closeComment
=
parserConfig
.
closeComment
||
"
--%>
"
return
CodeMirror
.
multiplexingMode
(
CodeMirror
.
getMode
(
config
,
"
htmlmixed
"
),
{
open
:
parserConfig
.
openComment
||
"
<%--
"
,
close
:
closeComment
,
delimStyle
:
"
comment
"
,
mode
:
{
token
:
function
(
stream
)
{
stream
.
skipTo
(
closeComment
)
||
stream
.
skipToEnd
()
return
"
comment
"
}}
},
{
open
:
parserConfig
.
open
||
parserConfig
.
scriptStartRegex
||
"
<%
"
,
close
:
parserConfig
.
close
||
parserConfig
.
scriptEndRegex
||
"
%>
"
,
mode
:
CodeMirror
.
getMode
(
config
,
parserConfig
.
scriptingModeSpec
)
});
},
"
htmlmixed
"
);
CodeMirror
.
defineMIME
(
"
application/x-ejs
"
,
{
name
:
"
htmlembedded
"
,
scriptingModeSpec
:
"
javascript
"
});
CodeMirror
.
defineMIME
(
"
application/x-aspx
"
,
{
name
:
"
htmlembedded
"
,
scriptingModeSpec
:
"
text/x-csharp
"
});
CodeMirror
.
defineMIME
(
"
application/x-jsp
"
,
{
name
:
"
htmlembedded
"
,
scriptingModeSpec
:
"
text/x-java
"
});
CodeMirror
.
defineMIME
(
"
application/x-erb
"
,
{
name
:
"
htmlembedded
"
,
scriptingModeSpec
:
"
ruby
"
});
});
src/main/webapp/static/plugins/codemirror/5.48.4/mode/htmlembedded/index.html
0 → 100644
View file @
53f587bc
<!doctype html>
<title>
CodeMirror: Html Embedded Scripts mode
</title>
<meta
charset=
"utf-8"
/>
<link
rel=
stylesheet
href=
"../../doc/docs.css"
>
<link
rel=
"stylesheet"
href=
"../../lib/codemirror.css"
>
<script
src=
"../../lib/codemirror.js"
></script>
<script
src=
"../xml/xml.js"
></script>
<script
src=
"../javascript/javascript.js"
></script>
<script
src=
"../css/css.js"
></script>
<script
src=
"../htmlmixed/htmlmixed.js"
></script>
<script
src=
"../../addon/mode/multiplex.js"
></script>
<script
src=
"htmlembedded.js"
></script>
<style>
.CodeMirror
{
border-top
:
1px
solid
black
;
border-bottom
:
1px
solid
black
;}
</style>
<div
id=
nav
>
<a
href=
"https://codemirror.net"
><h1>
CodeMirror
</h1><img
id=
logo
src=
"../../doc/logo.png"
></a>
<ul>
<li><a
href=
"../../index.html"
>
Home
</a>
<li><a
href=
"../../doc/manual.html"
>
Manual
</a>
<li><a
href=
"https://github.com/codemirror/codemirror"
>
Code
</a>
</ul>
<ul>
<li><a
href=
"../index.html"
>
Language modes
</a>
<li><a
class=
active
href=
"#"
>
Html Embedded Scripts
</a>
</ul>
</div>
<article>
<h2>
Html Embedded Scripts mode
</h2>
<form><textarea
id=
"code"
name=
"code"
>
<
%
function
hello
(
who
)
{
return
"
Hello
"
+
who
;
}
%
>
This is an example of EJS (embedded javascript)
<p>
The program says
<
%=
hello
("
world
")
%
>
.
</p>
<script>
alert
(
"
And here is some normal JS code
"
);
// also colored
</script>
</textarea></form>
<script>
var
editor
=
CodeMirror
.
fromTextArea
(
document
.
getElementById
(
"
code
"
),
{
lineNumbers
:
true
,
mode
:
"
application/x-ejs
"
,
indentUnit
:
4
,
indentWithTabs
:
true
});
</script>
<p>
Mode for html embedded scripts like JSP and ASP.NET. Depends on multiplex and HtmlMixed which in turn depends on
JavaScript, CSS and XML.
<br
/>
Other dependencies include those of the scripting language chosen.
</p>
<p><strong>
MIME types defined:
</strong>
<code>
application/x-aspx
</code>
(ASP.NET),
<code>
application/x-ejs
</code>
(Embedded Javascript),
<code>
application/x-jsp
</code>
(JavaServer Pages)
and
<code>
application/x-erb
</code></p>
</article>
src/main/webapp/static/plugins/codemirror/5.48.4/mode/htmlmixed/htmlmixed.js
0 → 100644
View file @
53f587bc
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
(
function
(
mod
)
{
if
(
typeof
exports
==
"
object
"
&&
typeof
module
==
"
object
"
)
// CommonJS
mod
(
require
(
"
../../lib/codemirror
"
),
require
(
"
../xml/xml
"
),
require
(
"
../javascript/javascript
"
),
require
(
"
../css/css
"
));
else
if
(
typeof
define
==
"
function
"
&&
define
.
amd
)
// AMD
define
([
"
../../lib/codemirror
"
,
"
../xml/xml
"
,
"
../javascript/javascript
"
,
"
../css/css
"
],
mod
);
else
// Plain browser env
mod
(
CodeMirror
);
})(
function
(
CodeMirror
)
{
"
use strict
"
;
var
defaultTags
=
{
script
:
[
[
"
lang
"
,
/
(
javascript|babel
)
/i
,
"
javascript
"
],
[
"
type
"
,
/^
(?:
text|application
)\/(?:
x-
)?(?:
java|ecma
)
script$|^module$|^$/i
,
"
javascript
"
],
[
"
type
"
,
/./
,
"
text/plain
"
],
[
null
,
null
,
"
javascript
"
]
],
style
:
[
[
"
lang
"
,
/^css$/i
,
"
css
"
],
[
"
type
"
,
/^
(
text
\/)?(
x-
)?(
stylesheet|css
)
$/i
,
"
css
"
],
[
"
type
"
,
/./
,
"
text/plain
"
],
[
null
,
null
,
"
css
"
]
]
};
function
maybeBackup
(
stream
,
pat
,
style
)
{
var
cur
=
stream
.
current
(),
close
=
cur
.
search
(
pat
);
if
(
close
>
-
1
)
{
stream
.
backUp
(
cur
.
length
-
close
);
}
else
if
(
cur
.
match
(
/<
\/?
$/
))
{
stream
.
backUp
(
cur
.
length
);
if
(
!
stream
.
match
(
pat
,
false
))
stream
.
match
(
cur
);
}
return
style
;
}
var
attrRegexpCache
=
{};
function
getAttrRegexp
(
attr
)
{
var
regexp
=
attrRegexpCache
[
attr
];
if
(
regexp
)
return
regexp
;
return
attrRegexpCache
[
attr
]
=
new
RegExp
(
"
\\
s+
"
+
attr
+
"
\\
s*=
\\
s*('|
\"
)?([^'
\"
]+)('|
\"
)?
\\
s*
"
);
}
function
getAttrValue
(
text
,
attr
)
{
var
match
=
text
.
match
(
getAttrRegexp
(
attr
))
return
match
?
/^
\s
*
(
.*
?)\s
*$/
.
exec
(
match
[
2
])[
1
]
:
""
}
function
getTagRegexp
(
tagName
,
anchored
)
{
return
new
RegExp
((
anchored
?
"
^
"
:
""
)
+
"
<
\
/
\
s*
"
+
tagName
+
"
\
s*>
"
,
"
i
"
);
}
function
addTags
(
from
,
to
)
{
for
(
var
tag
in
from
)
{
var
dest
=
to
[
tag
]
||
(
to
[
tag
]
=
[]);
var
source
=
from
[
tag
];
for
(
var
i
=
source
.
length
-
1
;
i
>=
0
;
i
--
)
dest
.
unshift
(
source
[
i
])
}
}
function
findMatchingMode
(
tagInfo
,
tagText
)
{
for
(
var
i
=
0
;
i
<
tagInfo
.
length
;
i
++
)
{
var
spec
=
tagInfo
[
i
];
if
(
!
spec
[
0
]
||
spec
[
1
].
test
(
getAttrValue
(
tagText
,
spec
[
0
])))
return
spec
[
2
];
}
}
CodeMirror
.
defineMode
(
"
htmlmixed
"
,
function
(
config
,
parserConfig
)
{
var
htmlMode
=
CodeMirror
.
getMode
(
config
,
{
name
:
"
xml
"
,
htmlMode
:
true
,
multilineTagIndentFactor
:
parserConfig
.
multilineTagIndentFactor
,
multilineTagIndentPastTag
:
parserConfig
.
multilineTagIndentPastTag
});
var
tags
=
{};
var
configTags
=
parserConfig
&&
parserConfig
.
tags
,
configScript
=
parserConfig
&&
parserConfig
.
scriptTypes
;
addTags
(
defaultTags
,
tags
);
if
(
configTags
)
addTags
(
configTags
,
tags
);
if
(
configScript
)
for
(
var
i
=
configScript
.
length
-
1
;
i
>=
0
;
i
--
)
tags
.
script
.
unshift
([
"
type
"
,
configScript
[
i
].
matches
,
configScript
[
i
].
mode
])
function
html
(
stream
,
state
)
{
var
style
=
htmlMode
.
token
(
stream
,
state
.
htmlState
),
tag
=
/
\b
tag
\b
/
.
test
(
style
),
tagName
if
(
tag
&&
!
/
[
<>
\s\/]
/
.
test
(
stream
.
current
())
&&
(
tagName
=
state
.
htmlState
.
tagName
&&
state
.
htmlState
.
tagName
.
toLowerCase
())
&&
tags
.
hasOwnProperty
(
tagName
))
{
state
.
inTag
=
tagName
+
"
"
}
else
if
(
state
.
inTag
&&
tag
&&
/>$/
.
test
(
stream
.
current
()))
{
var
inTag
=
/^
([\S]
+
)
(
.*
)
/
.
exec
(
state
.
inTag
)
state
.
inTag
=
null
var
modeSpec
=
stream
.
current
()
==
"
>
"
&&
findMatchingMode
(
tags
[
inTag
[
1
]],
inTag
[
2
])
var
mode
=
CodeMirror
.
getMode
(
config
,
modeSpec
)
var
endTagA
=
getTagRegexp
(
inTag
[
1
],
true
),
endTag
=
getTagRegexp
(
inTag
[
1
],
false
);
state
.
token
=
function
(
stream
,
state
)
{
if
(
stream
.
match
(
endTagA
,
false
))
{
state
.
token
=
html
;
state
.
localState
=
state
.
localMode
=
null
;
return
null
;
}
return
maybeBackup
(
stream
,
endTag
,
state
.
localMode
.
token
(
stream
,
state
.
localState
));
};
state
.
localMode
=
mode
;
state
.
localState
=
CodeMirror
.
startState
(
mode
,
htmlMode
.
indent
(
state
.
htmlState
,
""
,
""
));
}
else
if
(
state
.
inTag
)
{
state
.
inTag
+=
stream
.
current
()
if
(
stream
.
eol
())
state
.
inTag
+=
"
"
}
return
style
;
};
return
{
startState
:
function
()
{
var
state
=
CodeMirror
.
startState
(
htmlMode
);
return
{
token
:
html
,
inTag
:
null
,
localMode
:
null
,
localState
:
null
,
htmlState
:
state
};
},
copyState
:
function
(
state
)
{
var
local
;
if
(
state
.
localState
)
{
local
=
CodeMirror
.
copyState
(
state
.
localMode
,
state
.
localState
);
}
return
{
token
:
state
.
token
,
inTag
:
state
.
inTag
,
localMode
:
state
.
localMode
,
localState
:
local
,
htmlState
:
CodeMirror
.
copyState
(
htmlMode
,
state
.
htmlState
)};
},
token
:
function
(
stream
,
state
)
{
return
state
.
token
(
stream
,
state
);
},
indent
:
function
(
state
,
textAfter
,
line
)
{
if
(
!
state
.
localMode
||
/^
\s
*<
\/
/
.
test
(
textAfter
))
return
htmlMode
.
indent
(
state
.
htmlState
,
textAfter
,
line
);
else
if
(
state
.
localMode
.
indent
)
return
state
.
localMode
.
indent
(
state
.
localState
,
textAfter
,
line
);
else
return
CodeMirror
.
Pass
;
},
innerMode
:
function
(
state
)
{
return
{
state
:
state
.
localState
||
state
.
htmlState
,
mode
:
state
.
localMode
||
htmlMode
};
}
};
},
"
xml
"
,
"
javascript
"
,
"
css
"
);
CodeMirror
.
defineMIME
(
"
text/html
"
,
"
htmlmixed
"
);
});
src/main/webapp/static/plugins/codemirror/5.48.4/mode/htmlmixed/index.html
0 → 100644
View file @
53f587bc
<!doctype html>
<title>
CodeMirror: HTML mixed mode
</title>
<meta
charset=
"utf-8"
/>
<link
rel=
stylesheet
href=
"../../doc/docs.css"
>
<link
rel=
"stylesheet"
href=
"../../lib/codemirror.css"
>
<script
src=
"../../lib/codemirror.js"
></script>
<script
src=
"../../addon/selection/selection-pointer.js"
></script>
<script
src=
"../xml/xml.js"
></script>
<script
src=
"../javascript/javascript.js"
></script>
<script
src=
"../css/css.js"
></script>
<script
src=
"../vbscript/vbscript.js"
></script>
<script
src=
"htmlmixed.js"
></script>
<style>
.CodeMirror
{
border-top
:
1px
solid
black
;
border-bottom
:
1px
solid
black
;}
</style>
<div
id=
nav
>
<a
href=
"https://codemirror.net"
><h1>
CodeMirror
</h1><img
id=
logo
src=
"../../doc/logo.png"
></a>
<ul>
<li><a
href=
"../../index.html"
>
Home
</a>
<li><a
href=
"../../doc/manual.html"
>
Manual
</a>
<li><a
href=
"https://github.com/codemirror/codemirror"
>
Code
</a>
</ul>
<ul>
<li><a
href=
"../index.html"
>
Language modes
</a>
<li><a
class=
active
href=
"#"
>
HTML mixed
</a>
</ul>
</div>
<article>
<h2>
HTML mixed mode
</h2>
<form><textarea
id=
"code"
name=
"code"
>
<html
style=
"color: green"
>
<!-- this is a comment -->
<head>
<title>
Mixed HTML Example
</title>
<style>
h1
{
font-family
:
comic
sans
;
color
:
#f0f
;}
div
{
background
:
yellow
!important
;}
body
{
max-width
:
50em
;
margin
:
1em
2em
1em
5em
;
}
</style>
</head>
<body>
<h1>
Mixed HTML Example
</h1>
<script>
function
jsFunc
(
arg1
,
arg2
)
{
if
(
arg1
&&
arg2
)
document
.
body
.
innerHTML
=
"
achoo
"
;
}
</script>
</body>
</html>
</textarea></form>
<script>
// Define an extended mixed-mode that understands vbscript and
// leaves mustache/handlebars embedded templates in html mode
var
mixedMode
=
{
name
:
"
htmlmixed
"
,
scriptTypes
:
[{
matches
:
/
\/
x-handlebars-template|
\/
x-mustache/i
,
mode
:
null
},
{
matches
:
/
(
text|application
)\/(
x-
)?
vb
(
a|script
)
/i
,
mode
:
"
vbscript
"
}]
};
var
editor
=
CodeMirror
.
fromTextArea
(
document
.
getElementById
(
"
code
"
),
{
mode
:
mixedMode
,
selectionPointer
:
true
});
</script>
<p>
The HTML mixed mode depends on the XML, JavaScript, and CSS modes.
</p>
<p>
It takes an optional mode configuration
option,
<code>
tags
</code>
, which can be used to add custom
behavior for specific tags. When given, it should be an object
mapping tag names (for example
<code>
script
</code>
) to arrays or
three-element arrays. Those inner arrays indicate [attributeName,
valueRegexp,
<a
href=
"../../doc/manual.html#option_mode"
>
modeSpec
</a>
]
specifications. For example, you could use
<code>
["type", /^foo$/,
"foo"]
</code>
to map the attribute
<code>
type="foo"
</code>
to
the
<code>
foo
</code>
mode. When the first two fields are null
(
<code>
[null, null, "mode"]
</code>
), the given mode is used for
any such tag that doesn't match any of the previously given
attributes. For example:
</p>
<pre>
var myModeSpec = {
name: "htmlmixed",
tags: {
style: [["type", /^text\/(x-)?scss$/, "text/x-scss"],
[null, null, "css"]],
custom: [[null, null, "customMode"]]
}
}
</pre>
<p><strong>
MIME types defined:
</strong>
<code>
text/html
</code>
(redefined, only takes effect if you load this parser after the
XML parser).
</p>
</article>
src/main/webapp/static/plugins/codemirror/5.48.4/mode/http/http.js
0 → 100644
View file @
53f587bc
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
(
function
(
mod
)
{
if
(
typeof
exports
==
"
object
"
&&
typeof
module
==
"
object
"
)
// CommonJS
mod
(
require
(
"
../../lib/codemirror
"
));
else
if
(
typeof
define
==
"
function
"
&&
define
.
amd
)
// AMD
define
([
"
../../lib/codemirror
"
],
mod
);
else
// Plain browser env
mod
(
CodeMirror
);
})(
function
(
CodeMirror
)
{
"
use strict
"
;
CodeMirror
.
defineMode
(
"
http
"
,
function
()
{
function
failFirstLine
(
stream
,
state
)
{
stream
.
skipToEnd
();
state
.
cur
=
header
;
return
"
error
"
;
}
function
start
(
stream
,
state
)
{
if
(
stream
.
match
(
/^HTTP
\/\d\.\d
/
))
{
state
.
cur
=
responseStatusCode
;
return
"
keyword
"
;
}
else
if
(
stream
.
match
(
/^
[
A-Z
]
+/
)
&&
/
[
\t]
/
.
test
(
stream
.
peek
()))
{
state
.
cur
=
requestPath
;
return
"
keyword
"
;
}
else
{
return
failFirstLine
(
stream
,
state
);
}
}
function
responseStatusCode
(
stream
,
state
)
{
var
code
=
stream
.
match
(
/^
\d
+/
);
if
(
!
code
)
return
failFirstLine
(
stream
,
state
);
state
.
cur
=
responseStatusText
;
var
status
=
Number
(
code
[
0
]);
if
(
status
>=
100
&&
status
<
200
)
{
return
"
positive informational
"
;
}
else
if
(
status
>=
200
&&
status
<
300
)
{
return
"
positive success
"
;
}
else
if
(
status
>=
300
&&
status
<
400
)
{
return
"
positive redirect
"
;
}
else
if
(
status
>=
400
&&
status
<
500
)
{
return
"
negative client-error
"
;
}
else
if
(
status
>=
500
&&
status
<
600
)
{
return
"
negative server-error
"
;
}
else
{
return
"
error
"
;
}
}
function
responseStatusText
(
stream
,
state
)
{
stream
.
skipToEnd
();
state
.
cur
=
header
;
return
null
;
}
function
requestPath
(
stream
,
state
)
{
stream
.
eatWhile
(
/
\S
/
);
state
.
cur
=
requestProtocol
;
return
"
string-2
"
;
}
function
requestProtocol
(
stream
,
state
)
{
if
(
stream
.
match
(
/^HTTP
\/\d\.\d
$/
))
{
state
.
cur
=
header
;
return
"
keyword
"
;
}
else
{
return
failFirstLine
(
stream
,
state
);
}
}
function
header
(
stream
)
{
if
(
stream
.
sol
()
&&
!
stream
.
eat
(
/
[
\t]
/
))
{
if
(
stream
.
match
(
/^.*
?
:/
))
{
return
"
atom
"
;
}
else
{
stream
.
skipToEnd
();
return
"
error
"
;
}
}
else
{
stream
.
skipToEnd
();
return
"
string
"
;
}
}
function
body
(
stream
)
{
stream
.
skipToEnd
();
return
null
;
}
return
{
token
:
function
(
stream
,
state
)
{
var
cur
=
state
.
cur
;
if
(
cur
!=
header
&&
cur
!=
body
&&
stream
.
eatSpace
())
return
null
;
return
cur
(
stream
,
state
);
},
blankLine
:
function
(
state
)
{
state
.
cur
=
body
;
},
startState
:
function
()
{
return
{
cur
:
start
};
}
};
});
CodeMirror
.
defineMIME
(
"
message/http
"
,
"
http
"
);
});
src/main/webapp/static/plugins/codemirror/5.48.4/mode/http/index.html
0 → 100644
View file @
53f587bc
<!doctype html>
<title>
CodeMirror: HTTP mode
</title>
<meta
charset=
"utf-8"
/>
<link
rel=
stylesheet
href=
"../../doc/docs.css"
>
<link
rel=
"stylesheet"
href=
"../../lib/codemirror.css"
>
<script
src=
"../../lib/codemirror.js"
></script>
<script
src=
"http.js"
></script>
<style>
.CodeMirror
{
border-top
:
1px
solid
black
;
border-bottom
:
1px
solid
black
;}
</style>
<div
id=
nav
>
<a
href=
"https://codemirror.net"
><h1>
CodeMirror
</h1><img
id=
logo
src=
"../../doc/logo.png"
></a>
<ul>
<li><a
href=
"../../index.html"
>
Home
</a>
<li><a
href=
"../../doc/manual.html"
>
Manual
</a>
<li><a
href=
"https://github.com/codemirror/codemirror"
>
Code
</a>
</ul>
<ul>
<li><a
href=
"../index.html"
>
Language modes
</a>
<li><a
class=
active
href=
"#"
>
HTTP
</a>
</ul>
</div>
<article>
<h2>
HTTP mode
</h2>
<div><textarea
id=
"code"
name=
"code"
>
POST /somewhere HTTP/1.1
Host: example.com
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
Content-Type: application/x-www-form-urlencoded;
charset=utf-8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.11 (KHTML, like Gecko) Ubuntu/12.04 Chromium/20.0.1132.47 Chrome/20.0.1132.47 Safari/536.11
This is the request body!
</textarea></div>
<script>
var
editor
=
CodeMirror
.
fromTextArea
(
document
.
getElementById
(
"
code
"
),
{});
</script>
<p><strong>
MIME types defined:
</strong>
<code>
message/http
</code>
.
</p>
</article>
src/main/webapp/static/plugins/codemirror/5.48.4/mode/idl/idl.js
0 → 100644
View file @
53f587bc
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
(
function
(
mod
)
{
if
(
typeof
exports
==
"
object
"
&&
typeof
module
==
"
object
"
)
// CommonJS
mod
(
require
(
"
../../lib/codemirror
"
));
else
if
(
typeof
define
==
"
function
"
&&
define
.
amd
)
// AMD
define
([
"
../../lib/codemirror
"
],
mod
);
else
// Plain browser env
mod
(
CodeMirror
);
})(
function
(
CodeMirror
)
{
"
use strict
"
;
function
wordRegexp
(
words
)
{
return
new
RegExp
(
'
^((
'
+
words
.
join
(
'
)|(
'
)
+
'
))
\\
b
'
,
'
i
'
);
};
var
builtinArray
=
[
'
a_correlate
'
,
'
abs
'
,
'
acos
'
,
'
adapt_hist_equal
'
,
'
alog
'
,
'
alog2
'
,
'
alog10
'
,
'
amoeba
'
,
'
annotate
'
,
'
app_user_dir
'
,
'
app_user_dir_query
'
,
'
arg_present
'
,
'
array_equal
'
,
'
array_indices
'
,
'
arrow
'
,
'
ascii_template
'
,
'
asin
'
,
'
assoc
'
,
'
atan
'
,
'
axis
'
,
'
axis
'
,
'
bandpass_filter
'
,
'
bandreject_filter
'
,
'
barplot
'
,
'
bar_plot
'
,
'
beseli
'
,
'
beselj
'
,
'
beselk
'
,
'
besely
'
,
'
beta
'
,
'
biginteger
'
,
'
bilinear
'
,
'
bin_date
'
,
'
binary_template
'
,
'
bindgen
'
,
'
binomial
'
,
'
bit_ffs
'
,
'
bit_population
'
,
'
blas_axpy
'
,
'
blk_con
'
,
'
boolarr
'
,
'
boolean
'
,
'
boxplot
'
,
'
box_cursor
'
,
'
breakpoint
'
,
'
broyden
'
,
'
bubbleplot
'
,
'
butterworth
'
,
'
bytarr
'
,
'
byte
'
,
'
byteorder
'
,
'
bytscl
'
,
'
c_correlate
'
,
'
calendar
'
,
'
caldat
'
,
'
call_external
'
,
'
call_function
'
,
'
call_method
'
,
'
call_procedure
'
,
'
canny
'
,
'
catch
'
,
'
cd
'
,
'
cdf
'
,
'
ceil
'
,
'
chebyshev
'
,
'
check_math
'
,
'
chisqr_cvf
'
,
'
chisqr_pdf
'
,
'
choldc
'
,
'
cholsol
'
,
'
cindgen
'
,
'
cir_3pnt
'
,
'
clipboard
'
,
'
close
'
,
'
clust_wts
'
,
'
cluster
'
,
'
cluster_tree
'
,
'
cmyk_convert
'
,
'
code_coverage
'
,
'
color_convert
'
,
'
color_exchange
'
,
'
color_quan
'
,
'
color_range_map
'
,
'
colorbar
'
,
'
colorize_sample
'
,
'
colormap_applicable
'
,
'
colormap_gradient
'
,
'
colormap_rotation
'
,
'
colortable
'
,
'
comfit
'
,
'
command_line_args
'
,
'
common
'
,
'
compile_opt
'
,
'
complex
'
,
'
complexarr
'
,
'
complexround
'
,
'
compute_mesh_normals
'
,
'
cond
'
,
'
congrid
'
,
'
conj
'
,
'
constrained_min
'
,
'
contour
'
,
'
contour
'
,
'
convert_coord
'
,
'
convol
'
,
'
convol_fft
'
,
'
coord2to3
'
,
'
copy_lun
'
,
'
correlate
'
,
'
cos
'
,
'
cosh
'
,
'
cpu
'
,
'
cramer
'
,
'
createboxplotdata
'
,
'
create_cursor
'
,
'
create_struct
'
,
'
create_view
'
,
'
crossp
'
,
'
crvlength
'
,
'
ct_luminance
'
,
'
cti_test
'
,
'
cursor
'
,
'
curvefit
'
,
'
cv_coord
'
,
'
cvttobm
'
,
'
cw_animate
'
,
'
cw_animate_getp
'
,
'
cw_animate_load
'
,
'
cw_animate_run
'
,
'
cw_arcball
'
,
'
cw_bgroup
'
,
'
cw_clr_index
'
,
'
cw_colorsel
'
,
'
cw_defroi
'
,
'
cw_field
'
,
'
cw_filesel
'
,
'
cw_form
'
,
'
cw_fslider
'
,
'
cw_light_editor
'
,
'
cw_light_editor_get
'
,
'
cw_light_editor_set
'
,
'
cw_orient
'
,
'
cw_palette_editor
'
,
'
cw_palette_editor_get
'
,
'
cw_palette_editor_set
'
,
'
cw_pdmenu
'
,
'
cw_rgbslider
'
,
'
cw_tmpl
'
,
'
cw_zoom
'
,
'
db_exists
'
,
'
dblarr
'
,
'
dcindgen
'
,
'
dcomplex
'
,
'
dcomplexarr
'
,
'
define_key
'
,
'
define_msgblk
'
,
'
define_msgblk_from_file
'
,
'
defroi
'
,
'
defsysv
'
,
'
delvar
'
,
'
dendro_plot
'
,
'
dendrogram
'
,
'
deriv
'
,
'
derivsig
'
,
'
determ
'
,
'
device
'
,
'
dfpmin
'
,
'
diag_matrix
'
,
'
dialog_dbconnect
'
,
'
dialog_message
'
,
'
dialog_pickfile
'
,
'
dialog_printersetup
'
,
'
dialog_printjob
'
,
'
dialog_read_image
'
,
'
dialog_write_image
'
,
'
dictionary
'
,
'
digital_filter
'
,
'
dilate
'
,
'
dindgen
'
,
'
dissolve
'
,
'
dist
'
,
'
distance_measure
'
,
'
dlm_load
'
,
'
dlm_register
'
,
'
doc_library
'
,
'
double
'
,
'
draw_roi
'
,
'
edge_dog
'
,
'
efont
'
,
'
eigenql
'
,
'
eigenvec
'
,
'
ellipse
'
,
'
elmhes
'
,
'
emboss
'
,
'
empty
'
,
'
enable_sysrtn
'
,
'
eof
'
,
'
eos
'
,
'
erase
'
,
'
erf
'
,
'
erfc
'
,
'
erfcx
'
,
'
erode
'
,
'
errorplot
'
,
'
errplot
'
,
'
estimator_filter
'
,
'
execute
'
,
'
exit
'
,
'
exp
'
,
'
expand
'
,
'
expand_path
'
,
'
expint
'
,
'
extrac
'
,
'
extract_slice
'
,
'
f_cvf
'
,
'
f_pdf
'
,
'
factorial
'
,
'
fft
'
,
'
file_basename
'
,
'
file_chmod
'
,
'
file_copy
'
,
'
file_delete
'
,
'
file_dirname
'
,
'
file_expand_path
'
,
'
file_gunzip
'
,
'
file_gzip
'
,
'
file_info
'
,
'
file_lines
'
,
'
file_link
'
,
'
file_mkdir
'
,
'
file_move
'
,
'
file_poll_input
'
,
'
file_readlink
'
,
'
file_same
'
,
'
file_search
'
,
'
file_tar
'
,
'
file_test
'
,
'
file_untar
'
,
'
file_unzip
'
,
'
file_which
'
,
'
file_zip
'
,
'
filepath
'
,
'
findgen
'
,
'
finite
'
,
'
fix
'
,
'
flick
'
,
'
float
'
,
'
floor
'
,
'
flow3
'
,
'
fltarr
'
,
'
flush
'
,
'
format_axis_values
'
,
'
forward_function
'
,
'
free_lun
'
,
'
fstat
'
,
'
fulstr
'
,
'
funct
'
,
'
function
'
,
'
fv_test
'
,
'
fx_root
'
,
'
fz_roots
'
,
'
gamma
'
,
'
gamma_ct
'
,
'
gauss_cvf
'
,
'
gauss_pdf
'
,
'
gauss_smooth
'
,
'
gauss2dfit
'
,
'
gaussfit
'
,
'
gaussian_function
'
,
'
gaussint
'
,
'
get_drive_list
'
,
'
get_dxf_objects
'
,
'
get_kbrd
'
,
'
get_login_info
'
,
'
get_lun
'
,
'
get_screen_size
'
,
'
getenv
'
,
'
getwindows
'
,
'
greg2jul
'
,
'
grib
'
,
'
grid_input
'
,
'
grid_tps
'
,
'
grid3
'
,
'
griddata
'
,
'
gs_iter
'
,
'
h_eq_ct
'
,
'
h_eq_int
'
,
'
hanning
'
,
'
hash
'
,
'
hdf
'
,
'
hdf5
'
,
'
heap_free
'
,
'
heap_gc
'
,
'
heap_nosave
'
,
'
heap_refcount
'
,
'
heap_save
'
,
'
help
'
,
'
hilbert
'
,
'
hist_2d
'
,
'
hist_equal
'
,
'
histogram
'
,
'
hls
'
,
'
hough
'
,
'
hqr
'
,
'
hsv
'
,
'
i18n_multibytetoutf8
'
,
'
i18n_multibytetowidechar
'
,
'
i18n_utf8tomultibyte
'
,
'
i18n_widechartomultibyte
'
,
'
ibeta
'
,
'
icontour
'
,
'
iconvertcoord
'
,
'
idelete
'
,
'
identity
'
,
'
idl_base64
'
,
'
idl_container
'
,
'
idl_validname
'
,
'
idlexbr_assistant
'
,
'
idlitsys_createtool
'
,
'
idlunit
'
,
'
iellipse
'
,
'
igamma
'
,
'
igetcurrent
'
,
'
igetdata
'
,
'
igetid
'
,
'
igetproperty
'
,
'
iimage
'
,
'
image
'
,
'
image_cont
'
,
'
image_statistics
'
,
'
image_threshold
'
,
'
imaginary
'
,
'
imap
'
,
'
indgen
'
,
'
int_2d
'
,
'
int_3d
'
,
'
int_tabulated
'
,
'
intarr
'
,
'
interpol
'
,
'
interpolate
'
,
'
interval_volume
'
,
'
invert
'
,
'
ioctl
'
,
'
iopen
'
,
'
ir_filter
'
,
'
iplot
'
,
'
ipolygon
'
,
'
ipolyline
'
,
'
iputdata
'
,
'
iregister
'
,
'
ireset
'
,
'
iresolve
'
,
'
irotate
'
,
'
isa
'
,
'
isave
'
,
'
iscale
'
,
'
isetcurrent
'
,
'
isetproperty
'
,
'
ishft
'
,
'
isocontour
'
,
'
isosurface
'
,
'
isurface
'
,
'
itext
'
,
'
itranslate
'
,
'
ivector
'
,
'
ivolume
'
,
'
izoom
'
,
'
journal
'
,
'
json_parse
'
,
'
json_serialize
'
,
'
jul2greg
'
,
'
julday
'
,
'
keyword_set
'
,
'
krig2d
'
,
'
kurtosis
'
,
'
kw_test
'
,
'
l64indgen
'
,
'
la_choldc
'
,
'
la_cholmprove
'
,
'
la_cholsol
'
,
'
la_determ
'
,
'
la_eigenproblem
'
,
'
la_eigenql
'
,
'
la_eigenvec
'
,
'
la_elmhes
'
,
'
la_gm_linear_model
'
,
'
la_hqr
'
,
'
la_invert
'
,
'
la_least_square_equality
'
,
'
la_least_squares
'
,
'
la_linear_equation
'
,
'
la_ludc
'
,
'
la_lumprove
'
,
'
la_lusol
'
,
'
la_svd
'
,
'
la_tridc
'
,
'
la_trimprove
'
,
'
la_triql
'
,
'
la_trired
'
,
'
la_trisol
'
,
'
label_date
'
,
'
label_region
'
,
'
ladfit
'
,
'
laguerre
'
,
'
lambda
'
,
'
lambdap
'
,
'
lambertw
'
,
'
laplacian
'
,
'
least_squares_filter
'
,
'
leefilt
'
,
'
legend
'
,
'
legendre
'
,
'
linbcg
'
,
'
lindgen
'
,
'
linfit
'
,
'
linkimage
'
,
'
list
'
,
'
ll_arc_distance
'
,
'
lmfit
'
,
'
lmgr
'
,
'
lngamma
'
,
'
lnp_test
'
,
'
loadct
'
,
'
locale_get
'
,
'
logical_and
'
,
'
logical_or
'
,
'
logical_true
'
,
'
lon64arr
'
,
'
lonarr
'
,
'
long
'
,
'
long64
'
,
'
lsode
'
,
'
lu_complex
'
,
'
ludc
'
,
'
lumprove
'
,
'
lusol
'
,
'
m_correlate
'
,
'
machar
'
,
'
make_array
'
,
'
make_dll
'
,
'
make_rt
'
,
'
map
'
,
'
mapcontinents
'
,
'
mapgrid
'
,
'
map_2points
'
,
'
map_continents
'
,
'
map_grid
'
,
'
map_image
'
,
'
map_patch
'
,
'
map_proj_forward
'
,
'
map_proj_image
'
,
'
map_proj_info
'
,
'
map_proj_init
'
,
'
map_proj_inverse
'
,
'
map_set
'
,
'
matrix_multiply
'
,
'
matrix_power
'
,
'
max
'
,
'
md_test
'
,
'
mean
'
,
'
meanabsdev
'
,
'
mean_filter
'
,
'
median
'
,
'
memory
'
,
'
mesh_clip
'
,
'
mesh_decimate
'
,
'
mesh_issolid
'
,
'
mesh_merge
'
,
'
mesh_numtriangles
'
,
'
mesh_obj
'
,
'
mesh_smooth
'
,
'
mesh_surfacearea
'
,
'
mesh_validate
'
,
'
mesh_volume
'
,
'
message
'
,
'
min
'
,
'
min_curve_surf
'
,
'
mk_html_help
'
,
'
modifyct
'
,
'
moment
'
,
'
morph_close
'
,
'
morph_distance
'
,
'
morph_gradient
'
,
'
morph_hitormiss
'
,
'
morph_open
'
,
'
morph_thin
'
,
'
morph_tophat
'
,
'
multi
'
,
'
n_elements
'
,
'
n_params
'
,
'
n_tags
'
,
'
ncdf
'
,
'
newton
'
,
'
noise_hurl
'
,
'
noise_pick
'
,
'
noise_scatter
'
,
'
noise_slur
'
,
'
norm
'
,
'
obj_class
'
,
'
obj_destroy
'
,
'
obj_hasmethod
'
,
'
obj_isa
'
,
'
obj_new
'
,
'
obj_valid
'
,
'
objarr
'
,
'
on_error
'
,
'
on_ioerror
'
,
'
online_help
'
,
'
openr
'
,
'
openu
'
,
'
openw
'
,
'
oplot
'
,
'
oploterr
'
,
'
orderedhash
'
,
'
p_correlate
'
,
'
parse_url
'
,
'
particle_trace
'
,
'
path_cache
'
,
'
path_sep
'
,
'
pcomp
'
,
'
plot
'
,
'
plot3d
'
,
'
plot
'
,
'
plot_3dbox
'
,
'
plot_field
'
,
'
ploterr
'
,
'
plots
'
,
'
polar_contour
'
,
'
polar_surface
'
,
'
polyfill
'
,
'
polyshade
'
,
'
pnt_line
'
,
'
point_lun
'
,
'
polarplot
'
,
'
poly
'
,
'
poly_2d
'
,
'
poly_area
'
,
'
poly_fit
'
,
'
polyfillv
'
,
'
polygon
'
,
'
polyline
'
,
'
polywarp
'
,
'
popd
'
,
'
powell
'
,
'
pref_commit
'
,
'
pref_get
'
,
'
pref_set
'
,
'
prewitt
'
,
'
primes
'
,
'
print
'
,
'
printf
'
,
'
printd
'
,
'
pro
'
,
'
product
'
,
'
profile
'
,
'
profiler
'
,
'
profiles
'
,
'
project_vol
'
,
'
ps_show_fonts
'
,
'
psafm
'
,
'
pseudo
'
,
'
ptr_free
'
,
'
ptr_new
'
,
'
ptr_valid
'
,
'
ptrarr
'
,
'
pushd
'
,
'
qgrid3
'
,
'
qhull
'
,
'
qromb
'
,
'
qromo
'
,
'
qsimp
'
,
'
query_*
'
,
'
query_ascii
'
,
'
query_bmp
'
,
'
query_csv
'
,
'
query_dicom
'
,
'
query_gif
'
,
'
query_image
'
,
'
query_jpeg
'
,
'
query_jpeg2000
'
,
'
query_mrsid
'
,
'
query_pict
'
,
'
query_png
'
,
'
query_ppm
'
,
'
query_srf
'
,
'
query_tiff
'
,
'
query_video
'
,
'
query_wav
'
,
'
r_correlate
'
,
'
r_test
'
,
'
radon
'
,
'
randomn
'
,
'
randomu
'
,
'
ranks
'
,
'
rdpix
'
,
'
read
'
,
'
readf
'
,
'
read_ascii
'
,
'
read_binary
'
,
'
read_bmp
'
,
'
read_csv
'
,
'
read_dicom
'
,
'
read_gif
'
,
'
read_image
'
,
'
read_interfile
'
,
'
read_jpeg
'
,
'
read_jpeg2000
'
,
'
read_mrsid
'
,
'
read_pict
'
,
'
read_png
'
,
'
read_ppm
'
,
'
read_spr
'
,
'
read_srf
'
,
'
read_sylk
'
,
'
read_tiff
'
,
'
read_video
'
,
'
read_wav
'
,
'
read_wave
'
,
'
read_x11_bitmap
'
,
'
read_xwd
'
,
'
reads
'
,
'
readu
'
,
'
real_part
'
,
'
rebin
'
,
'
recall_commands
'
,
'
recon3
'
,
'
reduce_colors
'
,
'
reform
'
,
'
region_grow
'
,
'
register_cursor
'
,
'
regress
'
,
'
replicate
'
,
'
replicate_inplace
'
,
'
resolve_all
'
,
'
resolve_routine
'
,
'
restore
'
,
'
retall
'
,
'
return
'
,
'
reverse
'
,
'
rk4
'
,
'
roberts
'
,
'
rot
'
,
'
rotate
'
,
'
round
'
,
'
routine_filepath
'
,
'
routine_info
'
,
'
rs_test
'
,
'
s_test
'
,
'
save
'
,
'
savgol
'
,
'
scale3
'
,
'
scale3d
'
,
'
scatterplot
'
,
'
scatterplot3d
'
,
'
scope_level
'
,
'
scope_traceback
'
,
'
scope_varfetch
'
,
'
scope_varname
'
,
'
search2d
'
,
'
search3d
'
,
'
sem_create
'
,
'
sem_delete
'
,
'
sem_lock
'
,
'
sem_release
'
,
'
set_plot
'
,
'
set_shading
'
,
'
setenv
'
,
'
sfit
'
,
'
shade_surf
'
,
'
shade_surf_irr
'
,
'
shade_volume
'
,
'
shift
'
,
'
shift_diff
'
,
'
shmdebug
'
,
'
shmmap
'
,
'
shmunmap
'
,
'
shmvar
'
,
'
show3
'
,
'
showfont
'
,
'
signum
'
,
'
simplex
'
,
'
sin
'
,
'
sindgen
'
,
'
sinh
'
,
'
size
'
,
'
skewness
'
,
'
skip_lun
'
,
'
slicer3
'
,
'
slide_image
'
,
'
smooth
'
,
'
sobel
'
,
'
socket
'
,
'
sort
'
,
'
spawn
'
,
'
sph_4pnt
'
,
'
sph_scat
'
,
'
spher_harm
'
,
'
spl_init
'
,
'
spl_interp
'
,
'
spline
'
,
'
spline_p
'
,
'
sprsab
'
,
'
sprsax
'
,
'
sprsin
'
,
'
sprstp
'
,
'
sqrt
'
,
'
standardize
'
,
'
stddev
'
,
'
stop
'
,
'
strarr
'
,
'
strcmp
'
,
'
strcompress
'
,
'
streamline
'
,
'
streamline
'
,
'
stregex
'
,
'
stretch
'
,
'
string
'
,
'
strjoin
'
,
'
strlen
'
,
'
strlowcase
'
,
'
strmatch
'
,
'
strmessage
'
,
'
strmid
'
,
'
strpos
'
,
'
strput
'
,
'
strsplit
'
,
'
strtrim
'
,
'
struct_assign
'
,
'
struct_hide
'
,
'
strupcase
'
,
'
surface
'
,
'
surface
'
,
'
surfr
'
,
'
svdc
'
,
'
svdfit
'
,
'
svsol
'
,
'
swap_endian
'
,
'
swap_endian_inplace
'
,
'
symbol
'
,
'
systime
'
,
'
t_cvf
'
,
'
t_pdf
'
,
'
t3d
'
,
'
tag_names
'
,
'
tan
'
,
'
tanh
'
,
'
tek_color
'
,
'
temporary
'
,
'
terminal_size
'
,
'
tetra_clip
'
,
'
tetra_surface
'
,
'
tetra_volume
'
,
'
text
'
,
'
thin
'
,
'
thread
'
,
'
threed
'
,
'
tic
'
,
'
time_test2
'
,
'
timegen
'
,
'
timer
'
,
'
timestamp
'
,
'
timestamptovalues
'
,
'
tm_test
'
,
'
toc
'
,
'
total
'
,
'
trace
'
,
'
transpose
'
,
'
tri_surf
'
,
'
triangulate
'
,
'
trigrid
'
,
'
triql
'
,
'
trired
'
,
'
trisol
'
,
'
truncate_lun
'
,
'
ts_coef
'
,
'
ts_diff
'
,
'
ts_fcast
'
,
'
ts_smooth
'
,
'
tv
'
,
'
tvcrs
'
,
'
tvlct
'
,
'
tvrd
'
,
'
tvscl
'
,
'
typename
'
,
'
uindgen
'
,
'
uint
'
,
'
uintarr
'
,
'
ul64indgen
'
,
'
ulindgen
'
,
'
ulon64arr
'
,
'
ulonarr
'
,
'
ulong
'
,
'
ulong64
'
,
'
uniq
'
,
'
unsharp_mask
'
,
'
usersym
'
,
'
value_locate
'
,
'
variance
'
,
'
vector
'
,
'
vector_field
'
,
'
vel
'
,
'
velovect
'
,
'
vert_t3d
'
,
'
voigt
'
,
'
volume
'
,
'
voronoi
'
,
'
voxel_proj
'
,
'
wait
'
,
'
warp_tri
'
,
'
watershed
'
,
'
wdelete
'
,
'
wf_draw
'
,
'
where
'
,
'
widget_base
'
,
'
widget_button
'
,
'
widget_combobox
'
,
'
widget_control
'
,
'
widget_displaycontextmenu
'
,
'
widget_draw
'
,
'
widget_droplist
'
,
'
widget_event
'
,
'
widget_info
'
,
'
widget_label
'
,
'
widget_list
'
,
'
widget_propertysheet
'
,
'
widget_slider
'
,
'
widget_tab
'
,
'
widget_table
'
,
'
widget_text
'
,
'
widget_tree
'
,
'
widget_tree_move
'
,
'
widget_window
'
,
'
wiener_filter
'
,
'
window
'
,
'
window
'
,
'
write_bmp
'
,
'
write_csv
'
,
'
write_gif
'
,
'
write_image
'
,
'
write_jpeg
'
,
'
write_jpeg2000
'
,
'
write_nrif
'
,
'
write_pict
'
,
'
write_png
'
,
'
write_ppm
'
,
'
write_spr
'
,
'
write_srf
'
,
'
write_sylk
'
,
'
write_tiff
'
,
'
write_video
'
,
'
write_wav
'
,
'
write_wave
'
,
'
writeu
'
,
'
wset
'
,
'
wshow
'
,
'
wtn
'
,
'
wv_applet
'
,
'
wv_cwt
'
,
'
wv_cw_wavelet
'
,
'
wv_denoise
'
,
'
wv_dwt
'
,
'
wv_fn_coiflet
'
,
'
wv_fn_daubechies
'
,
'
wv_fn_gaussian
'
,
'
wv_fn_haar
'
,
'
wv_fn_morlet
'
,
'
wv_fn_paul
'
,
'
wv_fn_symlet
'
,
'
wv_import_data
'
,
'
wv_import_wavelet
'
,
'
wv_plot3d_wps
'
,
'
wv_plot_multires
'
,
'
wv_pwt
'
,
'
wv_tool_denoise
'
,
'
xbm_edit
'
,
'
xdisplayfile
'
,
'
xdxf
'
,
'
xfont
'
,
'
xinteranimate
'
,
'
xloadct
'
,
'
xmanager
'
,
'
xmng_tmpl
'
,
'
xmtool
'
,
'
xobjview
'
,
'
xobjview_rotate
'
,
'
xobjview_write_image
'
,
'
xpalette
'
,
'
xpcolor
'
,
'
xplot3d
'
,
'
xregistered
'
,
'
xroi
'
,
'
xsq_test
'
,
'
xsurface
'
,
'
xvaredit
'
,
'
xvolume
'
,
'
xvolume_rotate
'
,
'
xvolume_write_image
'
,
'
xyouts
'
,
'
zlib_compress
'
,
'
zlib_uncompress
'
,
'
zoom
'
,
'
zoom_24
'
];
var
builtins
=
wordRegexp
(
builtinArray
);
var
keywordArray
=
[
'
begin
'
,
'
end
'
,
'
endcase
'
,
'
endfor
'
,
'
endwhile
'
,
'
endif
'
,
'
endrep
'
,
'
endforeach
'
,
'
break
'
,
'
case
'
,
'
continue
'
,
'
for
'
,
'
foreach
'
,
'
goto
'
,
'
if
'
,
'
then
'
,
'
else
'
,
'
repeat
'
,
'
until
'
,
'
switch
'
,
'
while
'
,
'
do
'
,
'
pro
'
,
'
function
'
];
var
keywords
=
wordRegexp
(
keywordArray
);
CodeMirror
.
registerHelper
(
"
hintWords
"
,
"
idl
"
,
builtinArray
.
concat
(
keywordArray
));
var
identifiers
=
new
RegExp
(
'
^[_a-z
\
xa1-
\
uffff][_a-z0-9
\
xa1-
\
uffff]*
'
,
'
i
'
);
var
singleOperators
=
/
[
+
\-
*&=<>
\/
@#~$
]
/
;
var
boolOperators
=
new
RegExp
(
'
(and|or|eq|lt|le|gt|ge|ne|not)
'
,
'
i
'
);
function
tokenBase
(
stream
)
{
// whitespaces
if
(
stream
.
eatSpace
())
return
null
;
// Handle one line Comments
if
(
stream
.
match
(
'
;
'
))
{
stream
.
skipToEnd
();
return
'
comment
'
;
}
// Handle Number Literals
if
(
stream
.
match
(
/^
[
0-9
\.
+-
]
/
,
false
))
{
if
(
stream
.
match
(
/^
[
+-
]?
0x
[
0-9a-fA-F
]
+/
))
return
'
number
'
;
if
(
stream
.
match
(
/^
[
+-
]?\d
*
\.\d
+
([
EeDd
][
+-
]?\d
+
)?
/
))
return
'
number
'
;
if
(
stream
.
match
(
/^
[
+-
]?\d
+
([
EeDd
][
+-
]?\d
+
)?
/
))
return
'
number
'
;
}
// Handle Strings
if
(
stream
.
match
(
/^"
([^
"
]
|
(
""
))
*"/
))
{
return
'
string
'
;
}
if
(
stream
.
match
(
/^'
([^
'
]
|
(
''
))
*'/
))
{
return
'
string
'
;
}
// Handle words
if
(
stream
.
match
(
keywords
))
{
return
'
keyword
'
;
}
if
(
stream
.
match
(
builtins
))
{
return
'
builtin
'
;
}
if
(
stream
.
match
(
identifiers
))
{
return
'
variable
'
;
}
if
(
stream
.
match
(
singleOperators
)
||
stream
.
match
(
boolOperators
))
{
return
'
operator
'
;
}
// Handle non-detected items
stream
.
next
();
return
null
;
};
CodeMirror
.
defineMode
(
'
idl
'
,
function
()
{
return
{
token
:
function
(
stream
)
{
return
tokenBase
(
stream
);
}
};
});
CodeMirror
.
defineMIME
(
'
text/x-idl
'
,
'
idl
'
);
});
src/main/webapp/static/plugins/codemirror/5.48.4/mode/idl/index.html
0 → 100644
View file @
53f587bc
<!doctype html>
<title>
CodeMirror: IDL mode
</title>
<meta
charset=
"utf-8"
/>
<link
rel=
stylesheet
href=
"../../doc/docs.css"
>
<link
rel=
"stylesheet"
href=
"../../lib/codemirror.css"
>
<script
src=
"../../lib/codemirror.js"
></script>
<script
src=
"../../addon/edit/matchbrackets.js"
></script>
<script
src=
"idl.js"
></script>
<style>
.CodeMirror
{
border-top
:
1px
solid
black
;
border-bottom
:
1px
solid
black
;}
</style>
<div
id=
nav
>
<a
href=
"https://codemirror.net"
><h1>
CodeMirror
</h1><img
id=
logo
src=
"../../doc/logo.png"
></a>
<ul>
<li><a
href=
"../../index.html"
>
Home
</a>
<li><a
href=
"../../doc/manual.html"
>
Manual
</a>
<li><a
href=
"https://github.com/codemirror/codemirror"
>
Code
</a>
</ul>
<ul>
<li><a
href=
"../index.html"
>
Language modes
</a>
<li><a
class=
active
href=
"#"
>
IDL
</a>
</ul>
</div>
<article>
<h2>
IDL mode
</h2>
<div><textarea
id=
"code"
name=
"code"
>
;; Example IDL code
FUNCTION mean_and_stddev,array
;; This program reads in an array of numbers
;; and returns a structure containing the
;; average and standard deviation
ave = 0.0
count = 0.0
for i=0,N_ELEMENTS(array)-1 do begin
ave = ave + array[i]
count = count + 1
endfor
ave = ave/count
std = stddev(array)
return, {average:ave,std:std}
END
</textarea></div>
<script>
var
editor
=
CodeMirror
.
fromTextArea
(
document
.
getElementById
(
"
code
"
),
{
mode
:
{
name
:
"
idl
"
,
version
:
1
,
singleLineStringErrors
:
false
},
lineNumbers
:
true
,
indentUnit
:
4
,
matchBrackets
:
true
});
</script>
<p><strong>
MIME types defined:
</strong>
<code>
text/x-idl
</code>
.
</p>
</article>
src/main/webapp/static/plugins/codemirror/5.48.4/mode/index.html
0 → 100644
View file @
53f587bc
<!doctype html>
<title>
CodeMirror: Language Modes
</title>
<meta
charset=
"utf-8"
/>
<link
rel=
stylesheet
href=
"../doc/docs.css"
>
<div
id=
nav
>
<a
href=
"https://codemirror.net"
><h1>
CodeMirror
</h1><img
id=
logo
src=
"../doc/logo.png"
></a>
<ul>
<li><a
href=
"../index.html"
>
Home
</a>
<li><a
href=
"../doc/manual.html"
>
Manual
</a>
<li><a
href=
"https://github.com/codemirror/codemirror"
>
Code
</a>
</ul>
<ul>
<li><a
class=
active
href=
"#"
>
Language modes
</a>
</ul>
</div>
<article>
<h2>
Language modes
</h2>
<p>
This is a list of every mode in the distribution. Each mode lives
in a subdirectory of the
<code>
mode/
</code>
directory, and typically
defines a single JavaScript file that implements the mode. Loading
such file will make the language available to CodeMirror, through
the
<a
href=
"../doc/manual.html#option_mode"
><code>
mode
</code></a>
option.
</p>
<div
style=
"-webkit-columns: 100px 2; -moz-columns: 100px 2; columns: 100px 2;"
>
<ul
style=
"margin-top: 0"
>
<li><a
href=
"apl/index.html"
>
APL
</a></li>
<li><a
href=
"asn.1/index.html"
>
ASN.1
</a></li>
<li><a
href=
"asterisk/index.html"
>
Asterisk dialplan
</a></li>
<li><a
href=
"brainfuck/index.html"
>
Brainfuck
</a></li>
<li><a
href=
"clike/index.html"
>
C, C++, C#
</a></li>
<li><a
href=
"clike/index.html"
>
Ceylon
</a></li>
<li><a
href=
"clojure/index.html"
>
Clojure
</a></li>
<li><a
href=
"css/gss.html"
>
Closure Stylesheets (GSS)
</a></li>
<li><a
href=
"cmake/index.html"
>
CMake
</a></li>
<li><a
href=
"cobol/index.html"
>
COBOL
</a></li>
<li><a
href=
"coffeescript/index.html"
>
CoffeeScript
</a></li>
<li><a
href=
"commonlisp/index.html"
>
Common Lisp
</a></li>
<li><a
href=
"crystal/index.html"
>
Crystal
</a></li>
<li><a
href=
"css/index.html"
>
CSS
</a></li>
<li><a
href=
"cypher/index.html"
>
Cypher
</a></li>
<li><a
href=
"python/index.html"
>
Cython
</a></li>
<li><a
href=
"d/index.html"
>
D
</a></li>
<li><a
href=
"dart/index.html"
>
Dart
</a></li>
<li><a
href=
"django/index.html"
>
Django
</a>
(templating language)
</li>
<li><a
href=
"dockerfile/index.html"
>
Dockerfile
</a></li>
<li><a
href=
"diff/index.html"
>
diff
</a></li>
<li><a
href=
"dtd/index.html"
>
DTD
</a></li>
<li><a
href=
"dylan/index.html"
>
Dylan
</a></li>
<li><a
href=
"ebnf/index.html"
>
EBNF
</a></li>
<li><a
href=
"ecl/index.html"
>
ECL
</a></li>
<li><a
href=
"eiffel/index.html"
>
Eiffel
</a></li>
<li><a
href=
"https://github.com/optick/codemirror-mode-elixir"
>
Elixir
</a></li>
<li><a
href=
"elm/index.html"
>
Elm
</a></li>
<li><a
href=
"erlang/index.html"
>
Erlang
</a></li>
<li><a
href=
"factor/index.html"
>
Factor
</a></li>
<li><a
href=
"fcl/index.html"
>
FCL
</a></li>
<li><a
href=
"forth/index.html"
>
Forth
</a></li>
<li><a
href=
"fortran/index.html"
>
Fortran
</a></li>
<li><a
href=
"mllike/index.html"
>
F#
</a></li>
<li><a
href=
"gas/index.html"
>
Gas
</a>
(AT
&
T-style assembly)
</li>
<li><a
href=
"gherkin/index.html"
>
Gherkin
</a></li>
<li><a
href=
"go/index.html"
>
Go
</a></li>
<li><a
href=
"groovy/index.html"
>
Groovy
</a></li>
<li><a
href=
"haml/index.html"
>
HAML
</a></li>
<li><a
href=
"handlebars/index.html"
>
Handlebars
</a></li>
<li><a
href=
"haskell/index.html"
>
Haskell
</a>
(
<a
href=
"haskell-literate/index.html"
>
Literate
</a>
)
</li>
<li><a
href=
"haxe/index.html"
>
Haxe
</a></li>
<li><a
href=
"htmlembedded/index.html"
>
HTML embedded
</a>
(JSP, ASP.NET)
</li>
<li><a
href=
"htmlmixed/index.html"
>
HTML mixed-mode
</a></li>
<li><a
href=
"http/index.html"
>
HTTP
</a></li>
<li><a
href=
"idl/index.html"
>
IDL
</a></li>
<li><a
href=
"clike/index.html"
>
Java
</a></li>
<li><a
href=
"javascript/index.html"
>
JavaScript
</a>
(
<a
href=
"jsx/index.html"
>
JSX
</a>
)
</li>
<li><a
href=
"jinja2/index.html"
>
Jinja2
</a></li>
<li><a
href=
"julia/index.html"
>
Julia
</a></li>
<li><a
href=
"clike/index.html"
>
Kotlin
</a></li>
<li><a
href=
"css/less.html"
>
LESS
</a></li>
<li><a
href=
"livescript/index.html"
>
LiveScript
</a></li>
<li><a
href=
"lua/index.html"
>
Lua
</a></li>
<li><a
href=
"markdown/index.html"
>
Markdown
</a>
(
<a
href=
"gfm/index.html"
>
GitHub-flavour
</a>
)
</li>
<li><a
href=
"mathematica/index.html"
>
Mathematica
</a></li>
<li><a
href=
"mbox/index.html"
>
mbox
</a></li>
<li><a
href=
"mirc/index.html"
>
mIRC
</a></li>
<li><a
href=
"modelica/index.html"
>
Modelica
</a></li>
<li><a
href=
"mscgen/index.html"
>
MscGen
</a></li>
<li><a
href=
"mumps/index.html"
>
MUMPS
</a></li>
<li><a
href=
"nginx/index.html"
>
Nginx
</a></li>
<li><a
href=
"nsis/index.html"
>
NSIS
</a></li>
<li><a
href=
"ntriples/index.html"
>
N-Triples/N-Quads
</a></li>
<li><a
href=
"clike/index.html"
>
Objective C
</a></li>
<li><a
href=
"mllike/index.html"
>
OCaml
</a></li>
<li><a
href=
"octave/index.html"
>
Octave
</a>
(MATLAB)
</li>
<li><a
href=
"oz/index.html"
>
Oz
</a></li>
<li><a
href=
"pascal/index.html"
>
Pascal
</a></li>
<li><a
href=
"pegjs/index.html"
>
PEG.js
</a></li>
<li><a
href=
"perl/index.html"
>
Perl
</a></li>
<li><a
href=
"asciiarmor/index.html"
>
PGP (ASCII armor)
</a></li>
<li><a
href=
"php/index.html"
>
PHP
</a></li>
<li><a
href=
"pig/index.html"
>
Pig Latin
</a></li>
<li><a
href=
"powershell/index.html"
>
PowerShell
</a></li>
<li><a
href=
"properties/index.html"
>
Properties files
</a></li>
<li><a
href=
"protobuf/index.html"
>
ProtoBuf
</a></li>
<li><a
href=
"pug/index.html"
>
Pug
</a></li>
<li><a
href=
"puppet/index.html"
>
Puppet
</a></li>
<li><a
href=
"python/index.html"
>
Python
</a></li>
<li><a
href=
"q/index.html"
>
Q
</a></li>
<li><a
href=
"r/index.html"
>
R
</a></li>
<li><a
href=
"rpm/index.html"
>
RPM
</a></li>
<li><a
href=
"rst/index.html"
>
reStructuredText
</a></li>
<li><a
href=
"ruby/index.html"
>
Ruby
</a></li>
<li><a
href=
"rust/index.html"
>
Rust
</a></li>
<li><a
href=
"sas/index.html"
>
SAS
</a></li>
<li><a
href=
"sass/index.html"
>
Sass
</a></li>
<li><a
href=
"spreadsheet/index.html"
>
Spreadsheet
</a></li>
<li><a
href=
"clike/scala.html"
>
Scala
</a></li>
<li><a
href=
"scheme/index.html"
>
Scheme
</a></li>
<li><a
href=
"css/scss.html"
>
SCSS
</a></li>
<li><a
href=
"shell/index.html"
>
Shell
</a></li>
<li><a
href=
"sieve/index.html"
>
Sieve
</a></li>
<li><a
href=
"slim/index.html"
>
Slim
</a></li>
<li><a
href=
"smalltalk/index.html"
>
Smalltalk
</a></li>
<li><a
href=
"smarty/index.html"
>
Smarty
</a></li>
<li><a
href=
"solr/index.html"
>
Solr
</a></li>
<li><a
href=
"soy/index.html"
>
Soy
</a></li>
<li><a
href=
"stylus/index.html"
>
Stylus
</a></li>
<li><a
href=
"sql/index.html"
>
SQL
</a>
(several dialects)
</li>
<li><a
href=
"sparql/index.html"
>
SPARQL
</a></li>
<li><a
href=
"clike/index.html"
>
Squirrel
</a></li>
<li><a
href=
"swift/index.html"
>
Swift
</a></li>
<li><a
href=
"stex/index.html"
>
sTeX, LaTeX
</a></li>
<li><a
href=
"tcl/index.html"
>
Tcl
</a></li>
<li><a
href=
"textile/index.html"
>
Textile
</a></li>
<li><a
href=
"tiddlywiki/index.html"
>
Tiddlywiki
</a></li>
<li><a
href=
"tiki/index.html"
>
Tiki wiki
</a></li>
<li><a
href=
"toml/index.html"
>
TOML
</a></li>
<li><a
href=
"tornado/index.html"
>
Tornado
</a>
(templating language)
</li>
<li><a
href=
"troff/index.html"
>
troff
</a>
(for manpages)
</li>
<li><a
href=
"ttcn/index.html"
>
TTCN
</a></li>
<li><a
href=
"ttcn-cfg/index.html"
>
TTCN Configuration
</a></li>
<li><a
href=
"turtle/index.html"
>
Turtle
</a></li>
<li><a
href=
"twig/index.html"
>
Twig
</a></li>
<li><a
href=
"vb/index.html"
>
VB.NET
</a></li>
<li><a
href=
"vbscript/index.html"
>
VBScript
</a></li>
<li><a
href=
"velocity/index.html"
>
Velocity
</a></li>
<li><a
href=
"verilog/index.html"
>
Verilog/SystemVerilog
</a></li>
<li><a
href=
"vhdl/index.html"
>
VHDL
</a></li>
<li><a
href=
"vue/index.html"
>
Vue.js app
</a></li>
<li><a
href=
"webidl/index.html"
>
Web IDL
</a></li>
<li><a
href=
"xml/index.html"
>
XML/HTML
</a></li>
<li><a
href=
"xquery/index.html"
>
XQuery
</a></li>
<li><a
href=
"yacas/index.html"
>
Yacas
</a></li>
<li><a
href=
"yaml/index.html"
>
YAML
</a></li>
<li><a
href=
"yaml-frontmatter/index.html"
>
YAML frontmatter
</a></li>
<li><a
href=
"z80/index.html"
>
Z80
</a></li>
</ul>
</div>
</article>
src/main/webapp/static/plugins/codemirror/5.48.4/mode/javascript/index.html
0 → 100644
View file @
53f587bc
<!doctype html>
<title>
CodeMirror: JavaScript mode
</title>
<meta
charset=
"utf-8"
/>
<link
rel=
stylesheet
href=
"../../doc/docs.css"
>
<link
rel=
"stylesheet"
href=
"../../lib/codemirror.css"
>
<script
src=
"../../lib/codemirror.js"
></script>
<script
src=
"../../addon/edit/matchbrackets.js"
></script>
<script
src=
"../../addon/comment/continuecomment.js"
></script>
<script
src=
"../../addon/comment/comment.js"
></script>
<script
src=
"javascript.js"
></script>
<style>
.CodeMirror
{
border-top
:
1px
solid
black
;
border-bottom
:
1px
solid
black
;}
</style>
<div
id=
nav
>
<a
href=
"https://codemirror.net"
><h1>
CodeMirror
</h1><img
id=
logo
src=
"../../doc/logo.png"
></a>
<ul>
<li><a
href=
"../../index.html"
>
Home
</a>
<li><a
href=
"../../doc/manual.html"
>
Manual
</a>
<li><a
href=
"https://github.com/codemirror/codemirror"
>
Code
</a>
</ul>
<ul>
<li><a
href=
"../index.html"
>
Language modes
</a>
<li><a
class=
active
href=
"#"
>
JavaScript
</a>
</ul>
</div>
<article>
<h2>
JavaScript mode
</h2>
<div><textarea
id=
"code"
name=
"code"
>
// Demo code (the actual new parser character stream implementation)
function StringStream(string) {
this.pos = 0;
this.string = string;
}
StringStream.prototype = {
done: function() {return this.pos >= this.string.length;},
peek: function() {return this.string.charAt(this.pos);},
next: function() {
if (this.pos
<
this.string.length)
return this.string.charAt(this.pos++);
},
eat: function(match) {
var ch = this.string.charAt(this.pos);
if (typeof match == "string") var ok = ch == match;
else var ok = ch
&&
match.test ? match.test(ch) : match(ch);
if (ok) {this.pos++; return ch;}
},
eatWhile: function(match) {
var start = this.pos;
while (this.eat(match));
if (this.pos > start) return this.string.slice(start, this.pos);
},
backUp: function(n) {this.pos -= n;},
column: function() {return this.pos;},
eatSpace: function() {
var start = this.pos;
while (/\s/.test(this.string.charAt(this.pos))) this.pos++;
return this.pos - start;
},
match: function(pattern, consume, caseInsensitive) {
if (typeof pattern == "string") {
function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}
if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
if (consume !== false) this.pos += str.length;
return true;
}
}
else {
var match = this.string.slice(this.pos).match(pattern);
if (match
&&
consume !== false) this.pos += match[0].length;
return match;
}
}
};
</textarea></div>
<script>
var
editor
=
CodeMirror
.
fromTextArea
(
document
.
getElementById
(
"
code
"
),
{
lineNumbers
:
true
,
matchBrackets
:
true
,
continueComments
:
"
Enter
"
,
extraKeys
:
{
"
Ctrl-Q
"
:
"
toggleComment
"
}
});
</script>
<p>
JavaScript mode supports several configuration options:
<ul>
<li><code>
json
</code>
which will set the mode to expect JSON
data rather than a JavaScript program.
</li>
<li><code>
jsonld
</code>
which will set the mode to expect
<a
href=
"http://json-ld.org"
>
JSON-LD
</a>
linked data rather
than a JavaScript program (
<a
href=
"json-ld.html"
>
demo
</a>
).
</li>
<li><code>
typescript
</code>
which will activate additional
syntax highlighting and some other things for TypeScript code
(
<a
href=
"typescript.html"
>
demo
</a>
).
</li>
<li><code>
statementIndent
</code>
which (given a number) will
determine the amount of indentation to use for statements
continued on a new line.
</li>
<li><code>
wordCharacters
</code>
, a regexp that indicates which
characters should be considered part of an identifier.
Defaults to
<code>
/[\w$]/
</code>
, which does not handle
non-ASCII identifiers. Can be set to something more elaborate
to improve Unicode support.
</li>
</ul>
</p>
<p><strong>
MIME types defined:
</strong>
<code>
text/javascript
</code>
,
<code>
application/json
</code>
,
<code>
application/ld+json
</code>
,
<code>
text/typescript
</code>
,
<code>
application/typescript
</code>
.
</p>
</article>
src/main/webapp/static/plugins/codemirror/5.48.4/mode/javascript/javascript.js
0 → 100644
View file @
53f587bc
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
(
function
(
mod
)
{
if
(
typeof
exports
==
"
object
"
&&
typeof
module
==
"
object
"
)
// CommonJS
mod
(
require
(
"
../../lib/codemirror
"
));
else
if
(
typeof
define
==
"
function
"
&&
define
.
amd
)
// AMD
define
([
"
../../lib/codemirror
"
],
mod
);
else
// Plain browser env
mod
(
CodeMirror
);
})(
function
(
CodeMirror
)
{
"
use strict
"
;
CodeMirror
.
defineMode
(
"
javascript
"
,
function
(
config
,
parserConfig
)
{
var
indentUnit
=
config
.
indentUnit
;
var
statementIndent
=
parserConfig
.
statementIndent
;
var
jsonldMode
=
parserConfig
.
jsonld
;
var
jsonMode
=
parserConfig
.
json
||
jsonldMode
;
var
isTS
=
parserConfig
.
typescript
;
var
wordRE
=
parserConfig
.
wordCharacters
||
/
[\w
$
\x
a1-
\u
ffff
]
/
;
// Tokenizer
var
keywords
=
function
(){
function
kw
(
type
)
{
return
{
type
:
type
,
style
:
"
keyword
"
};}
var
A
=
kw
(
"
keyword a
"
),
B
=
kw
(
"
keyword b
"
),
C
=
kw
(
"
keyword c
"
),
D
=
kw
(
"
keyword d
"
);
var
operator
=
kw
(
"
operator
"
),
atom
=
{
type
:
"
atom
"
,
style
:
"
atom
"
};
return
{
"
if
"
:
kw
(
"
if
"
),
"
while
"
:
A
,
"
with
"
:
A
,
"
else
"
:
B
,
"
do
"
:
B
,
"
try
"
:
B
,
"
finally
"
:
B
,
"
return
"
:
D
,
"
break
"
:
D
,
"
continue
"
:
D
,
"
new
"
:
kw
(
"
new
"
),
"
delete
"
:
C
,
"
void
"
:
C
,
"
throw
"
:
C
,
"
debugger
"
:
kw
(
"
debugger
"
),
"
var
"
:
kw
(
"
var
"
),
"
const
"
:
kw
(
"
var
"
),
"
let
"
:
kw
(
"
var
"
),
"
function
"
:
kw
(
"
function
"
),
"
catch
"
:
kw
(
"
catch
"
),
"
for
"
:
kw
(
"
for
"
),
"
switch
"
:
kw
(
"
switch
"
),
"
case
"
:
kw
(
"
case
"
),
"
default
"
:
kw
(
"
default
"
),
"
in
"
:
operator
,
"
typeof
"
:
operator
,
"
instanceof
"
:
operator
,
"
true
"
:
atom
,
"
false
"
:
atom
,
"
null
"
:
atom
,
"
undefined
"
:
atom
,
"
NaN
"
:
atom
,
"
Infinity
"
:
atom
,
"
this
"
:
kw
(
"
this
"
),
"
class
"
:
kw
(
"
class
"
),
"
super
"
:
kw
(
"
atom
"
),
"
yield
"
:
C
,
"
export
"
:
kw
(
"
export
"
),
"
import
"
:
kw
(
"
import
"
),
"
extends
"
:
C
,
"
await
"
:
C
};
}();
var
isOperatorChar
=
/
[
+
\-
*&%=<>!?|~^@
]
/
;
var
isJsonldKeyword
=
/^@
(
context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph
)
"/
;
function
readRegexp
(
stream
)
{
var
escaped
=
false
,
next
,
inSet
=
false
;
while
((
next
=
stream
.
next
())
!=
null
)
{
if
(
!
escaped
)
{
if
(
next
==
"
/
"
&&
!
inSet
)
return
;
if
(
next
==
"
[
"
)
inSet
=
true
;
else
if
(
inSet
&&
next
==
"
]
"
)
inSet
=
false
;
}
escaped
=
!
escaped
&&
next
==
"
\\
"
;
}
}
// Used as scratch variables to communicate multiple values without
// consing up tons of objects.
var
type
,
content
;
function
ret
(
tp
,
style
,
cont
)
{
type
=
tp
;
content
=
cont
;
return
style
;
}
function
tokenBase
(
stream
,
state
)
{
var
ch
=
stream
.
next
();
if
(
ch
==
'
"
'
||
ch
==
"
'
"
)
{
state
.
tokenize
=
tokenString
(
ch
);
return
state
.
tokenize
(
stream
,
state
);
}
else
if
(
ch
==
"
.
"
&&
stream
.
match
(
/^
\d[\d
_
]
*
(?:[
eE
][
+
\-]?[\d
_
]
+
)?
/
))
{
return
ret
(
"
number
"
,
"
number
"
);
}
else
if
(
ch
==
"
.
"
&&
stream
.
match
(
"
..
"
))
{
return
ret
(
"
spread
"
,
"
meta
"
);
}
else
if
(
/
[\[\]
{}
\(\)
,;
\:\.]
/
.
test
(
ch
))
{
return
ret
(
ch
);
}
else
if
(
ch
==
"
=
"
&&
stream
.
eat
(
"
>
"
))
{
return
ret
(
"
=>
"
,
"
operator
"
);
}
else
if
(
ch
==
"
0
"
&&
stream
.
match
(
/^
(?:
x
[\d
A-Fa-f_
]
+|o
[
0-7_
]
+|b
[
01_
]
+
)
n
?
/
))
{
return
ret
(
"
number
"
,
"
number
"
);
}
else
if
(
/
\d
/
.
test
(
ch
))
{
stream
.
match
(
/^
[\d
_
]
*
(?:
n|
(?:\.[\d
_
]
*
)?(?:[
eE
][
+
\-]?[\d
_
]
+
)?)?
/
);
return
ret
(
"
number
"
,
"
number
"
);
}
else
if
(
ch
==
"
/
"
)
{
if
(
stream
.
eat
(
"
*
"
))
{
state
.
tokenize
=
tokenComment
;
return
tokenComment
(
stream
,
state
);
}
else
if
(
stream
.
eat
(
"
/
"
))
{
stream
.
skipToEnd
();
return
ret
(
"
comment
"
,
"
comment
"
);
}
else
if
(
expressionAllowed
(
stream
,
state
,
1
))
{
readRegexp
(
stream
);
stream
.
match
(
/^
\b(([
gimyus
])(?![
gimyus
]
*
\2))
+
\b
/
);
return
ret
(
"
regexp
"
,
"
string-2
"
);
}
else
{
stream
.
eat
(
"
=
"
);
return
ret
(
"
operator
"
,
"
operator
"
,
stream
.
current
());
}
}
else
if
(
ch
==
"
`
"
)
{
state
.
tokenize
=
tokenQuasi
;
return
tokenQuasi
(
stream
,
state
);
}
else
if
(
ch
==
"
#
"
)
{
stream
.
skipToEnd
();
return
ret
(
"
error
"
,
"
error
"
);
}
else
if
(
isOperatorChar
.
test
(
ch
))
{
if
(
ch
!=
"
>
"
||
!
state
.
lexical
||
state
.
lexical
.
type
!=
"
>
"
)
{
if
(
stream
.
eat
(
"
=
"
))
{
if
(
ch
==
"
!
"
||
ch
==
"
=
"
)
stream
.
eat
(
"
=
"
)
}
else
if
(
/
[
<>*+
\-]
/
.
test
(
ch
))
{
stream
.
eat
(
ch
)
if
(
ch
==
"
>
"
)
stream
.
eat
(
ch
)
}
}
return
ret
(
"
operator
"
,
"
operator
"
,
stream
.
current
());
}
else
if
(
wordRE
.
test
(
ch
))
{
stream
.
eatWhile
(
wordRE
);
var
word
=
stream
.
current
()
if
(
state
.
lastType
!=
"
.
"
)
{
if
(
keywords
.
propertyIsEnumerable
(
word
))
{
var
kw
=
keywords
[
word
]
return
ret
(
kw
.
type
,
kw
.
style
,
word
)
}
if
(
word
==
"
async
"
&&
stream
.
match
(
/^
(\s
|
\/\*
.*
?\*\/)
*
[\[\(\w]
/
,
false
))
return
ret
(
"
async
"
,
"
keyword
"
,
word
)
}
return
ret
(
"
variable
"
,
"
variable
"
,
word
)
}
}
function
tokenString
(
quote
)
{
return
function
(
stream
,
state
)
{
var
escaped
=
false
,
next
;
if
(
jsonldMode
&&
stream
.
peek
()
==
"
@
"
&&
stream
.
match
(
isJsonldKeyword
)){
state
.
tokenize
=
tokenBase
;
return
ret
(
"
jsonld-keyword
"
,
"
meta
"
);
}
while
((
next
=
stream
.
next
())
!=
null
)
{
if
(
next
==
quote
&&
!
escaped
)
break
;
escaped
=
!
escaped
&&
next
==
"
\\
"
;
}
if
(
!
escaped
)
state
.
tokenize
=
tokenBase
;
return
ret
(
"
string
"
,
"
string
"
);
};
}
function
tokenComment
(
stream
,
state
)
{
var
maybeEnd
=
false
,
ch
;
while
(
ch
=
stream
.
next
())
{
if
(
ch
==
"
/
"
&&
maybeEnd
)
{
state
.
tokenize
=
tokenBase
;
break
;
}
maybeEnd
=
(
ch
==
"
*
"
);
}
return
ret
(
"
comment
"
,
"
comment
"
);
}
function
tokenQuasi
(
stream
,
state
)
{
var
escaped
=
false
,
next
;
while
((
next
=
stream
.
next
())
!=
null
)
{
if
(
!
escaped
&&
(
next
==
"
`
"
||
next
==
"
$
"
&&
stream
.
eat
(
"
{
"
)))
{
state
.
tokenize
=
tokenBase
;
break
;
}
escaped
=
!
escaped
&&
next
==
"
\\
"
;
}
return
ret
(
"
quasi
"
,
"
string-2
"
,
stream
.
current
());
}
var
brackets
=
"
([{}])
"
;
// This is a crude lookahead trick to try and notice that we're
// parsing the argument patterns for a fat-arrow function before we
// actually hit the arrow token. It only works if the arrow is on
// the same line as the arguments and there's no strange noise
// (comments) in between. Fallback is to only notice when we hit the
// arrow, and not declare the arguments as locals for the arrow
// body.
function
findFatArrow
(
stream
,
state
)
{
if
(
state
.
fatArrowAt
)
state
.
fatArrowAt
=
null
;
var
arrow
=
stream
.
string
.
indexOf
(
"
=>
"
,
stream
.
start
);
if
(
arrow
<
0
)
return
;
if
(
isTS
)
{
// Try to skip TypeScript return type declarations after the arguments
var
m
=
/:
\s
*
(?:\w
+
(?:
<
[^
>
]
*>|
\[\])?
|
\{[^
}
]
*
\})\s
*$/
.
exec
(
stream
.
string
.
slice
(
stream
.
start
,
arrow
))
if
(
m
)
arrow
=
m
.
index
}
var
depth
=
0
,
sawSomething
=
false
;
for
(
var
pos
=
arrow
-
1
;
pos
>=
0
;
--
pos
)
{
var
ch
=
stream
.
string
.
charAt
(
pos
);
var
bracket
=
brackets
.
indexOf
(
ch
);
if
(
bracket
>=
0
&&
bracket
<
3
)
{
if
(
!
depth
)
{
++
pos
;
break
;
}
if
(
--
depth
==
0
)
{
if
(
ch
==
"
(
"
)
sawSomething
=
true
;
break
;
}
}
else
if
(
bracket
>=
3
&&
bracket
<
6
)
{
++
depth
;
}
else
if
(
wordRE
.
test
(
ch
))
{
sawSomething
=
true
;
}
else
if
(
/
[
"'
\/
`
]
/
.
test
(
ch
))
{
for
(;;
--
pos
)
{
if
(
pos
==
0
)
return
var
next
=
stream
.
string
.
charAt
(
pos
-
1
)
if
(
next
==
ch
&&
stream
.
string
.
charAt
(
pos
-
2
)
!=
"
\\
"
)
{
pos
--
;
break
}
}
}
else
if
(
sawSomething
&&
!
depth
)
{
++
pos
;
break
;
}
}
if
(
sawSomething
&&
!
depth
)
state
.
fatArrowAt
=
pos
;
}
// Parser
var
atomicTypes
=
{
"
atom
"
:
true
,
"
number
"
:
true
,
"
variable
"
:
true
,
"
string
"
:
true
,
"
regexp
"
:
true
,
"
this
"
:
true
,
"
jsonld-keyword
"
:
true
};
function
JSLexical
(
indented
,
column
,
type
,
align
,
prev
,
info
)
{
this
.
indented
=
indented
;
this
.
column
=
column
;
this
.
type
=
type
;
this
.
prev
=
prev
;
this
.
info
=
info
;
if
(
align
!=
null
)
this
.
align
=
align
;
}
function
inScope
(
state
,
varname
)
{
for
(
var
v
=
state
.
localVars
;
v
;
v
=
v
.
next
)
if
(
v
.
name
==
varname
)
return
true
;
for
(
var
cx
=
state
.
context
;
cx
;
cx
=
cx
.
prev
)
{
for
(
var
v
=
cx
.
vars
;
v
;
v
=
v
.
next
)
if
(
v
.
name
==
varname
)
return
true
;
}
}
function
parseJS
(
state
,
style
,
type
,
content
,
stream
)
{
var
cc
=
state
.
cc
;
// Communicate our context to the combinators.
// (Less wasteful than consing up a hundred closures on every call.)
cx
.
state
=
state
;
cx
.
stream
=
stream
;
cx
.
marked
=
null
,
cx
.
cc
=
cc
;
cx
.
style
=
style
;
if
(
!
state
.
lexical
.
hasOwnProperty
(
"
align
"
))
state
.
lexical
.
align
=
true
;
while
(
true
)
{
var
combinator
=
cc
.
length
?
cc
.
pop
()
:
jsonMode
?
expression
:
statement
;
if
(
combinator
(
type
,
content
))
{
while
(
cc
.
length
&&
cc
[
cc
.
length
-
1
].
lex
)
cc
.
pop
()();
if
(
cx
.
marked
)
return
cx
.
marked
;
if
(
type
==
"
variable
"
&&
inScope
(
state
,
content
))
return
"
variable-2
"
;
return
style
;
}
}
}
// Combinator utils
var
cx
=
{
state
:
null
,
column
:
null
,
marked
:
null
,
cc
:
null
};
function
pass
()
{
for
(
var
i
=
arguments
.
length
-
1
;
i
>=
0
;
i
--
)
cx
.
cc
.
push
(
arguments
[
i
]);
}
function
cont
()
{
pass
.
apply
(
null
,
arguments
);
return
true
;
}
function
inList
(
name
,
list
)
{
for
(
var
v
=
list
;
v
;
v
=
v
.
next
)
if
(
v
.
name
==
name
)
return
true
return
false
;
}
function
register
(
varname
)
{
var
state
=
cx
.
state
;
cx
.
marked
=
"
def
"
;
if
(
state
.
context
)
{
if
(
state
.
lexical
.
info
==
"
var
"
&&
state
.
context
&&
state
.
context
.
block
)
{
// FIXME function decls are also not block scoped
var
newContext
=
registerVarScoped
(
varname
,
state
.
context
)
if
(
newContext
!=
null
)
{
state
.
context
=
newContext
return
}
}
else
if
(
!
inList
(
varname
,
state
.
localVars
))
{
state
.
localVars
=
new
Var
(
varname
,
state
.
localVars
)
return
}
}
// Fall through means this is global
if
(
parserConfig
.
globalVars
&&
!
inList
(
varname
,
state
.
globalVars
))
state
.
globalVars
=
new
Var
(
varname
,
state
.
globalVars
)
}
function
registerVarScoped
(
varname
,
context
)
{
if
(
!
context
)
{
return
null
}
else
if
(
context
.
block
)
{
var
inner
=
registerVarScoped
(
varname
,
context
.
prev
)
if
(
!
inner
)
return
null
if
(
inner
==
context
.
prev
)
return
context
return
new
Context
(
inner
,
context
.
vars
,
true
)
}
else
if
(
inList
(
varname
,
context
.
vars
))
{
return
context
}
else
{
return
new
Context
(
context
.
prev
,
new
Var
(
varname
,
context
.
vars
),
false
)
}
}
function
isModifier
(
name
)
{
return
name
==
"
public
"
||
name
==
"
private
"
||
name
==
"
protected
"
||
name
==
"
abstract
"
||
name
==
"
readonly
"
}
// Combinators
function
Context
(
prev
,
vars
,
block
)
{
this
.
prev
=
prev
;
this
.
vars
=
vars
;
this
.
block
=
block
}
function
Var
(
name
,
next
)
{
this
.
name
=
name
;
this
.
next
=
next
}
var
defaultVars
=
new
Var
(
"
this
"
,
new
Var
(
"
arguments
"
,
null
))
function
pushcontext
()
{
cx
.
state
.
context
=
new
Context
(
cx
.
state
.
context
,
cx
.
state
.
localVars
,
false
)
cx
.
state
.
localVars
=
defaultVars
}
function
pushblockcontext
()
{
cx
.
state
.
context
=
new
Context
(
cx
.
state
.
context
,
cx
.
state
.
localVars
,
true
)
cx
.
state
.
localVars
=
null
}
function
popcontext
()
{
cx
.
state
.
localVars
=
cx
.
state
.
context
.
vars
cx
.
state
.
context
=
cx
.
state
.
context
.
prev
}
popcontext
.
lex
=
true
function
pushlex
(
type
,
info
)
{
var
result
=
function
()
{
var
state
=
cx
.
state
,
indent
=
state
.
indented
;
if
(
state
.
lexical
.
type
==
"
stat
"
)
indent
=
state
.
lexical
.
indented
;
else
for
(
var
outer
=
state
.
lexical
;
outer
&&
outer
.
type
==
"
)
"
&&
outer
.
align
;
outer
=
outer
.
prev
)
indent
=
outer
.
indented
;
state
.
lexical
=
new
JSLexical
(
indent
,
cx
.
stream
.
column
(),
type
,
null
,
state
.
lexical
,
info
);
};
result
.
lex
=
true
;
return
result
;
}
function
poplex
()
{
var
state
=
cx
.
state
;
if
(
state
.
lexical
.
prev
)
{
if
(
state
.
lexical
.
type
==
"
)
"
)
state
.
indented
=
state
.
lexical
.
indented
;
state
.
lexical
=
state
.
lexical
.
prev
;
}
}
poplex
.
lex
=
true
;
function
expect
(
wanted
)
{
function
exp
(
type
)
{
if
(
type
==
wanted
)
return
cont
();
else
if
(
wanted
==
"
;
"
||
type
==
"
}
"
||
type
==
"
)
"
||
type
==
"
]
"
)
return
pass
();
else
return
cont
(
exp
);
};
return
exp
;
}
function
statement
(
type
,
value
)
{
if
(
type
==
"
var
"
)
return
cont
(
pushlex
(
"
vardef
"
,
value
),
vardef
,
expect
(
"
;
"
),
poplex
);
if
(
type
==
"
keyword a
"
)
return
cont
(
pushlex
(
"
form
"
),
parenExpr
,
statement
,
poplex
);
if
(
type
==
"
keyword b
"
)
return
cont
(
pushlex
(
"
form
"
),
statement
,
poplex
);
if
(
type
==
"
keyword d
"
)
return
cx
.
stream
.
match
(
/^
\s
*$/
,
false
)
?
cont
()
:
cont
(
pushlex
(
"
stat
"
),
maybeexpression
,
expect
(
"
;
"
),
poplex
);
if
(
type
==
"
debugger
"
)
return
cont
(
expect
(
"
;
"
));
if
(
type
==
"
{
"
)
return
cont
(
pushlex
(
"
}
"
),
pushblockcontext
,
block
,
poplex
,
popcontext
);
if
(
type
==
"
;
"
)
return
cont
();
if
(
type
==
"
if
"
)
{
if
(
cx
.
state
.
lexical
.
info
==
"
else
"
&&
cx
.
state
.
cc
[
cx
.
state
.
cc
.
length
-
1
]
==
poplex
)
cx
.
state
.
cc
.
pop
()();
return
cont
(
pushlex
(
"
form
"
),
parenExpr
,
statement
,
poplex
,
maybeelse
);
}
if
(
type
==
"
function
"
)
return
cont
(
functiondef
);
if
(
type
==
"
for
"
)
return
cont
(
pushlex
(
"
form
"
),
forspec
,
statement
,
poplex
);
if
(
type
==
"
class
"
||
(
isTS
&&
value
==
"
interface
"
))
{
cx
.
marked
=
"
keyword
"
return
cont
(
pushlex
(
"
form
"
,
type
==
"
class
"
?
type
:
value
),
className
,
poplex
)
}
if
(
type
==
"
variable
"
)
{
if
(
isTS
&&
value
==
"
declare
"
)
{
cx
.
marked
=
"
keyword
"
return
cont
(
statement
)
}
else
if
(
isTS
&&
(
value
==
"
module
"
||
value
==
"
enum
"
||
value
==
"
type
"
)
&&
cx
.
stream
.
match
(
/^
\s
*
\w
/
,
false
))
{
cx
.
marked
=
"
keyword
"
if
(
value
==
"
enum
"
)
return
cont
(
enumdef
);
else
if
(
value
==
"
type
"
)
return
cont
(
typename
,
expect
(
"
operator
"
),
typeexpr
,
expect
(
"
;
"
));
else
return
cont
(
pushlex
(
"
form
"
),
pattern
,
expect
(
"
{
"
),
pushlex
(
"
}
"
),
block
,
poplex
,
poplex
)
}
else
if
(
isTS
&&
value
==
"
namespace
"
)
{
cx
.
marked
=
"
keyword
"
return
cont
(
pushlex
(
"
form
"
),
expression
,
statement
,
poplex
)
}
else
if
(
isTS
&&
value
==
"
abstract
"
)
{
cx
.
marked
=
"
keyword
"
return
cont
(
statement
)
}
else
{
return
cont
(
pushlex
(
"
stat
"
),
maybelabel
);
}
}
if
(
type
==
"
switch
"
)
return
cont
(
pushlex
(
"
form
"
),
parenExpr
,
expect
(
"
{
"
),
pushlex
(
"
}
"
,
"
switch
"
),
pushblockcontext
,
block
,
poplex
,
poplex
,
popcontext
);
if
(
type
==
"
case
"
)
return
cont
(
expression
,
expect
(
"
:
"
));
if
(
type
==
"
default
"
)
return
cont
(
expect
(
"
:
"
));
if
(
type
==
"
catch
"
)
return
cont
(
pushlex
(
"
form
"
),
pushcontext
,
maybeCatchBinding
,
statement
,
poplex
,
popcontext
);
if
(
type
==
"
export
"
)
return
cont
(
pushlex
(
"
stat
"
),
afterExport
,
poplex
);
if
(
type
==
"
import
"
)
return
cont
(
pushlex
(
"
stat
"
),
afterImport
,
poplex
);
if
(
type
==
"
async
"
)
return
cont
(
statement
)
if
(
value
==
"
@
"
)
return
cont
(
expression
,
statement
)
return
pass
(
pushlex
(
"
stat
"
),
expression
,
expect
(
"
;
"
),
poplex
);
}
function
maybeCatchBinding
(
type
)
{
if
(
type
==
"
(
"
)
return
cont
(
funarg
,
expect
(
"
)
"
))
}
function
expression
(
type
,
value
)
{
return
expressionInner
(
type
,
value
,
false
);
}
function
expressionNoComma
(
type
,
value
)
{
return
expressionInner
(
type
,
value
,
true
);
}
function
parenExpr
(
type
)
{
if
(
type
!=
"
(
"
)
return
pass
()
return
cont
(
pushlex
(
"
)
"
),
expression
,
expect
(
"
)
"
),
poplex
)
}
function
expressionInner
(
type
,
value
,
noComma
)
{
if
(
cx
.
state
.
fatArrowAt
==
cx
.
stream
.
start
)
{
var
body
=
noComma
?
arrowBodyNoComma
:
arrowBody
;
if
(
type
==
"
(
"
)
return
cont
(
pushcontext
,
pushlex
(
"
)
"
),
commasep
(
funarg
,
"
)
"
),
poplex
,
expect
(
"
=>
"
),
body
,
popcontext
);
else
if
(
type
==
"
variable
"
)
return
pass
(
pushcontext
,
pattern
,
expect
(
"
=>
"
),
body
,
popcontext
);
}
var
maybeop
=
noComma
?
maybeoperatorNoComma
:
maybeoperatorComma
;
if
(
atomicTypes
.
hasOwnProperty
(
type
))
return
cont
(
maybeop
);
if
(
type
==
"
function
"
)
return
cont
(
functiondef
,
maybeop
);
if
(
type
==
"
class
"
||
(
isTS
&&
value
==
"
interface
"
))
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
pushlex
(
"
form
"
),
classExpression
,
poplex
);
}
if
(
type
==
"
keyword c
"
||
type
==
"
async
"
)
return
cont
(
noComma
?
expressionNoComma
:
expression
);
if
(
type
==
"
(
"
)
return
cont
(
pushlex
(
"
)
"
),
maybeexpression
,
expect
(
"
)
"
),
poplex
,
maybeop
);
if
(
type
==
"
operator
"
||
type
==
"
spread
"
)
return
cont
(
noComma
?
expressionNoComma
:
expression
);
if
(
type
==
"
[
"
)
return
cont
(
pushlex
(
"
]
"
),
arrayLiteral
,
poplex
,
maybeop
);
if
(
type
==
"
{
"
)
return
contCommasep
(
objprop
,
"
}
"
,
null
,
maybeop
);
if
(
type
==
"
quasi
"
)
return
pass
(
quasi
,
maybeop
);
if
(
type
==
"
new
"
)
return
cont
(
maybeTarget
(
noComma
));
if
(
type
==
"
import
"
)
return
cont
(
expression
);
return
cont
();
}
function
maybeexpression
(
type
)
{
if
(
type
.
match
(
/
[
;
\}\)\]
,
]
/
))
return
pass
();
return
pass
(
expression
);
}
function
maybeoperatorComma
(
type
,
value
)
{
if
(
type
==
"
,
"
)
return
cont
(
expression
);
return
maybeoperatorNoComma
(
type
,
value
,
false
);
}
function
maybeoperatorNoComma
(
type
,
value
,
noComma
)
{
var
me
=
noComma
==
false
?
maybeoperatorComma
:
maybeoperatorNoComma
;
var
expr
=
noComma
==
false
?
expression
:
expressionNoComma
;
if
(
type
==
"
=>
"
)
return
cont
(
pushcontext
,
noComma
?
arrowBodyNoComma
:
arrowBody
,
popcontext
);
if
(
type
==
"
operator
"
)
{
if
(
/
\+\+
|--/
.
test
(
value
)
||
isTS
&&
value
==
"
!
"
)
return
cont
(
me
);
if
(
isTS
&&
value
==
"
<
"
&&
cx
.
stream
.
match
(
/^
([^
>
]
|<.*
?
>
)
*>
\s
*
\(
/
,
false
))
return
cont
(
pushlex
(
"
>
"
),
commasep
(
typeexpr
,
"
>
"
),
poplex
,
me
);
if
(
value
==
"
?
"
)
return
cont
(
expression
,
expect
(
"
:
"
),
expr
);
return
cont
(
expr
);
}
if
(
type
==
"
quasi
"
)
{
return
pass
(
quasi
,
me
);
}
if
(
type
==
"
;
"
)
return
;
if
(
type
==
"
(
"
)
return
contCommasep
(
expressionNoComma
,
"
)
"
,
"
call
"
,
me
);
if
(
type
==
"
.
"
)
return
cont
(
property
,
me
);
if
(
type
==
"
[
"
)
return
cont
(
pushlex
(
"
]
"
),
maybeexpression
,
expect
(
"
]
"
),
poplex
,
me
);
if
(
isTS
&&
value
==
"
as
"
)
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
typeexpr
,
me
)
}
if
(
type
==
"
regexp
"
)
{
cx
.
state
.
lastType
=
cx
.
marked
=
"
operator
"
cx
.
stream
.
backUp
(
cx
.
stream
.
pos
-
cx
.
stream
.
start
-
1
)
return
cont
(
expr
)
}
}
function
quasi
(
type
,
value
)
{
if
(
type
!=
"
quasi
"
)
return
pass
();
if
(
value
.
slice
(
value
.
length
-
2
)
!=
"
${
"
)
return
cont
(
quasi
);
return
cont
(
expression
,
continueQuasi
);
}
function
continueQuasi
(
type
)
{
if
(
type
==
"
}
"
)
{
cx
.
marked
=
"
string-2
"
;
cx
.
state
.
tokenize
=
tokenQuasi
;
return
cont
(
quasi
);
}
}
function
arrowBody
(
type
)
{
findFatArrow
(
cx
.
stream
,
cx
.
state
);
return
pass
(
type
==
"
{
"
?
statement
:
expression
);
}
function
arrowBodyNoComma
(
type
)
{
findFatArrow
(
cx
.
stream
,
cx
.
state
);
return
pass
(
type
==
"
{
"
?
statement
:
expressionNoComma
);
}
function
maybeTarget
(
noComma
)
{
return
function
(
type
)
{
if
(
type
==
"
.
"
)
return
cont
(
noComma
?
targetNoComma
:
target
);
else
if
(
type
==
"
variable
"
&&
isTS
)
return
cont
(
maybeTypeArgs
,
noComma
?
maybeoperatorNoComma
:
maybeoperatorComma
)
else
return
pass
(
noComma
?
expressionNoComma
:
expression
);
};
}
function
target
(
_
,
value
)
{
if
(
value
==
"
target
"
)
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
maybeoperatorComma
);
}
}
function
targetNoComma
(
_
,
value
)
{
if
(
value
==
"
target
"
)
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
maybeoperatorNoComma
);
}
}
function
maybelabel
(
type
)
{
if
(
type
==
"
:
"
)
return
cont
(
poplex
,
statement
);
return
pass
(
maybeoperatorComma
,
expect
(
"
;
"
),
poplex
);
}
function
property
(
type
)
{
if
(
type
==
"
variable
"
)
{
cx
.
marked
=
"
property
"
;
return
cont
();}
}
function
objprop
(
type
,
value
)
{
if
(
type
==
"
async
"
)
{
cx
.
marked
=
"
property
"
;
return
cont
(
objprop
);
}
else
if
(
type
==
"
variable
"
||
cx
.
style
==
"
keyword
"
)
{
cx
.
marked
=
"
property
"
;
if
(
value
==
"
get
"
||
value
==
"
set
"
)
return
cont
(
getterSetter
);
var
m
// Work around fat-arrow-detection complication for detecting typescript typed arrow params
if
(
isTS
&&
cx
.
state
.
fatArrowAt
==
cx
.
stream
.
start
&&
(
m
=
cx
.
stream
.
match
(
/^
\s
*:
\s
*/
,
false
)))
cx
.
state
.
fatArrowAt
=
cx
.
stream
.
pos
+
m
[
0
].
length
return
cont
(
afterprop
);
}
else
if
(
type
==
"
number
"
||
type
==
"
string
"
)
{
cx
.
marked
=
jsonldMode
?
"
property
"
:
(
cx
.
style
+
"
property
"
);
return
cont
(
afterprop
);
}
else
if
(
type
==
"
jsonld-keyword
"
)
{
return
cont
(
afterprop
);
}
else
if
(
isTS
&&
isModifier
(
value
))
{
cx
.
marked
=
"
keyword
"
return
cont
(
objprop
)
}
else
if
(
type
==
"
[
"
)
{
return
cont
(
expression
,
maybetype
,
expect
(
"
]
"
),
afterprop
);
}
else
if
(
type
==
"
spread
"
)
{
return
cont
(
expressionNoComma
,
afterprop
);
}
else
if
(
value
==
"
*
"
)
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
objprop
);
}
else
if
(
type
==
"
:
"
)
{
return
pass
(
afterprop
)
}
}
function
getterSetter
(
type
)
{
if
(
type
!=
"
variable
"
)
return
pass
(
afterprop
);
cx
.
marked
=
"
property
"
;
return
cont
(
functiondef
);
}
function
afterprop
(
type
)
{
if
(
type
==
"
:
"
)
return
cont
(
expressionNoComma
);
if
(
type
==
"
(
"
)
return
pass
(
functiondef
);
}
function
commasep
(
what
,
end
,
sep
)
{
function
proceed
(
type
,
value
)
{
if
(
sep
?
sep
.
indexOf
(
type
)
>
-
1
:
type
==
"
,
"
)
{
var
lex
=
cx
.
state
.
lexical
;
if
(
lex
.
info
==
"
call
"
)
lex
.
pos
=
(
lex
.
pos
||
0
)
+
1
;
return
cont
(
function
(
type
,
value
)
{
if
(
type
==
end
||
value
==
end
)
return
pass
()
return
pass
(
what
)
},
proceed
);
}
if
(
type
==
end
||
value
==
end
)
return
cont
();
if
(
sep
&&
sep
.
indexOf
(
"
;
"
)
>
-
1
)
return
pass
(
what
)
return
cont
(
expect
(
end
));
}
return
function
(
type
,
value
)
{
if
(
type
==
end
||
value
==
end
)
return
cont
();
return
pass
(
what
,
proceed
);
};
}
function
contCommasep
(
what
,
end
,
info
)
{
for
(
var
i
=
3
;
i
<
arguments
.
length
;
i
++
)
cx
.
cc
.
push
(
arguments
[
i
]);
return
cont
(
pushlex
(
end
,
info
),
commasep
(
what
,
end
),
poplex
);
}
function
block
(
type
)
{
if
(
type
==
"
}
"
)
return
cont
();
return
pass
(
statement
,
block
);
}
function
maybetype
(
type
,
value
)
{
if
(
isTS
)
{
if
(
type
==
"
:
"
)
return
cont
(
typeexpr
);
if
(
value
==
"
?
"
)
return
cont
(
maybetype
);
}
}
function
maybetypeOrIn
(
type
,
value
)
{
if
(
isTS
&&
(
type
==
"
:
"
||
value
==
"
in
"
))
return
cont
(
typeexpr
)
}
function
mayberettype
(
type
)
{
if
(
isTS
&&
type
==
"
:
"
)
{
if
(
cx
.
stream
.
match
(
/^
\s
*
\w
+
\s
+is
\b
/
,
false
))
return
cont
(
expression
,
isKW
,
typeexpr
)
else
return
cont
(
typeexpr
)
}
}
function
isKW
(
_
,
value
)
{
if
(
value
==
"
is
"
)
{
cx
.
marked
=
"
keyword
"
return
cont
()
}
}
function
typeexpr
(
type
,
value
)
{
if
(
value
==
"
keyof
"
||
value
==
"
typeof
"
||
value
==
"
infer
"
)
{
cx
.
marked
=
"
keyword
"
return
cont
(
value
==
"
typeof
"
?
expressionNoComma
:
typeexpr
)
}
if
(
type
==
"
variable
"
||
value
==
"
void
"
)
{
cx
.
marked
=
"
type
"
return
cont
(
afterType
)
}
if
(
value
==
"
|
"
||
value
==
"
&
"
)
return
cont
(
typeexpr
)
if
(
type
==
"
string
"
||
type
==
"
number
"
||
type
==
"
atom
"
)
return
cont
(
afterType
);
if
(
type
==
"
[
"
)
return
cont
(
pushlex
(
"
]
"
),
commasep
(
typeexpr
,
"
]
"
,
"
,
"
),
poplex
,
afterType
)
if
(
type
==
"
{
"
)
return
cont
(
pushlex
(
"
}
"
),
commasep
(
typeprop
,
"
}
"
,
"
,;
"
),
poplex
,
afterType
)
if
(
type
==
"
(
"
)
return
cont
(
commasep
(
typearg
,
"
)
"
),
maybeReturnType
,
afterType
)
if
(
type
==
"
<
"
)
return
cont
(
commasep
(
typeexpr
,
"
>
"
),
typeexpr
)
}
function
maybeReturnType
(
type
)
{
if
(
type
==
"
=>
"
)
return
cont
(
typeexpr
)
}
function
typeprop
(
type
,
value
)
{
if
(
type
==
"
variable
"
||
cx
.
style
==
"
keyword
"
)
{
cx
.
marked
=
"
property
"
return
cont
(
typeprop
)
}
else
if
(
value
==
"
?
"
||
type
==
"
number
"
||
type
==
"
string
"
)
{
return
cont
(
typeprop
)
}
else
if
(
type
==
"
:
"
)
{
return
cont
(
typeexpr
)
}
else
if
(
type
==
"
[
"
)
{
return
cont
(
expect
(
"
variable
"
),
maybetypeOrIn
,
expect
(
"
]
"
),
typeprop
)
}
else
if
(
type
==
"
(
"
)
{
return
pass
(
functiondecl
,
typeprop
)
}
}
function
typearg
(
type
,
value
)
{
if
(
type
==
"
variable
"
&&
cx
.
stream
.
match
(
/^
\s
*
[
?:
]
/
,
false
)
||
value
==
"
?
"
)
return
cont
(
typearg
)
if
(
type
==
"
:
"
)
return
cont
(
typeexpr
)
if
(
type
==
"
spread
"
)
return
cont
(
typearg
)
return
pass
(
typeexpr
)
}
function
afterType
(
type
,
value
)
{
if
(
value
==
"
<
"
)
return
cont
(
pushlex
(
"
>
"
),
commasep
(
typeexpr
,
"
>
"
),
poplex
,
afterType
)
if
(
value
==
"
|
"
||
type
==
"
.
"
||
value
==
"
&
"
)
return
cont
(
typeexpr
)
if
(
type
==
"
[
"
)
return
cont
(
typeexpr
,
expect
(
"
]
"
),
afterType
)
if
(
value
==
"
extends
"
||
value
==
"
implements
"
)
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
typeexpr
)
}
if
(
value
==
"
?
"
)
return
cont
(
typeexpr
,
expect
(
"
:
"
),
typeexpr
)
}
function
maybeTypeArgs
(
_
,
value
)
{
if
(
value
==
"
<
"
)
return
cont
(
pushlex
(
"
>
"
),
commasep
(
typeexpr
,
"
>
"
),
poplex
,
afterType
)
}
function
typeparam
()
{
return
pass
(
typeexpr
,
maybeTypeDefault
)
}
function
maybeTypeDefault
(
_
,
value
)
{
if
(
value
==
"
=
"
)
return
cont
(
typeexpr
)
}
function
vardef
(
_
,
value
)
{
if
(
value
==
"
enum
"
)
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
enumdef
)}
return
pass
(
pattern
,
maybetype
,
maybeAssign
,
vardefCont
);
}
function
pattern
(
type
,
value
)
{
if
(
isTS
&&
isModifier
(
value
))
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
pattern
)
}
if
(
type
==
"
variable
"
)
{
register
(
value
);
return
cont
();
}
if
(
type
==
"
spread
"
)
return
cont
(
pattern
);
if
(
type
==
"
[
"
)
return
contCommasep
(
eltpattern
,
"
]
"
);
if
(
type
==
"
{
"
)
return
contCommasep
(
proppattern
,
"
}
"
);
}
function
proppattern
(
type
,
value
)
{
if
(
type
==
"
variable
"
&&
!
cx
.
stream
.
match
(
/^
\s
*:/
,
false
))
{
register
(
value
);
return
cont
(
maybeAssign
);
}
if
(
type
==
"
variable
"
)
cx
.
marked
=
"
property
"
;
if
(
type
==
"
spread
"
)
return
cont
(
pattern
);
if
(
type
==
"
}
"
)
return
pass
();
if
(
type
==
"
[
"
)
return
cont
(
expression
,
expect
(
'
]
'
),
expect
(
'
:
'
),
proppattern
);
return
cont
(
expect
(
"
:
"
),
pattern
,
maybeAssign
);
}
function
eltpattern
()
{
return
pass
(
pattern
,
maybeAssign
)
}
function
maybeAssign
(
_type
,
value
)
{
if
(
value
==
"
=
"
)
return
cont
(
expressionNoComma
);
}
function
vardefCont
(
type
)
{
if
(
type
==
"
,
"
)
return
cont
(
vardef
);
}
function
maybeelse
(
type
,
value
)
{
if
(
type
==
"
keyword b
"
&&
value
==
"
else
"
)
return
cont
(
pushlex
(
"
form
"
,
"
else
"
),
statement
,
poplex
);
}
function
forspec
(
type
,
value
)
{
if
(
value
==
"
await
"
)
return
cont
(
forspec
);
if
(
type
==
"
(
"
)
return
cont
(
pushlex
(
"
)
"
),
forspec1
,
poplex
);
}
function
forspec1
(
type
)
{
if
(
type
==
"
var
"
)
return
cont
(
vardef
,
forspec2
);
if
(
type
==
"
variable
"
)
return
cont
(
forspec2
);
return
pass
(
forspec2
)
}
function
forspec2
(
type
,
value
)
{
if
(
type
==
"
)
"
)
return
cont
()
if
(
type
==
"
;
"
)
return
cont
(
forspec2
)
if
(
value
==
"
in
"
||
value
==
"
of
"
)
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
expression
,
forspec2
)
}
return
pass
(
expression
,
forspec2
)
}
function
functiondef
(
type
,
value
)
{
if
(
value
==
"
*
"
)
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
functiondef
);}
if
(
type
==
"
variable
"
)
{
register
(
value
);
return
cont
(
functiondef
);}
if
(
type
==
"
(
"
)
return
cont
(
pushcontext
,
pushlex
(
"
)
"
),
commasep
(
funarg
,
"
)
"
),
poplex
,
mayberettype
,
statement
,
popcontext
);
if
(
isTS
&&
value
==
"
<
"
)
return
cont
(
pushlex
(
"
>
"
),
commasep
(
typeparam
,
"
>
"
),
poplex
,
functiondef
)
}
function
functiondecl
(
type
,
value
)
{
if
(
value
==
"
*
"
)
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
functiondecl
);}
if
(
type
==
"
variable
"
)
{
register
(
value
);
return
cont
(
functiondecl
);}
if
(
type
==
"
(
"
)
return
cont
(
pushcontext
,
pushlex
(
"
)
"
),
commasep
(
funarg
,
"
)
"
),
poplex
,
mayberettype
,
popcontext
);
if
(
isTS
&&
value
==
"
<
"
)
return
cont
(
pushlex
(
"
>
"
),
commasep
(
typeparam
,
"
>
"
),
poplex
,
functiondecl
)
}
function
typename
(
type
,
value
)
{
if
(
type
==
"
keyword
"
||
type
==
"
variable
"
)
{
cx
.
marked
=
"
type
"
return
cont
(
typename
)
}
else
if
(
value
==
"
<
"
)
{
return
cont
(
pushlex
(
"
>
"
),
commasep
(
typeparam
,
"
>
"
),
poplex
)
}
}
function
funarg
(
type
,
value
)
{
if
(
value
==
"
@
"
)
cont
(
expression
,
funarg
)
if
(
type
==
"
spread
"
)
return
cont
(
funarg
);
if
(
isTS
&&
isModifier
(
value
))
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
funarg
);
}
if
(
isTS
&&
type
==
"
this
"
)
return
cont
(
maybetype
,
maybeAssign
)
return
pass
(
pattern
,
maybetype
,
maybeAssign
);
}
function
classExpression
(
type
,
value
)
{
// Class expressions may have an optional name.
if
(
type
==
"
variable
"
)
return
className
(
type
,
value
);
return
classNameAfter
(
type
,
value
);
}
function
className
(
type
,
value
)
{
if
(
type
==
"
variable
"
)
{
register
(
value
);
return
cont
(
classNameAfter
);}
}
function
classNameAfter
(
type
,
value
)
{
if
(
value
==
"
<
"
)
return
cont
(
pushlex
(
"
>
"
),
commasep
(
typeparam
,
"
>
"
),
poplex
,
classNameAfter
)
if
(
value
==
"
extends
"
||
value
==
"
implements
"
||
(
isTS
&&
type
==
"
,
"
))
{
if
(
value
==
"
implements
"
)
cx
.
marked
=
"
keyword
"
;
return
cont
(
isTS
?
typeexpr
:
expression
,
classNameAfter
);
}
if
(
type
==
"
{
"
)
return
cont
(
pushlex
(
"
}
"
),
classBody
,
poplex
);
}
function
classBody
(
type
,
value
)
{
if
(
type
==
"
async
"
||
(
type
==
"
variable
"
&&
(
value
==
"
static
"
||
value
==
"
get
"
||
value
==
"
set
"
||
(
isTS
&&
isModifier
(
value
)))
&&
cx
.
stream
.
match
(
/^
\s
+
[\w
$
\x
a1-
\u
ffff
]
/
,
false
)))
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
classBody
);
}
if
(
type
==
"
variable
"
||
cx
.
style
==
"
keyword
"
)
{
cx
.
marked
=
"
property
"
;
return
cont
(
isTS
?
classfield
:
functiondef
,
classBody
);
}
if
(
type
==
"
number
"
||
type
==
"
string
"
)
return
cont
(
isTS
?
classfield
:
functiondef
,
classBody
);
if
(
type
==
"
[
"
)
return
cont
(
expression
,
maybetype
,
expect
(
"
]
"
),
isTS
?
classfield
:
functiondef
,
classBody
)
if
(
value
==
"
*
"
)
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
classBody
);
}
if
(
isTS
&&
type
==
"
(
"
)
return
pass
(
functiondecl
,
classBody
)
if
(
type
==
"
;
"
||
type
==
"
,
"
)
return
cont
(
classBody
);
if
(
type
==
"
}
"
)
return
cont
();
if
(
value
==
"
@
"
)
return
cont
(
expression
,
classBody
)
}
function
classfield
(
type
,
value
)
{
if
(
value
==
"
?
"
)
return
cont
(
classfield
)
if
(
type
==
"
:
"
)
return
cont
(
typeexpr
,
maybeAssign
)
if
(
value
==
"
=
"
)
return
cont
(
expressionNoComma
)
var
context
=
cx
.
state
.
lexical
.
prev
,
isInterface
=
context
&&
context
.
info
==
"
interface
"
return
pass
(
isInterface
?
functiondecl
:
functiondef
)
}
function
afterExport
(
type
,
value
)
{
if
(
value
==
"
*
"
)
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
maybeFrom
,
expect
(
"
;
"
));
}
if
(
value
==
"
default
"
)
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
expression
,
expect
(
"
;
"
));
}
if
(
type
==
"
{
"
)
return
cont
(
commasep
(
exportField
,
"
}
"
),
maybeFrom
,
expect
(
"
;
"
));
return
pass
(
statement
);
}
function
exportField
(
type
,
value
)
{
if
(
value
==
"
as
"
)
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
expect
(
"
variable
"
));
}
if
(
type
==
"
variable
"
)
return
pass
(
expressionNoComma
,
exportField
);
}
function
afterImport
(
type
)
{
if
(
type
==
"
string
"
)
return
cont
();
if
(
type
==
"
(
"
)
return
pass
(
expression
);
return
pass
(
importSpec
,
maybeMoreImports
,
maybeFrom
);
}
function
importSpec
(
type
,
value
)
{
if
(
type
==
"
{
"
)
return
contCommasep
(
importSpec
,
"
}
"
);
if
(
type
==
"
variable
"
)
register
(
value
);
if
(
value
==
"
*
"
)
cx
.
marked
=
"
keyword
"
;
return
cont
(
maybeAs
);
}
function
maybeMoreImports
(
type
)
{
if
(
type
==
"
,
"
)
return
cont
(
importSpec
,
maybeMoreImports
)
}
function
maybeAs
(
_type
,
value
)
{
if
(
value
==
"
as
"
)
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
importSpec
);
}
}
function
maybeFrom
(
_type
,
value
)
{
if
(
value
==
"
from
"
)
{
cx
.
marked
=
"
keyword
"
;
return
cont
(
expression
);
}
}
function
arrayLiteral
(
type
)
{
if
(
type
==
"
]
"
)
return
cont
();
return
pass
(
commasep
(
expressionNoComma
,
"
]
"
));
}
function
enumdef
()
{
return
pass
(
pushlex
(
"
form
"
),
pattern
,
expect
(
"
{
"
),
pushlex
(
"
}
"
),
commasep
(
enummember
,
"
}
"
),
poplex
,
poplex
)
}
function
enummember
()
{
return
pass
(
pattern
,
maybeAssign
);
}
function
isContinuedStatement
(
state
,
textAfter
)
{
return
state
.
lastType
==
"
operator
"
||
state
.
lastType
==
"
,
"
||
isOperatorChar
.
test
(
textAfter
.
charAt
(
0
))
||
/
[
,.
]
/
.
test
(
textAfter
.
charAt
(
0
));
}
function
expressionAllowed
(
stream
,
state
,
backUp
)
{
return
state
.
tokenize
==
tokenBase
&&
/^
(?:
operator|sof|keyword
[
bcd
]
|case|new|export|default|spread|
[\[
{}
\(
,;:
]
|=>
)
$/
.
test
(
state
.
lastType
)
||
(
state
.
lastType
==
"
quasi
"
&&
/
\{\s
*$/
.
test
(
stream
.
string
.
slice
(
0
,
stream
.
pos
-
(
backUp
||
0
))))
}
// Interface
return
{
startState
:
function
(
basecolumn
)
{
var
state
=
{
tokenize
:
tokenBase
,
lastType
:
"
sof
"
,
cc
:
[],
lexical
:
new
JSLexical
((
basecolumn
||
0
)
-
indentUnit
,
0
,
"
block
"
,
false
),
localVars
:
parserConfig
.
localVars
,
context
:
parserConfig
.
localVars
&&
new
Context
(
null
,
null
,
false
),
indented
:
basecolumn
||
0
};
if
(
parserConfig
.
globalVars
&&
typeof
parserConfig
.
globalVars
==
"
object
"
)
state
.
globalVars
=
parserConfig
.
globalVars
;
return
state
;
},
token
:
function
(
stream
,
state
)
{
if
(
stream
.
sol
())
{
if
(
!
state
.
lexical
.
hasOwnProperty
(
"
align
"
))
state
.
lexical
.
align
=
false
;
state
.
indented
=
stream
.
indentation
();
findFatArrow
(
stream
,
state
);
}
if
(
state
.
tokenize
!=
tokenComment
&&
stream
.
eatSpace
())
return
null
;
var
style
=
state
.
tokenize
(
stream
,
state
);
if
(
type
==
"
comment
"
)
return
style
;
state
.
lastType
=
type
==
"
operator
"
&&
(
content
==
"
++
"
||
content
==
"
--
"
)
?
"
incdec
"
:
type
;
return
parseJS
(
state
,
style
,
type
,
content
,
stream
);
},
indent
:
function
(
state
,
textAfter
)
{
if
(
state
.
tokenize
==
tokenComment
)
return
CodeMirror
.
Pass
;
if
(
state
.
tokenize
!=
tokenBase
)
return
0
;
var
firstChar
=
textAfter
&&
textAfter
.
charAt
(
0
),
lexical
=
state
.
lexical
,
top
// Kludge to prevent 'maybelse' from blocking lexical scope pops
if
(
!
/^
\s
*else
\b
/
.
test
(
textAfter
))
for
(
var
i
=
state
.
cc
.
length
-
1
;
i
>=
0
;
--
i
)
{
var
c
=
state
.
cc
[
i
];
if
(
c
==
poplex
)
lexical
=
lexical
.
prev
;
else
if
(
c
!=
maybeelse
)
break
;
}
while
((
lexical
.
type
==
"
stat
"
||
lexical
.
type
==
"
form
"
)
&&
(
firstChar
==
"
}
"
||
((
top
=
state
.
cc
[
state
.
cc
.
length
-
1
])
&&
(
top
==
maybeoperatorComma
||
top
==
maybeoperatorNoComma
)
&&
!
/^
[
,
\.
=+
\-
*:?[
\(]
/
.
test
(
textAfter
))))
lexical
=
lexical
.
prev
;
if
(
statementIndent
&&
lexical
.
type
==
"
)
"
&&
lexical
.
prev
.
type
==
"
stat
"
)
lexical
=
lexical
.
prev
;
var
type
=
lexical
.
type
,
closing
=
firstChar
==
type
;
if
(
type
==
"
vardef
"
)
return
lexical
.
indented
+
(
state
.
lastType
==
"
operator
"
||
state
.
lastType
==
"
,
"
?
lexical
.
info
.
length
+
1
:
0
);
else
if
(
type
==
"
form
"
&&
firstChar
==
"
{
"
)
return
lexical
.
indented
;
else
if
(
type
==
"
form
"
)
return
lexical
.
indented
+
indentUnit
;
else
if
(
type
==
"
stat
"
)
return
lexical
.
indented
+
(
isContinuedStatement
(
state
,
textAfter
)
?
statementIndent
||
indentUnit
:
0
);
else
if
(
lexical
.
info
==
"
switch
"
&&
!
closing
&&
parserConfig
.
doubleIndentSwitch
!=
false
)
return
lexical
.
indented
+
(
/^
(?:
case|default
)\b
/
.
test
(
textAfter
)
?
indentUnit
:
2
*
indentUnit
);
else
if
(
lexical
.
align
)
return
lexical
.
column
+
(
closing
?
0
:
1
);
else
return
lexical
.
indented
+
(
closing
?
0
:
indentUnit
);
},
electricInput
:
/^
\s
*
(?:
case .*
?
:|default:|
\{
|
\})
$/
,
blockCommentStart
:
jsonMode
?
null
:
"
/*
"
,
blockCommentEnd
:
jsonMode
?
null
:
"
*/
"
,
blockCommentContinue
:
jsonMode
?
null
:
"
*
"
,
lineComment
:
jsonMode
?
null
:
"
//
"
,
fold
:
"
brace
"
,
closeBrackets
:
"
()[]{}''
\"\"
``
"
,
helperType
:
jsonMode
?
"
json
"
:
"
javascript
"
,
jsonldMode
:
jsonldMode
,
jsonMode
:
jsonMode
,
expressionAllowed
:
expressionAllowed
,
skipExpression
:
function
(
state
)
{
var
top
=
state
.
cc
[
state
.
cc
.
length
-
1
]
if
(
top
==
expression
||
top
==
expressionNoComma
)
state
.
cc
.
pop
()
}
};
});
CodeMirror
.
registerHelper
(
"
wordChars
"
,
"
javascript
"
,
/
[\w
$
]
/
);
CodeMirror
.
defineMIME
(
"
text/javascript
"
,
"
javascript
"
);
CodeMirror
.
defineMIME
(
"
text/ecmascript
"
,
"
javascript
"
);
CodeMirror
.
defineMIME
(
"
application/javascript
"
,
"
javascript
"
);
CodeMirror
.
defineMIME
(
"
application/x-javascript
"
,
"
javascript
"
);
CodeMirror
.
defineMIME
(
"
application/ecmascript
"
,
"
javascript
"
);
CodeMirror
.
defineMIME
(
"
application/json
"
,
{
name
:
"
javascript
"
,
json
:
true
});
CodeMirror
.
defineMIME
(
"
application/x-json
"
,
{
name
:
"
javascript
"
,
json
:
true
});
CodeMirror
.
defineMIME
(
"
application/ld+json
"
,
{
name
:
"
javascript
"
,
jsonld
:
true
});
CodeMirror
.
defineMIME
(
"
text/typescript
"
,
{
name
:
"
javascript
"
,
typescript
:
true
});
CodeMirror
.
defineMIME
(
"
application/typescript
"
,
{
name
:
"
javascript
"
,
typescript
:
true
});
});
Prev
1
…
5
6
7
8
9
10
11
12
13
14
Next
Write
Preview
Supports
Markdown
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