v0.1 基础版本

v0.1 基础版本
This commit is contained in:
何全
2019-03-02 12:02:55 +08:00
parent 16f25e8147
commit a059c74cb4
2331 changed files with 524759 additions and 2 deletions

View 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>

View 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]');
})();

View 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');
});