mirror of
https://github.com/hequan2017/seal.git
synced 2026-04-24 02:30:24 +08:00
v0.1 基础版本
v0.1 基础版本
This commit is contained in:
191
static/js/plugins/codemirror/mode/textile/index.html
vendored
Normal file
191
static/js/plugins/codemirror/mode/textile/index.html
vendored
Normal file
@@ -0,0 +1,191 @@
|
||||
<!doctype html>
|
||||
|
||||
<title>CodeMirror: Textile 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="textile.js"></script>
|
||||
<style>.CodeMirror {background: #f8f8f8;}</style>
|
||||
<div id=nav>
|
||||
<a href="http://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/marijnh/codemirror">Code</a>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><a href="../index.html">Language modes</a>
|
||||
<li><a class="active" href="#">Textile</a>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<article>
|
||||
<h2>Textile mode</h2>
|
||||
<form><textarea id="code" name="code">
|
||||
h1. Textile Mode
|
||||
|
||||
A paragraph without formatting.
|
||||
|
||||
p. A simple Paragraph.
|
||||
|
||||
|
||||
h2. Phrase Modifiers
|
||||
|
||||
Here are some simple phrase modifiers: *strong*, _emphasis_, **bold**, and __italic__.
|
||||
|
||||
A ??citation??, -deleted text-, +inserted text+, some ^superscript^, and some ~subscript~.
|
||||
|
||||
A %span element% and @code element@
|
||||
|
||||
A "link":http://example.com, a "link with (alt text)":urlAlias
|
||||
|
||||
[urlAlias]http://example.com/
|
||||
|
||||
An image: !http://example.com/image.png! and an image with a link: !http://example.com/image.png!:http://example.com
|
||||
|
||||
A sentence with a footnote.[123]
|
||||
|
||||
fn123. The footnote is defined here.
|
||||
|
||||
Registered(r), Trademark(tm), and Copyright(c)
|
||||
|
||||
|
||||
h2. Headers
|
||||
|
||||
h1. Top level
|
||||
h2. Second level
|
||||
h3. Third level
|
||||
h4. Fourth level
|
||||
h5. Fifth level
|
||||
h6. Lowest level
|
||||
|
||||
|
||||
h2. Lists
|
||||
|
||||
* An unordered list
|
||||
** foo bar
|
||||
*** foo bar
|
||||
**** foo bar
|
||||
** foo bar
|
||||
|
||||
# An ordered list
|
||||
## foo bar
|
||||
### foo bar
|
||||
#### foo bar
|
||||
## foo bar
|
||||
|
||||
- definition list := description
|
||||
- another item := foo bar
|
||||
- spanning ines :=
|
||||
foo bar
|
||||
|
||||
foo bar =:
|
||||
|
||||
|
||||
h2. Attributes
|
||||
|
||||
Layouts and phrase modifiers can be modified with various kinds of attributes: alignment, CSS ID, CSS class names, language, padding, and CSS styles.
|
||||
|
||||
h3. Alignment
|
||||
|
||||
div<. left align
|
||||
div>. right align
|
||||
|
||||
h3. CSS ID and class name
|
||||
|
||||
You are a %(my-id#my-classname) rad% person.
|
||||
|
||||
h3. Language
|
||||
|
||||
p[en_CA]. Strange weather, eh?
|
||||
|
||||
h3. Horizontal Padding
|
||||
|
||||
p(())). 2em left padding, 3em right padding
|
||||
|
||||
h3. CSS styling
|
||||
|
||||
p{background: red}. Fire!
|
||||
|
||||
|
||||
h2. Table
|
||||
|
||||
|_. Header 1 |_. Header 2 |
|
||||
|{background:#ddd}. Cell with background| Normal |
|
||||
|\2. Cell spanning 2 columns |
|
||||
|/2. Cell spanning 2 rows |(cell-class). one |
|
||||
| two |
|
||||
|>. Right aligned cell |<. Left aligned cell |
|
||||
|
||||
|
||||
h3. A table with attributes:
|
||||
|
||||
table(#prices).
|
||||
|Adults|$5|
|
||||
|Children|$2|
|
||||
|
||||
|
||||
h2. Code blocks
|
||||
|
||||
bc.
|
||||
function factorial(n) {
|
||||
if (n === 0) {
|
||||
return 1;
|
||||
}
|
||||
return n * factorial(n - 1);
|
||||
}
|
||||
|
||||
pre..
|
||||
,,,,,,
|
||||
o#'9MMHb':'-,o,
|
||||
.oH":HH$' "' ' -*R&o,
|
||||
dMMM*""'`' .oM"HM?.
|
||||
,MMM' "HLbd< ?&H\
|
||||
.:MH ."\ ` MM MM&b
|
||||
. "*H - &MMMMMMMMMH:
|
||||
. dboo MMMMMMMMMMMM.
|
||||
. dMMMMMMb *MMMMMMMMMP.
|
||||
. MMMMMMMP *MMMMMP .
|
||||
`#MMMMM MM6P ,
|
||||
' `MMMP" HM*`,
|
||||
' :MM .- ,
|
||||
'. `#?.. . ..'
|
||||
-. . .-
|
||||
''-.oo,oo.-''
|
||||
|
||||
\. _(9>
|
||||
\==_)
|
||||
-'=
|
||||
|
||||
h2. Temporarily disabling textile markup
|
||||
|
||||
notextile. Don't __touch this!__
|
||||
|
||||
Surround text with double-equals to disable textile inline. Example: Use ==*asterisks*== for *strong* text.
|
||||
|
||||
|
||||
h2. HTML
|
||||
|
||||
Some block layouts are simply textile versions of HTML tags with the same name, like @div@, @pre@, and @p@. HTML tags can also exist on their own line:
|
||||
|
||||
<section>
|
||||
<h1>Title</h1>
|
||||
<p>Hello!</p>
|
||||
</section>
|
||||
|
||||
</textarea></form>
|
||||
<script>
|
||||
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
|
||||
lineNumbers: true,
|
||||
mode: "text/x-textile"
|
||||
});
|
||||
</script>
|
||||
|
||||
<p><strong>MIME types defined:</strong> <code>text/x-textile</code>.</p>
|
||||
|
||||
<p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#textile_*">normal</a>, <a href="../../test/index.html#verbose,textile_*">verbose</a>.</p>
|
||||
|
||||
</article>
|
||||
406
static/js/plugins/codemirror/mode/textile/test.js
vendored
Normal file
406
static/js/plugins/codemirror/mode/textile/test.js
vendored
Normal file
@@ -0,0 +1,406 @@
|
||||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||
|
||||
(function() {
|
||||
var mode = CodeMirror.getMode({tabSize: 4}, 'textile');
|
||||
function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }
|
||||
|
||||
MT('simpleParagraphs',
|
||||
'Some text.',
|
||||
'',
|
||||
'Some more text.');
|
||||
|
||||
/*
|
||||
* Phrase Modifiers
|
||||
*/
|
||||
|
||||
MT('em',
|
||||
'foo [em _bar_]');
|
||||
|
||||
MT('emBoogus',
|
||||
'code_mirror');
|
||||
|
||||
MT('strong',
|
||||
'foo [strong *bar*]');
|
||||
|
||||
MT('strongBogus',
|
||||
'3 * 3 = 9');
|
||||
|
||||
MT('italic',
|
||||
'foo [em __bar__]');
|
||||
|
||||
MT('italicBogus',
|
||||
'code__mirror');
|
||||
|
||||
MT('bold',
|
||||
'foo [strong **bar**]');
|
||||
|
||||
MT('boldBogus',
|
||||
'3 ** 3 = 27');
|
||||
|
||||
MT('simpleLink',
|
||||
'[link "CodeMirror":http://codemirror.net]');
|
||||
|
||||
MT('referenceLink',
|
||||
'[link "CodeMirror":code_mirror]',
|
||||
'Normal Text.',
|
||||
'[link [[code_mirror]]http://codemirror.net]');
|
||||
|
||||
MT('footCite',
|
||||
'foo bar[qualifier [[1]]]');
|
||||
|
||||
MT('footCiteBogus',
|
||||
'foo bar[[1a2]]');
|
||||
|
||||
MT('special-characters',
|
||||
'Registered [tag (r)], ' +
|
||||
'Trademark [tag (tm)], and ' +
|
||||
'Copyright [tag (c)] 2008');
|
||||
|
||||
MT('cite',
|
||||
"A book is [keyword ??The Count of Monte Cristo??] by Dumas.");
|
||||
|
||||
MT('additionAndDeletion',
|
||||
'The news networks declared [negative -Al Gore-] ' +
|
||||
'[positive +George W. Bush+] the winner in Florida.');
|
||||
|
||||
MT('subAndSup',
|
||||
'f(x, n) = log [builtin ~4~] x [builtin ^n^]');
|
||||
|
||||
MT('spanAndCode',
|
||||
'A [quote %span element%] and [atom @code element@]');
|
||||
|
||||
MT('spanBogus',
|
||||
'Percentage 25% is not a span.');
|
||||
|
||||
MT('citeBogus',
|
||||
'Question? is not a citation.');
|
||||
|
||||
MT('codeBogus',
|
||||
'user@example.com');
|
||||
|
||||
MT('subBogus',
|
||||
'~username');
|
||||
|
||||
MT('supBogus',
|
||||
'foo ^ bar');
|
||||
|
||||
MT('deletionBogus',
|
||||
'3 - 3 = 0');
|
||||
|
||||
MT('additionBogus',
|
||||
'3 + 3 = 6');
|
||||
|
||||
MT('image',
|
||||
'An image: [string !http://www.example.com/image.png!]');
|
||||
|
||||
MT('imageWithAltText',
|
||||
'An image: [string !http://www.example.com/image.png (Alt Text)!]');
|
||||
|
||||
MT('imageWithUrl',
|
||||
'An image: [string !http://www.example.com/image.png!:http://www.example.com/]');
|
||||
|
||||
/*
|
||||
* Headers
|
||||
*/
|
||||
|
||||
MT('h1',
|
||||
'[header&header-1 h1. foo]');
|
||||
|
||||
MT('h2',
|
||||
'[header&header-2 h2. foo]');
|
||||
|
||||
MT('h3',
|
||||
'[header&header-3 h3. foo]');
|
||||
|
||||
MT('h4',
|
||||
'[header&header-4 h4. foo]');
|
||||
|
||||
MT('h5',
|
||||
'[header&header-5 h5. foo]');
|
||||
|
||||
MT('h6',
|
||||
'[header&header-6 h6. foo]');
|
||||
|
||||
MT('h7Bogus',
|
||||
'h7. foo');
|
||||
|
||||
MT('multipleHeaders',
|
||||
'[header&header-1 h1. Heading 1]',
|
||||
'',
|
||||
'Some text.',
|
||||
'',
|
||||
'[header&header-2 h2. Heading 2]',
|
||||
'',
|
||||
'More text.');
|
||||
|
||||
MT('h1inline',
|
||||
'[header&header-1 h1. foo ][header&header-1&em _bar_][header&header-1 baz]');
|
||||
|
||||
/*
|
||||
* Lists
|
||||
*/
|
||||
|
||||
MT('ul',
|
||||
'foo',
|
||||
'bar',
|
||||
'',
|
||||
'[variable-2 * foo]',
|
||||
'[variable-2 * bar]');
|
||||
|
||||
MT('ulNoBlank',
|
||||
'foo',
|
||||
'bar',
|
||||
'[variable-2 * foo]',
|
||||
'[variable-2 * bar]');
|
||||
|
||||
MT('ol',
|
||||
'foo',
|
||||
'bar',
|
||||
'',
|
||||
'[variable-2 # foo]',
|
||||
'[variable-2 # bar]');
|
||||
|
||||
MT('olNoBlank',
|
||||
'foo',
|
||||
'bar',
|
||||
'[variable-2 # foo]',
|
||||
'[variable-2 # bar]');
|
||||
|
||||
MT('ulFormatting',
|
||||
'[variable-2 * ][variable-2&em _foo_][variable-2 bar]',
|
||||
'[variable-2 * ][variable-2&strong *][variable-2&em&strong _foo_]' +
|
||||
'[variable-2&strong *][variable-2 bar]',
|
||||
'[variable-2 * ][variable-2&strong *foo*][variable-2 bar]');
|
||||
|
||||
MT('olFormatting',
|
||||
'[variable-2 # ][variable-2&em _foo_][variable-2 bar]',
|
||||
'[variable-2 # ][variable-2&strong *][variable-2&em&strong _foo_]' +
|
||||
'[variable-2&strong *][variable-2 bar]',
|
||||
'[variable-2 # ][variable-2&strong *foo*][variable-2 bar]');
|
||||
|
||||
MT('ulNested',
|
||||
'[variable-2 * foo]',
|
||||
'[variable-3 ** bar]',
|
||||
'[keyword *** bar]',
|
||||
'[variable-2 **** bar]',
|
||||
'[variable-3 ** bar]');
|
||||
|
||||
MT('olNested',
|
||||
'[variable-2 # foo]',
|
||||
'[variable-3 ## bar]',
|
||||
'[keyword ### bar]',
|
||||
'[variable-2 #### bar]',
|
||||
'[variable-3 ## bar]');
|
||||
|
||||
MT('ulNestedWithOl',
|
||||
'[variable-2 * foo]',
|
||||
'[variable-3 ## bar]',
|
||||
'[keyword *** bar]',
|
||||
'[variable-2 #### bar]',
|
||||
'[variable-3 ** bar]');
|
||||
|
||||
MT('olNestedWithUl',
|
||||
'[variable-2 # foo]',
|
||||
'[variable-3 ** bar]',
|
||||
'[keyword ### bar]',
|
||||
'[variable-2 **** bar]',
|
||||
'[variable-3 ## bar]');
|
||||
|
||||
MT('definitionList',
|
||||
'[number - coffee := Hot ][number&em _and_][number black]',
|
||||
'',
|
||||
'Normal text.');
|
||||
|
||||
MT('definitionListSpan',
|
||||
'[number - coffee :=]',
|
||||
'',
|
||||
'[number Hot ][number&em _and_][number black =:]',
|
||||
'',
|
||||
'Normal text.');
|
||||
|
||||
MT('boo',
|
||||
'[number - dog := woof woof]',
|
||||
'[number - cat := meow meow]',
|
||||
'[number - whale :=]',
|
||||
'[number Whale noises.]',
|
||||
'',
|
||||
'[number Also, ][number&em _splashing_][number . =:]');
|
||||
|
||||
/*
|
||||
* Attributes
|
||||
*/
|
||||
|
||||
MT('divWithAttribute',
|
||||
'[punctuation div][punctuation&attribute (#my-id)][punctuation . foo bar]');
|
||||
|
||||
MT('divWithAttributeAnd2emRightPadding',
|
||||
'[punctuation div][punctuation&attribute (#my-id)((][punctuation . foo bar]');
|
||||
|
||||
MT('divWithClassAndId',
|
||||
'[punctuation div][punctuation&attribute (my-class#my-id)][punctuation . foo bar]');
|
||||
|
||||
MT('paragraphWithCss',
|
||||
'p[attribute {color:red;}]. foo bar');
|
||||
|
||||
MT('paragraphNestedStyles',
|
||||
'p. [strong *foo ][strong&em _bar_][strong *]');
|
||||
|
||||
MT('paragraphWithLanguage',
|
||||
'p[attribute [[fr]]]. Parlez-vous français?');
|
||||
|
||||
MT('paragraphLeftAlign',
|
||||
'p[attribute <]. Left');
|
||||
|
||||
MT('paragraphRightAlign',
|
||||
'p[attribute >]. Right');
|
||||
|
||||
MT('paragraphRightAlign',
|
||||
'p[attribute =]. Center');
|
||||
|
||||
MT('paragraphJustified',
|
||||
'p[attribute <>]. Justified');
|
||||
|
||||
MT('paragraphWithLeftIndent1em',
|
||||
'p[attribute (]. Left');
|
||||
|
||||
MT('paragraphWithRightIndent1em',
|
||||
'p[attribute )]. Right');
|
||||
|
||||
MT('paragraphWithLeftIndent2em',
|
||||
'p[attribute ((]. Left');
|
||||
|
||||
MT('paragraphWithRightIndent2em',
|
||||
'p[attribute ))]. Right');
|
||||
|
||||
MT('paragraphWithLeftIndent3emRightIndent2em',
|
||||
'p[attribute ((())]. Right');
|
||||
|
||||
MT('divFormatting',
|
||||
'[punctuation div. ][punctuation&strong *foo ]' +
|
||||
'[punctuation&strong&em _bar_][punctuation&strong *]');
|
||||
|
||||
MT('phraseModifierAttributes',
|
||||
'p[attribute (my-class)]. This is a paragraph that has a class and' +
|
||||
' this [em _][em&attribute (#special-phrase)][em emphasized phrase_]' +
|
||||
' has an id.');
|
||||
|
||||
MT('linkWithClass',
|
||||
'[link "(my-class). This is a link with class":http://redcloth.org]');
|
||||
|
||||
/*
|
||||
* Layouts
|
||||
*/
|
||||
|
||||
MT('paragraphLayouts',
|
||||
'p. This is one paragraph.',
|
||||
'',
|
||||
'p. This is another.');
|
||||
|
||||
MT('div',
|
||||
'[punctuation div. foo bar]');
|
||||
|
||||
MT('pre',
|
||||
'[operator pre. Text]');
|
||||
|
||||
MT('bq.',
|
||||
'[bracket bq. foo bar]',
|
||||
'',
|
||||
'Normal text.');
|
||||
|
||||
MT('footnote',
|
||||
'[variable fn123. foo ][variable&strong *bar*]');
|
||||
|
||||
/*
|
||||
* Spanning Layouts
|
||||
*/
|
||||
|
||||
MT('bq..ThenParagraph',
|
||||
'[bracket bq.. foo bar]',
|
||||
'',
|
||||
'[bracket More quote.]',
|
||||
'p. Normal Text');
|
||||
|
||||
MT('bq..ThenH1',
|
||||
'[bracket bq.. foo bar]',
|
||||
'',
|
||||
'[bracket More quote.]',
|
||||
'[header&header-1 h1. Header Text]');
|
||||
|
||||
MT('bc..ThenParagraph',
|
||||
'[atom bc.. # Some ruby code]',
|
||||
'[atom obj = {foo: :bar}]',
|
||||
'[atom puts obj]',
|
||||
'',
|
||||
'[atom obj[[:love]] = "*love*"]',
|
||||
'[atom puts obj.love.upcase]',
|
||||
'',
|
||||
'p. Normal text.');
|
||||
|
||||
MT('fn1..ThenParagraph',
|
||||
'[variable fn1.. foo bar]',
|
||||
'',
|
||||
'[variable More.]',
|
||||
'p. Normal Text');
|
||||
|
||||
MT('pre..ThenParagraph',
|
||||
'[operator pre.. foo bar]',
|
||||
'',
|
||||
'[operator More.]',
|
||||
'p. Normal Text');
|
||||
|
||||
/*
|
||||
* Tables
|
||||
*/
|
||||
|
||||
MT('table',
|
||||
'[variable-3&operator |_. name |_. age|]',
|
||||
'[variable-3 |][variable-3&strong *Walter*][variable-3 | 5 |]',
|
||||
'[variable-3 |Florence| 6 |]',
|
||||
'',
|
||||
'p. Normal text.');
|
||||
|
||||
MT('tableWithAttributes',
|
||||
'[variable-3&operator |_. name |_. age|]',
|
||||
'[variable-3 |][variable-3&attribute /2.][variable-3 Jim |]',
|
||||
'[variable-3 |][variable-3&attribute \\2{color: red}.][variable-3 Sam |]');
|
||||
|
||||
/*
|
||||
* HTML
|
||||
*/
|
||||
|
||||
MT('html',
|
||||
'[comment <div id="wrapper">]',
|
||||
'[comment <section id="introduction">]',
|
||||
'',
|
||||
'[header&header-1 h1. Welcome]',
|
||||
'',
|
||||
'[variable-2 * Item one]',
|
||||
'[variable-2 * Item two]',
|
||||
'',
|
||||
'[comment <a href="http://example.com">Example</a>]',
|
||||
'',
|
||||
'[comment </section>]',
|
||||
'[comment </div>]');
|
||||
|
||||
MT('inlineHtml',
|
||||
'I can use HTML directly in my [comment <span class="youbetcha">Textile</span>].');
|
||||
|
||||
/*
|
||||
* No-Textile
|
||||
*/
|
||||
|
||||
MT('notextile',
|
||||
'[string-2 notextile. *No* formatting]');
|
||||
|
||||
MT('notextileInline',
|
||||
'Use [string-2 ==*asterisks*==] for [strong *strong*] text.');
|
||||
|
||||
MT('notextileWithPre',
|
||||
'[operator pre. *No* formatting]');
|
||||
|
||||
MT('notextileWithSpanningPre',
|
||||
'[operator pre.. *No* formatting]',
|
||||
'',
|
||||
'[operator *No* formatting]');
|
||||
})();
|
||||
553
static/js/plugins/codemirror/mode/textile/textile.js
vendored
Normal file
553
static/js/plugins/codemirror/mode/textile/textile.js
vendored
Normal file
@@ -0,0 +1,553 @@
|
||||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||
// Distributed under an MIT license: http://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';
|
||||
|
||||
var TOKEN_STYLES = {
|
||||
addition: 'positive',
|
||||
attributes: 'attribute',
|
||||
bold: 'strong',
|
||||
cite: 'keyword',
|
||||
code: 'atom',
|
||||
definitionList: 'number',
|
||||
deletion: 'negative',
|
||||
div: 'punctuation',
|
||||
em: 'em',
|
||||
footnote: 'variable',
|
||||
footCite: 'qualifier',
|
||||
header: 'header',
|
||||
html: 'comment',
|
||||
image: 'string',
|
||||
italic: 'em',
|
||||
link: 'link',
|
||||
linkDefinition: 'link',
|
||||
list1: 'variable-2',
|
||||
list2: 'variable-3',
|
||||
list3: 'keyword',
|
||||
notextile: 'string-2',
|
||||
pre: 'operator',
|
||||
p: 'property',
|
||||
quote: 'bracket',
|
||||
span: 'quote',
|
||||
specialChar: 'tag',
|
||||
strong: 'strong',
|
||||
sub: 'builtin',
|
||||
sup: 'builtin',
|
||||
table: 'variable-3',
|
||||
tableHeading: 'operator'
|
||||
};
|
||||
|
||||
function Parser(regExpFactory, state, stream) {
|
||||
this.regExpFactory = regExpFactory;
|
||||
this.state = state;
|
||||
this.stream = stream;
|
||||
this.styles = TOKEN_STYLES;
|
||||
|
||||
this.state.specialChar = null;
|
||||
}
|
||||
|
||||
Parser.prototype.eat = function(name) {
|
||||
return this.stream.match(this.regExpFactory.pattern(name), true);
|
||||
};
|
||||
|
||||
Parser.prototype.check = function(name) {
|
||||
return this.stream.match(this.regExpFactory.pattern(name), false);
|
||||
};
|
||||
|
||||
Parser.prototype.setModeForNextToken = function(mode) {
|
||||
return this.state.mode = mode;
|
||||
};
|
||||
|
||||
Parser.prototype.execMode = function(newMode) {
|
||||
return this.setModeForNextToken(newMode).call(this);
|
||||
};
|
||||
|
||||
Parser.prototype.startNewLine = function() {
|
||||
this.setModeForNextToken(Modes.newLayout);
|
||||
this.state.tableHeading = false;
|
||||
|
||||
if (this.state.layoutType === 'definitionList' && this.state.spanningLayout) {
|
||||
if (this.check('definitionListEnd')) {
|
||||
this.state.spanningLayout = false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Parser.prototype.nextToken = function() {
|
||||
return this.state.mode.call(this);
|
||||
};
|
||||
|
||||
Parser.prototype.styleFor = function(token) {
|
||||
if (this.styles.hasOwnProperty(token)) {
|
||||
return this.styles[token];
|
||||
}
|
||||
throw 'unknown token';
|
||||
};
|
||||
|
||||
Parser.prototype.handlePhraseModifier = function(ch) {
|
||||
if (ch === '_') {
|
||||
if (this.stream.eat('_')) {
|
||||
return this.togglePhraseModifier('italic', /^.*__/);
|
||||
}
|
||||
return this.togglePhraseModifier('em', /^.*_/);
|
||||
}
|
||||
|
||||
if (ch === '*') {
|
||||
if (this.stream.eat('*')) {
|
||||
return this.togglePhraseModifier('bold', /^.*\*\*/);
|
||||
}
|
||||
return this.togglePhraseModifier('strong', /^.*\*/);
|
||||
}
|
||||
|
||||
if (ch === '[') {
|
||||
if (this.stream.match(/\d+\]/)) {
|
||||
this.state.footCite = true;
|
||||
}
|
||||
return this.tokenStyles();
|
||||
}
|
||||
|
||||
if (ch === '(') {
|
||||
if (this.stream.match('r)')) {
|
||||
this.state.specialChar = 'r';
|
||||
} else if (this.stream.match('tm)')) {
|
||||
this.state.specialChar = 'tm';
|
||||
} else if (this.stream.match('c)')) {
|
||||
this.state.specialChar = 'c';
|
||||
}
|
||||
return this.tokenStyles();
|
||||
}
|
||||
|
||||
if (ch === '<') {
|
||||
if (this.stream.match(/(\w+)[^>]+>[^<]+<\/\1>/)) {
|
||||
return this.tokenStylesWith(this.styleFor('html'));
|
||||
}
|
||||
}
|
||||
|
||||
if (ch === '?' && this.stream.eat('?')) {
|
||||
return this.togglePhraseModifier('cite', /^.*\?\?/);
|
||||
}
|
||||
if (ch === '=' && this.stream.eat('=')) {
|
||||
return this.togglePhraseModifier('notextile', /^.*==/);
|
||||
}
|
||||
if (ch === '-') {
|
||||
return this.togglePhraseModifier('deletion', /^.*-/);
|
||||
}
|
||||
if (ch === '+') {
|
||||
return this.togglePhraseModifier('addition', /^.*\+/);
|
||||
}
|
||||
if (ch === '~') {
|
||||
return this.togglePhraseModifier('sub', /^.*~/);
|
||||
}
|
||||
if (ch === '^') {
|
||||
return this.togglePhraseModifier('sup', /^.*\^/);
|
||||
}
|
||||
if (ch === '%') {
|
||||
return this.togglePhraseModifier('span', /^.*%/);
|
||||
}
|
||||
if (ch === '@') {
|
||||
return this.togglePhraseModifier('code', /^.*@/);
|
||||
}
|
||||
if (ch === '!') {
|
||||
var type = this.togglePhraseModifier('image', /^.*(?:\([^\)]+\))?!/);
|
||||
this.stream.match(/^:\S+/); // optional Url portion
|
||||
return type;
|
||||
}
|
||||
return this.tokenStyles();
|
||||
};
|
||||
|
||||
Parser.prototype.togglePhraseModifier = function(phraseModifier, closeRE) {
|
||||
if (this.state[phraseModifier]) { // remove phrase modifier
|
||||
var type = this.tokenStyles();
|
||||
this.state[phraseModifier] = false;
|
||||
return type;
|
||||
}
|
||||
if (this.stream.match(closeRE, false)) { // add phrase modifier
|
||||
this.state[phraseModifier] = true;
|
||||
this.setModeForNextToken(Modes.attributes);
|
||||
}
|
||||
return this.tokenStyles();
|
||||
};
|
||||
|
||||
Parser.prototype.tokenStyles = function() {
|
||||
var disabled = this.textileDisabled(),
|
||||
styles = [];
|
||||
|
||||
if (disabled) return disabled;
|
||||
|
||||
if (this.state.layoutType) {
|
||||
styles.push(this.styleFor(this.state.layoutType));
|
||||
}
|
||||
|
||||
styles = styles.concat(this.activeStyles('addition', 'bold', 'cite', 'code',
|
||||
'deletion', 'em', 'footCite', 'image', 'italic', 'link', 'span', 'specialChar', 'strong',
|
||||
'sub', 'sup', 'table', 'tableHeading'));
|
||||
|
||||
if (this.state.layoutType === 'header') {
|
||||
styles.push(this.styleFor('header') + '-' + this.state.header);
|
||||
}
|
||||
return styles.length ? styles.join(' ') : null;
|
||||
};
|
||||
|
||||
Parser.prototype.textileDisabled = function() {
|
||||
var type = this.state.layoutType;
|
||||
|
||||
switch(type) {
|
||||
case 'notextile':
|
||||
case 'code':
|
||||
case 'pre':
|
||||
return this.styleFor(type);
|
||||
default:
|
||||
if (this.state.notextile) {
|
||||
return this.styleFor('notextile') + (type ? (' ' + this.styleFor(type)) : '');
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
Parser.prototype.tokenStylesWith = function(extraStyles) {
|
||||
var disabled = this.textileDisabled(),
|
||||
type;
|
||||
|
||||
if (disabled) return disabled;
|
||||
|
||||
type = this.tokenStyles();
|
||||
if(extraStyles) {
|
||||
return type ? (type + ' ' + extraStyles) : extraStyles;
|
||||
}
|
||||
return type;
|
||||
};
|
||||
|
||||
Parser.prototype.activeStyles = function() {
|
||||
var styles = [],
|
||||
i;
|
||||
for (i = 0; i < arguments.length; ++i) {
|
||||
if (this.state[arguments[i]]) {
|
||||
styles.push(this.styleFor(arguments[i]));
|
||||
}
|
||||
}
|
||||
return styles;
|
||||
};
|
||||
|
||||
Parser.prototype.blankLine = function() {
|
||||
var spanningLayout = this.state.spanningLayout,
|
||||
type = this.state.layoutType,
|
||||
key;
|
||||
|
||||
for (key in this.state) {
|
||||
if (this.state.hasOwnProperty(key)) {
|
||||
delete this.state[key];
|
||||
}
|
||||
}
|
||||
|
||||
this.setModeForNextToken(Modes.newLayout);
|
||||
if (spanningLayout) {
|
||||
this.state.layoutType = type;
|
||||
this.state.spanningLayout = true;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
function RegExpFactory() {
|
||||
this.cache = {};
|
||||
this.single = {
|
||||
bc: 'bc',
|
||||
bq: 'bq',
|
||||
definitionList: /- [^(?::=)]+:=+/,
|
||||
definitionListEnd: /.*=:\s*$/,
|
||||
div: 'div',
|
||||
drawTable: /\|.*\|/,
|
||||
foot: /fn\d+/,
|
||||
header: /h[1-6]/,
|
||||
html: /\s*<(?:\/)?(\w+)(?:[^>]+)?>(?:[^<]+<\/\1>)?/,
|
||||
link: /[^"]+":\S/,
|
||||
linkDefinition: /\[[^\s\]]+\]\S+/,
|
||||
list: /(?:#+|\*+)/,
|
||||
notextile: 'notextile',
|
||||
para: 'p',
|
||||
pre: 'pre',
|
||||
table: 'table',
|
||||
tableCellAttributes: /[/\\]\d+/,
|
||||
tableHeading: /\|_\./,
|
||||
tableText: /[^"_\*\[\(\?\+~\^%@|-]+/,
|
||||
text: /[^!"_=\*\[\(<\?\+~\^%@-]+/
|
||||
};
|
||||
this.attributes = {
|
||||
align: /(?:<>|<|>|=)/,
|
||||
selector: /\([^\(][^\)]+\)/,
|
||||
lang: /\[[^\[\]]+\]/,
|
||||
pad: /(?:\(+|\)+){1,2}/,
|
||||
css: /\{[^\}]+\}/
|
||||
};
|
||||
}
|
||||
|
||||
RegExpFactory.prototype.pattern = function(name) {
|
||||
return (this.cache[name] || this.createRe(name));
|
||||
};
|
||||
|
||||
RegExpFactory.prototype.createRe = function(name) {
|
||||
switch (name) {
|
||||
case 'drawTable':
|
||||
return this.makeRe('^', this.single.drawTable, '$');
|
||||
case 'html':
|
||||
return this.makeRe('^', this.single.html, '(?:', this.single.html, ')*', '$');
|
||||
case 'linkDefinition':
|
||||
return this.makeRe('^', this.single.linkDefinition, '$');
|
||||
case 'listLayout':
|
||||
return this.makeRe('^', this.single.list, this.pattern('allAttributes'), '*\\s+');
|
||||
case 'tableCellAttributes':
|
||||
return this.makeRe('^', this.choiceRe(this.single.tableCellAttributes,
|
||||
this.pattern('allAttributes')), '+\\.');
|
||||
case 'type':
|
||||
return this.makeRe('^', this.pattern('allTypes'));
|
||||
case 'typeLayout':
|
||||
return this.makeRe('^', this.pattern('allTypes'), this.pattern('allAttributes'),
|
||||
'*\\.\\.?', '(\\s+|$)');
|
||||
case 'attributes':
|
||||
return this.makeRe('^', this.pattern('allAttributes'), '+');
|
||||
|
||||
case 'allTypes':
|
||||
return this.choiceRe(this.single.div, this.single.foot,
|
||||
this.single.header, this.single.bc, this.single.bq,
|
||||
this.single.notextile, this.single.pre, this.single.table,
|
||||
this.single.para);
|
||||
|
||||
case 'allAttributes':
|
||||
return this.choiceRe(this.attributes.selector, this.attributes.css,
|
||||
this.attributes.lang, this.attributes.align, this.attributes.pad);
|
||||
|
||||
default:
|
||||
return this.makeRe('^', this.single[name]);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
RegExpFactory.prototype.makeRe = function() {
|
||||
var pattern = '',
|
||||
i,
|
||||
arg;
|
||||
|
||||
for (i = 0; i < arguments.length; ++i) {
|
||||
arg = arguments[i];
|
||||
pattern += (typeof arg === 'string') ? arg : arg.source;
|
||||
}
|
||||
return new RegExp(pattern);
|
||||
};
|
||||
|
||||
RegExpFactory.prototype.choiceRe = function() {
|
||||
var parts = [arguments[0]],
|
||||
i;
|
||||
|
||||
for (i = 1; i < arguments.length; ++i) {
|
||||
parts[i * 2 - 1] = '|';
|
||||
parts[i * 2] = arguments[i];
|
||||
}
|
||||
|
||||
parts.unshift('(?:');
|
||||
parts.push(')');
|
||||
return this.makeRe.apply(this, parts);
|
||||
};
|
||||
|
||||
|
||||
var Modes = {
|
||||
newLayout: function() {
|
||||
if (this.check('typeLayout')) {
|
||||
this.state.spanningLayout = false;
|
||||
return this.execMode(Modes.blockType);
|
||||
}
|
||||
if (!this.textileDisabled()) {
|
||||
if (this.check('listLayout')) {
|
||||
return this.execMode(Modes.list);
|
||||
} else if (this.check('drawTable')) {
|
||||
return this.execMode(Modes.table);
|
||||
} else if (this.check('linkDefinition')) {
|
||||
return this.execMode(Modes.linkDefinition);
|
||||
} else if (this.check('definitionList')) {
|
||||
return this.execMode(Modes.definitionList);
|
||||
} else if (this.check('html')) {
|
||||
return this.execMode(Modes.html);
|
||||
}
|
||||
}
|
||||
return this.execMode(Modes.text);
|
||||
},
|
||||
|
||||
blockType: function() {
|
||||
var match,
|
||||
type;
|
||||
this.state.layoutType = null;
|
||||
|
||||
if (match = this.eat('type')) {
|
||||
type = match[0];
|
||||
} else {
|
||||
return this.execMode(Modes.text);
|
||||
}
|
||||
|
||||
if(match = type.match(this.regExpFactory.pattern('header'))) {
|
||||
this.state.layoutType = 'header';
|
||||
this.state.header = parseInt(match[0][1]);
|
||||
} else if (type.match(this.regExpFactory.pattern('bq'))) {
|
||||
this.state.layoutType = 'quote';
|
||||
} else if (type.match(this.regExpFactory.pattern('bc'))) {
|
||||
this.state.layoutType = 'code';
|
||||
} else if (type.match(this.regExpFactory.pattern('foot'))) {
|
||||
this.state.layoutType = 'footnote';
|
||||
} else if (type.match(this.regExpFactory.pattern('notextile'))) {
|
||||
this.state.layoutType = 'notextile';
|
||||
} else if (type.match(this.regExpFactory.pattern('pre'))) {
|
||||
this.state.layoutType = 'pre';
|
||||
} else if (type.match(this.regExpFactory.pattern('div'))) {
|
||||
this.state.layoutType = 'div';
|
||||
} else if (type.match(this.regExpFactory.pattern('table'))) {
|
||||
this.state.layoutType = 'table';
|
||||
}
|
||||
|
||||
this.setModeForNextToken(Modes.attributes);
|
||||
return this.tokenStyles();
|
||||
},
|
||||
|
||||
text: function() {
|
||||
if (this.eat('text')) {
|
||||
return this.tokenStyles();
|
||||
}
|
||||
|
||||
var ch = this.stream.next();
|
||||
|
||||
if (ch === '"') {
|
||||
return this.execMode(Modes.link);
|
||||
}
|
||||
return this.handlePhraseModifier(ch);
|
||||
},
|
||||
|
||||
attributes: function() {
|
||||
this.setModeForNextToken(Modes.layoutLength);
|
||||
|
||||
if (this.eat('attributes')) {
|
||||
return this.tokenStylesWith(this.styleFor('attributes'));
|
||||
}
|
||||
return this.tokenStyles();
|
||||
},
|
||||
|
||||
layoutLength: function() {
|
||||
if (this.stream.eat('.') && this.stream.eat('.')) {
|
||||
this.state.spanningLayout = true;
|
||||
}
|
||||
|
||||
this.setModeForNextToken(Modes.text);
|
||||
return this.tokenStyles();
|
||||
},
|
||||
|
||||
list: function() {
|
||||
var match = this.eat('list'),
|
||||
listMod;
|
||||
this.state.listDepth = match[0].length;
|
||||
listMod = (this.state.listDepth - 1) % 3;
|
||||
if (!listMod) {
|
||||
this.state.layoutType = 'list1';
|
||||
} else if (listMod === 1) {
|
||||
this.state.layoutType = 'list2';
|
||||
} else {
|
||||
this.state.layoutType = 'list3';
|
||||
}
|
||||
this.setModeForNextToken(Modes.attributes);
|
||||
return this.tokenStyles();
|
||||
},
|
||||
|
||||
link: function() {
|
||||
this.setModeForNextToken(Modes.text);
|
||||
if (this.eat('link')) {
|
||||
this.stream.match(/\S+/);
|
||||
return this.tokenStylesWith(this.styleFor('link'));
|
||||
}
|
||||
return this.tokenStyles();
|
||||
},
|
||||
|
||||
linkDefinition: function() {
|
||||
this.stream.skipToEnd();
|
||||
return this.tokenStylesWith(this.styleFor('linkDefinition'));
|
||||
},
|
||||
|
||||
definitionList: function() {
|
||||
this.eat('definitionList');
|
||||
|
||||
this.state.layoutType = 'definitionList';
|
||||
|
||||
if (this.stream.match(/\s*$/)) {
|
||||
this.state.spanningLayout = true;
|
||||
} else {
|
||||
this.setModeForNextToken(Modes.attributes);
|
||||
}
|
||||
return this.tokenStyles();
|
||||
},
|
||||
|
||||
html: function() {
|
||||
this.stream.skipToEnd();
|
||||
return this.tokenStylesWith(this.styleFor('html'));
|
||||
},
|
||||
|
||||
table: function() {
|
||||
this.state.layoutType = 'table';
|
||||
return this.execMode(Modes.tableCell);
|
||||
},
|
||||
|
||||
tableCell: function() {
|
||||
if (this.eat('tableHeading')) {
|
||||
this.state.tableHeading = true;
|
||||
} else {
|
||||
this.stream.eat('|');
|
||||
}
|
||||
this.setModeForNextToken(Modes.tableCellAttributes);
|
||||
return this.tokenStyles();
|
||||
},
|
||||
|
||||
tableCellAttributes: function() {
|
||||
this.setModeForNextToken(Modes.tableText);
|
||||
|
||||
if (this.eat('tableCellAttributes')) {
|
||||
return this.tokenStylesWith(this.styleFor('attributes'));
|
||||
}
|
||||
return this.tokenStyles();
|
||||
},
|
||||
|
||||
tableText: function() {
|
||||
if (this.eat('tableText')) {
|
||||
return this.tokenStyles();
|
||||
}
|
||||
|
||||
if (this.stream.peek() === '|') { // end of cell
|
||||
this.setModeForNextToken(Modes.tableCell);
|
||||
return this.tokenStyles();
|
||||
}
|
||||
return this.handlePhraseModifier(this.stream.next());
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
CodeMirror.defineMode('textile', function() {
|
||||
var regExpFactory = new RegExpFactory();
|
||||
|
||||
return {
|
||||
startState: function() {
|
||||
return { mode: Modes.newLayout };
|
||||
},
|
||||
token: function(stream, state) {
|
||||
var parser = new Parser(regExpFactory, state, stream);
|
||||
if (stream.sol()) { parser.startNewLine(); }
|
||||
return parser.nextToken();
|
||||
},
|
||||
blankLine: function(state) {
|
||||
new Parser(regExpFactory, state).blankLine();
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
CodeMirror.defineMIME('text/x-textile', 'textile');
|
||||
});
|
||||
Reference in New Issue
Block a user