.
This commit is contained in:
191
root/res/editor.md/lib/codemirror/mode/textile/index.html
vendored
Normal file
191
root/res/editor.md/lib/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>
|
417
root/res/editor.md/lib/codemirror/mode/textile/test.js
vendored
Normal file
417
root/res/editor.md/lib/codemirror/mode/textile/test.js
vendored
Normal file
@@ -0,0 +1,417 @@
|
||||
// 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]');
|
||||
|
||||
/* Only toggling phrases between non-word chars. */
|
||||
|
||||
MT('phrase-in-word',
|
||||
'foo_bar_baz');
|
||||
|
||||
MT('phrase-non-word',
|
||||
'[negative -x-] aaa-bbb ccc-ddd [negative -eee-] fff [negative -ggg-]');
|
||||
|
||||
MT('phrase-lone-dash',
|
||||
'foo - bar - baz');
|
||||
})();
|
469
root/res/editor.md/lib/codemirror/mode/textile/textile.js
vendored
Normal file
469
root/res/editor.md/lib/codemirror/mode/textile/textile.js
vendored
Normal file
@@ -0,0 +1,469 @@
|
||||
// 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 startNewLine(stream, state) {
|
||||
state.mode = Modes.newLayout;
|
||||
state.tableHeading = false;
|
||||
|
||||
if (state.layoutType === "definitionList" && state.spanningLayout &&
|
||||
stream.match(RE("definitionListEnd"), false))
|
||||
state.spanningLayout = false;
|
||||
}
|
||||
|
||||
function handlePhraseModifier(stream, state, ch) {
|
||||
if (ch === "_") {
|
||||
if (stream.eat("_"))
|
||||
return togglePhraseModifier(stream, state, "italic", /__/, 2);
|
||||
else
|
||||
return togglePhraseModifier(stream, state, "em", /_/, 1);
|
||||
}
|
||||
|
||||
if (ch === "*") {
|
||||
if (stream.eat("*")) {
|
||||
return togglePhraseModifier(stream, state, "bold", /\*\*/, 2);
|
||||
}
|
||||
return togglePhraseModifier(stream, state, "strong", /\*/, 1);
|
||||
}
|
||||
|
||||
if (ch === "[") {
|
||||
if (stream.match(/\d+\]/)) state.footCite = true;
|
||||
return tokenStyles(state);
|
||||
}
|
||||
|
||||
if (ch === "(") {
|
||||
var spec = stream.match(/^(r|tm|c)\)/);
|
||||
if (spec)
|
||||
return tokenStylesWith(state, TOKEN_STYLES.specialChar);
|
||||
}
|
||||
|
||||
if (ch === "<" && stream.match(/(\w+)[^>]+>[^<]+<\/\1>/))
|
||||
return tokenStylesWith(state, TOKEN_STYLES.html);
|
||||
|
||||
if (ch === "?" && stream.eat("?"))
|
||||
return togglePhraseModifier(stream, state, "cite", /\?\?/, 2);
|
||||
|
||||
if (ch === "=" && stream.eat("="))
|
||||
return togglePhraseModifier(stream, state, "notextile", /==/, 2);
|
||||
|
||||
if (ch === "-" && !stream.eat("-"))
|
||||
return togglePhraseModifier(stream, state, "deletion", /-/, 1);
|
||||
|
||||
if (ch === "+")
|
||||
return togglePhraseModifier(stream, state, "addition", /\+/, 1);
|
||||
|
||||
if (ch === "~")
|
||||
return togglePhraseModifier(stream, state, "sub", /~/, 1);
|
||||
|
||||
if (ch === "^")
|
||||
return togglePhraseModifier(stream, state, "sup", /\^/, 1);
|
||||
|
||||
if (ch === "%")
|
||||
return togglePhraseModifier(stream, state, "span", /%/, 1);
|
||||
|
||||
if (ch === "@")
|
||||
return togglePhraseModifier(stream, state, "code", /@/, 1);
|
||||
|
||||
if (ch === "!") {
|
||||
var type = togglePhraseModifier(stream, state, "image", /(?:\([^\)]+\))?!/, 1);
|
||||
stream.match(/^:\S+/); // optional Url portion
|
||||
return type;
|
||||
}
|
||||
return tokenStyles(state);
|
||||
}
|
||||
|
||||
function togglePhraseModifier(stream, state, phraseModifier, closeRE, openSize) {
|
||||
var charBefore = stream.pos > openSize ? stream.string.charAt(stream.pos - openSize - 1) : null;
|
||||
var charAfter = stream.peek();
|
||||
if (state[phraseModifier]) {
|
||||
if ((!charAfter || /\W/.test(charAfter)) && charBefore && /\S/.test(charBefore)) {
|
||||
var type = tokenStyles(state);
|
||||
state[phraseModifier] = false;
|
||||
return type;
|
||||
}
|
||||
} else if ((!charBefore || /\W/.test(charBefore)) && charAfter && /\S/.test(charAfter) &&
|
||||
stream.match(new RegExp("^.*\\S" + closeRE.source + "(?:\\W|$)"), false)) {
|
||||
state[phraseModifier] = true;
|
||||
state.mode = Modes.attributes;
|
||||
}
|
||||
return tokenStyles(state);
|
||||
};
|
||||
|
||||
function tokenStyles(state) {
|
||||
var disabled = textileDisabled(state);
|
||||
if (disabled) return disabled;
|
||||
|
||||
var styles = [];
|
||||
if (state.layoutType) styles.push(TOKEN_STYLES[state.layoutType]);
|
||||
|
||||
styles = styles.concat(activeStyles(
|
||||
state, "addition", "bold", "cite", "code", "deletion", "em", "footCite",
|
||||
"image", "italic", "link", "span", "strong", "sub", "sup", "table", "tableHeading"));
|
||||
|
||||
if (state.layoutType === "header")
|
||||
styles.push(TOKEN_STYLES.header + "-" + state.header);
|
||||
|
||||
return styles.length ? styles.join(" ") : null;
|
||||
}
|
||||
|
||||
function textileDisabled(state) {
|
||||
var type = state.layoutType;
|
||||
|
||||
switch(type) {
|
||||
case "notextile":
|
||||
case "code":
|
||||
case "pre":
|
||||
return TOKEN_STYLES[type];
|
||||
default:
|
||||
if (state.notextile)
|
||||
return TOKEN_STYLES.notextile + (type ? (" " + TOKEN_STYLES[type]) : "");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function tokenStylesWith(state, extraStyles) {
|
||||
var disabled = textileDisabled(state);
|
||||
if (disabled) return disabled;
|
||||
|
||||
var type = tokenStyles(state);
|
||||
if (extraStyles)
|
||||
return type ? (type + " " + extraStyles) : extraStyles;
|
||||
else
|
||||
return type;
|
||||
}
|
||||
|
||||
function activeStyles(state) {
|
||||
var styles = [];
|
||||
for (var i = 1; i < arguments.length; ++i) {
|
||||
if (state[arguments[i]])
|
||||
styles.push(TOKEN_STYLES[arguments[i]]);
|
||||
}
|
||||
return styles;
|
||||
}
|
||||
|
||||
function blankLine(state) {
|
||||
var spanningLayout = state.spanningLayout, type = state.layoutType;
|
||||
|
||||
for (var key in state) if (state.hasOwnProperty(key))
|
||||
delete state[key];
|
||||
|
||||
state.mode = Modes.newLayout;
|
||||
if (spanningLayout) {
|
||||
state.layoutType = type;
|
||||
state.spanningLayout = true;
|
||||
}
|
||||
}
|
||||
|
||||
var REs = {
|
||||
cache: {},
|
||||
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: /[^!"_=\*\[\(<\?\+~\^%@-]+/
|
||||
},
|
||||
attributes: {
|
||||
align: /(?:<>|<|>|=)/,
|
||||
selector: /\([^\(][^\)]+\)/,
|
||||
lang: /\[[^\[\]]+\]/,
|
||||
pad: /(?:\(+|\)+){1,2}/,
|
||||
css: /\{[^\}]+\}/
|
||||
},
|
||||
createRe: function(name) {
|
||||
switch (name) {
|
||||
case "drawTable":
|
||||
return REs.makeRe("^", REs.single.drawTable, "$");
|
||||
case "html":
|
||||
return REs.makeRe("^", REs.single.html, "(?:", REs.single.html, ")*", "$");
|
||||
case "linkDefinition":
|
||||
return REs.makeRe("^", REs.single.linkDefinition, "$");
|
||||
case "listLayout":
|
||||
return REs.makeRe("^", REs.single.list, RE("allAttributes"), "*\\s+");
|
||||
case "tableCellAttributes":
|
||||
return REs.makeRe("^", REs.choiceRe(REs.single.tableCellAttributes,
|
||||
RE("allAttributes")), "+\\.");
|
||||
case "type":
|
||||
return REs.makeRe("^", RE("allTypes"));
|
||||
case "typeLayout":
|
||||
return REs.makeRe("^", RE("allTypes"), RE("allAttributes"),
|
||||
"*\\.\\.?", "(\\s+|$)");
|
||||
case "attributes":
|
||||
return REs.makeRe("^", RE("allAttributes"), "+");
|
||||
|
||||
case "allTypes":
|
||||
return REs.choiceRe(REs.single.div, REs.single.foot,
|
||||
REs.single.header, REs.single.bc, REs.single.bq,
|
||||
REs.single.notextile, REs.single.pre, REs.single.table,
|
||||
REs.single.para);
|
||||
|
||||
case "allAttributes":
|
||||
return REs.choiceRe(REs.attributes.selector, REs.attributes.css,
|
||||
REs.attributes.lang, REs.attributes.align, REs.attributes.pad);
|
||||
|
||||
default:
|
||||
return REs.makeRe("^", REs.single[name]);
|
||||
}
|
||||
},
|
||||
makeRe: function() {
|
||||
var pattern = "";
|
||||
for (var i = 0; i < arguments.length; ++i) {
|
||||
var arg = arguments[i];
|
||||
pattern += (typeof arg === "string") ? arg : arg.source;
|
||||
}
|
||||
return new RegExp(pattern);
|
||||
},
|
||||
choiceRe: function() {
|
||||
var parts = [arguments[0]];
|
||||
for (var i = 1; i < arguments.length; ++i) {
|
||||
parts[i * 2 - 1] = "|";
|
||||
parts[i * 2] = arguments[i];
|
||||
}
|
||||
|
||||
parts.unshift("(?:");
|
||||
parts.push(")");
|
||||
return REs.makeRe.apply(null, parts);
|
||||
}
|
||||
};
|
||||
|
||||
function RE(name) {
|
||||
return (REs.cache[name] || (REs.cache[name] = REs.createRe(name)));
|
||||
}
|
||||
|
||||
var Modes = {
|
||||
newLayout: function(stream, state) {
|
||||
if (stream.match(RE("typeLayout"), false)) {
|
||||
state.spanningLayout = false;
|
||||
return (state.mode = Modes.blockType)(stream, state);
|
||||
}
|
||||
var newMode;
|
||||
if (!textileDisabled(state)) {
|
||||
if (stream.match(RE("listLayout"), false))
|
||||
newMode = Modes.list;
|
||||
else if (stream.match(RE("drawTable"), false))
|
||||
newMode = Modes.table;
|
||||
else if (stream.match(RE("linkDefinition"), false))
|
||||
newMode = Modes.linkDefinition;
|
||||
else if (stream.match(RE("definitionList")))
|
||||
newMode = Modes.definitionList;
|
||||
else if (stream.match(RE("html"), false))
|
||||
newMode = Modes.html;
|
||||
}
|
||||
return (state.mode = (newMode || Modes.text))(stream, state);
|
||||
},
|
||||
|
||||
blockType: function(stream, state) {
|
||||
var match, type;
|
||||
state.layoutType = null;
|
||||
|
||||
if (match = stream.match(RE("type")))
|
||||
type = match[0];
|
||||
else
|
||||
return (state.mode = Modes.text)(stream, state);
|
||||
|
||||
if (match = type.match(RE("header"))) {
|
||||
state.layoutType = "header";
|
||||
state.header = parseInt(match[0][1]);
|
||||
} else if (type.match(RE("bq"))) {
|
||||
state.layoutType = "quote";
|
||||
} else if (type.match(RE("bc"))) {
|
||||
state.layoutType = "code";
|
||||
} else if (type.match(RE("foot"))) {
|
||||
state.layoutType = "footnote";
|
||||
} else if (type.match(RE("notextile"))) {
|
||||
state.layoutType = "notextile";
|
||||
} else if (type.match(RE("pre"))) {
|
||||
state.layoutType = "pre";
|
||||
} else if (type.match(RE("div"))) {
|
||||
state.layoutType = "div";
|
||||
} else if (type.match(RE("table"))) {
|
||||
state.layoutType = "table";
|
||||
}
|
||||
|
||||
state.mode = Modes.attributes;
|
||||
return tokenStyles(state);
|
||||
},
|
||||
|
||||
text: function(stream, state) {
|
||||
if (stream.match(RE("text"))) return tokenStyles(state);
|
||||
|
||||
var ch = stream.next();
|
||||
if (ch === '"')
|
||||
return (state.mode = Modes.link)(stream, state);
|
||||
return handlePhraseModifier(stream, state, ch);
|
||||
},
|
||||
|
||||
attributes: function(stream, state) {
|
||||
state.mode = Modes.layoutLength;
|
||||
|
||||
if (stream.match(RE("attributes")))
|
||||
return tokenStylesWith(state, TOKEN_STYLES.attributes);
|
||||
else
|
||||
return tokenStyles(state);
|
||||
},
|
||||
|
||||
layoutLength: function(stream, state) {
|
||||
if (stream.eat(".") && stream.eat("."))
|
||||
state.spanningLayout = true;
|
||||
|
||||
state.mode = Modes.text;
|
||||
return tokenStyles(state);
|
||||
},
|
||||
|
||||
list: function(stream, state) {
|
||||
var match = stream.match(RE("list"));
|
||||
state.listDepth = match[0].length;
|
||||
var listMod = (state.listDepth - 1) % 3;
|
||||
if (!listMod)
|
||||
state.layoutType = "list1";
|
||||
else if (listMod === 1)
|
||||
state.layoutType = "list2";
|
||||
else
|
||||
state.layoutType = "list3";
|
||||
|
||||
state.mode = Modes.attributes;
|
||||
return tokenStyles(state);
|
||||
},
|
||||
|
||||
link: function(stream, state) {
|
||||
state.mode = Modes.text;
|
||||
if (stream.match(RE("link"))) {
|
||||
stream.match(/\S+/);
|
||||
return tokenStylesWith(state, TOKEN_STYLES.link);
|
||||
}
|
||||
return tokenStyles(state);
|
||||
},
|
||||
|
||||
linkDefinition: function(stream, state) {
|
||||
stream.skipToEnd();
|
||||
return tokenStylesWith(state, TOKEN_STYLES.linkDefinition);
|
||||
},
|
||||
|
||||
definitionList: function(stream, state) {
|
||||
stream.match(RE("definitionList"));
|
||||
|
||||
state.layoutType = "definitionList";
|
||||
|
||||
if (stream.match(/\s*$/))
|
||||
state.spanningLayout = true;
|
||||
else
|
||||
state.mode = Modes.attributes;
|
||||
|
||||
return tokenStyles(state);
|
||||
},
|
||||
|
||||
html: function(stream, state) {
|
||||
stream.skipToEnd();
|
||||
return tokenStylesWith(state, TOKEN_STYLES.html);
|
||||
},
|
||||
|
||||
table: function(stream, state) {
|
||||
state.layoutType = "table";
|
||||
return (state.mode = Modes.tableCell)(stream, state);
|
||||
},
|
||||
|
||||
tableCell: function(stream, state) {
|
||||
if (stream.match(RE("tableHeading")))
|
||||
state.tableHeading = true;
|
||||
else
|
||||
stream.eat("|");
|
||||
|
||||
state.mode = Modes.tableCellAttributes;
|
||||
return tokenStyles(state);
|
||||
},
|
||||
|
||||
tableCellAttributes: function(stream, state) {
|
||||
state.mode = Modes.tableText;
|
||||
|
||||
if (stream.match(RE("tableCellAttributes")))
|
||||
return tokenStylesWith(state, TOKEN_STYLES.attributes);
|
||||
else
|
||||
return tokenStyles(state);
|
||||
},
|
||||
|
||||
tableText: function(stream, state) {
|
||||
if (stream.match(RE("tableText")))
|
||||
return tokenStyles(state);
|
||||
|
||||
if (stream.peek() === "|") { // end of cell
|
||||
state.mode = Modes.tableCell;
|
||||
return tokenStyles(state);
|
||||
}
|
||||
return handlePhraseModifier(stream, state, stream.next());
|
||||
}
|
||||
};
|
||||
|
||||
CodeMirror.defineMode("textile", function() {
|
||||
return {
|
||||
startState: function() {
|
||||
return { mode: Modes.newLayout };
|
||||
},
|
||||
token: function(stream, state) {
|
||||
if (stream.sol()) startNewLine(stream, state);
|
||||
return state.mode(stream, state);
|
||||
},
|
||||
blankLine: blankLine
|
||||
};
|
||||
});
|
||||
|
||||
CodeMirror.defineMIME("text/x-textile", "textile");
|
||||
});
|
Reference in New Issue
Block a user