Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 243633365e | |||
| dc7e18b97b | |||
| d3c553c945 | |||
| 05fc15d164 | |||
| da8af696c5 | |||
| 12f5df33da | |||
| f184276ef8 | |||
| c72ab927a6 | |||
| 7bc2375a77 | |||
| 392fbb836f | |||
| 0cb8603c80 | |||
| 20fc02053a | |||
| e389dc39a7 | |||
| fbd4669da8 | |||
| 51769847ad | |||
| 918e7ad682 |
@@ -56,7 +56,7 @@ namespace Umbraco.Core.Configuration
|
||||
#region Private static fields
|
||||
|
||||
// CURRENT UMBRACO VERSION ID
|
||||
private const string CurrentUmbracoVersion = "4.9.0";
|
||||
private const string CurrentUmbracoVersion = "4.9.1";
|
||||
|
||||
private static string _reservedUrlsCache;
|
||||
private static string _reservedPathsCache;
|
||||
|
||||
@@ -349,6 +349,8 @@
|
||||
<Content Include="umbraco\images\thumbs_lrg.png" />
|
||||
<Content Include="umbraco\images\thumbs_med.png" />
|
||||
<Content Include="umbraco\images\thumbs_smll.png" />
|
||||
<Content Include="umbraco\LiveEditing\Modules\ItemEditing\ItemEditing.js" />
|
||||
<Content Include="umbraco\LiveEditing\Modules\ItemEditing\ItemEditingInvoke.js" />
|
||||
<Content Include="umbraco\plugins\uGoLive\cog.png" />
|
||||
<Content Include="umbraco\plugins\uGoLive\cross.png" />
|
||||
<Content Include="umbraco\plugins\uGoLive\Dashboard.ascx" />
|
||||
@@ -384,11 +386,13 @@
|
||||
<Content Include="umbraco_client\CodeMirror\js\lib\util\pig-hint.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\lib\util\razor-hint.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\lib\util\razor-hints.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\lib\util\runmode-standalone.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\lib\util\runmode.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\lib\util\search.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\lib\util\searchcursor.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\lib\util\simple-hint.css" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\lib\util\simple-hint-customized.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\lib\util\simple-hint.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\lib\util\xml-hint.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\clike\clike.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\clike\index.html" />
|
||||
@@ -397,8 +401,11 @@
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\clojure\index.html" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\coffeescript\coffeescript.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\coffeescript\index.html" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\commonlisp\commonlisp.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\commonlisp\index.html" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\css\css.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\css\index.html" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\css\test.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\diff\diff.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\diff\index.html" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\ecl\ecl.js" />
|
||||
@@ -429,6 +436,7 @@
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\lua\lua.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\markdown\index.html" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\markdown\markdown.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\markdown\test.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\mysql\index.html" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\mysql\mysql.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\ntriples\index.html" />
|
||||
@@ -469,6 +477,8 @@
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\scheme\scheme.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\shell\index.html" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\shell\shell.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\sieve\index.html" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\sieve\sieve.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\smalltalk\index.html" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\smalltalk\smalltalk.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\smarty\index.html" />
|
||||
@@ -478,6 +488,7 @@
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\stex\index.html" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\stex\stex.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\stex\test.html" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\stex\test.js" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\tiddlywiki\index.html" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\tiddlywiki\tiddlywiki.css" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\tiddlywiki\tiddlywiki.js" />
|
||||
@@ -532,6 +543,7 @@
|
||||
<Content Include="umbraco_client\Installer\images\btn-buisness-repeat.png" />
|
||||
<Content Include="umbraco_client\Installer\images\btn-confirm.png" />
|
||||
<Content Include="umbraco_client\Installer\images\pbar.gif" />
|
||||
<Content Include="umbraco_client\splitbutton\jquery.splitbutton.js" />
|
||||
<Content Include="umbraco_client\tags\css\jquery.tagsinput.css" />
|
||||
<Content Include="umbraco_client\tags\js\jquery.tagsinput.js" />
|
||||
<Content Include="umbraco_client\tags\js\jquery.tagsinput.min.js">
|
||||
@@ -926,7 +938,6 @@
|
||||
<Content Include="umbraco\images\editor\insRazorMacro.png" />
|
||||
<Content Include="umbraco_client\Application\JQuery\jquery.hotkeys.js" />
|
||||
<Content Include="umbraco_client\MaskedInput\jquery.maskedinput-1.3.min.js" />
|
||||
<Content Include="umbraco_client\splitbutton\jquery.splitbutton.js" />
|
||||
<Content Include="umbraco_client\splitbutton\images\splitbutton_hover.png" />
|
||||
<Content Include="umbraco_client\splitbutton\images\splitbutton_downarrow.png" />
|
||||
<Content Include="umbraco_client\splitbutton\splitbutton.css" />
|
||||
@@ -1465,6 +1476,7 @@
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\razor\LICENSE" />
|
||||
<None Include="umbraco_client\CodeMirror\js\mode\ruby\LICENSE" />
|
||||
<None Include="umbraco_client\CodeMirror\js\mode\r\LICENSE" />
|
||||
<Content Include="umbraco_client\CodeMirror\js\mode\sieve\LICENSE" />
|
||||
<None Include="umbraco_client\CodeMirror\js\mode\xquery\LICENSE" />
|
||||
<None Include="web.Template.Debug.config">
|
||||
<DependentUpon>Web.Template.config</DependentUpon>
|
||||
|
||||
@@ -4,15 +4,60 @@
|
||||
<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %>
|
||||
<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %>
|
||||
<asp:Content ContentPlaceHolderID="head" runat="server">
|
||||
|
||||
<umb:CssInclude ID="CssInclude1" runat="server" FilePath="splitbutton/splitbutton.css"
|
||||
PathNameAlias="UmbracoClient" />
|
||||
<umb:JsInclude ID="JsInclude" runat="server" FilePath="splitbutton/jquery.splitbutton.js"
|
||||
PathNameAlias="UmbracoClient" Priority="1" />
|
||||
|
||||
<style>
|
||||
|
||||
#codeTemplateMenu , #macroMenu
|
||||
{
|
||||
position: absolute;
|
||||
top: 60px;
|
||||
left:250px;
|
||||
background-color: #ddd;
|
||||
padding: 5px;
|
||||
display: none;
|
||||
max-height: 400px;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
#macroMenu {
|
||||
left:110px;
|
||||
}
|
||||
.codeTemplate, .macro {
|
||||
padding-left: 5px;
|
||||
padding-top: 3px;
|
||||
cursor: pointer;
|
||||
|
||||
}
|
||||
.codeTemplate:hover, .macro:hover {
|
||||
background-color: #eee;
|
||||
}
|
||||
</style>
|
||||
<script language="javascript" type="text/javascript">
|
||||
jQuery(document).ready(function() {
|
||||
//macro split button
|
||||
jQuery('#sbMacro').splitbutton({menu:'#macroMenu'});
|
||||
|
||||
jQuery("#splitButtonMacro").appendTo("#splitButtonMacroPlaceHolder");
|
||||
jQuery("#selectMacro")
|
||||
.click(function() {
|
||||
jQuery("#macroMenu").toggle();
|
||||
});
|
||||
jQuery("#macroMenu").hover(
|
||||
function() { jQuery("#macroMenu").show(); },
|
||||
function() { jQuery("#macroMenu").hide(); }
|
||||
);
|
||||
jQuery("#selectRazor")
|
||||
.click(function() {
|
||||
jQuery("#codeTemplateMenu").toggle();
|
||||
});
|
||||
jQuery("#codeTemplateMenu").hover(
|
||||
function() { jQuery("#codeTemplateMenu").show(); },
|
||||
function() { jQuery("#codeTemplateMenu").hide(); }
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
jQuery(".macro").click(function(){
|
||||
var alias = jQuery(this).attr("rel");
|
||||
if(jQuery(this).attr("params") == "1")
|
||||
@@ -24,10 +69,10 @@
|
||||
insertMacro(alias);
|
||||
}
|
||||
});
|
||||
applySplitButtonOverflow('mcontainer','innerc','macroMenu','.macro', 'showMoreMacros');
|
||||
|
||||
|
||||
//razor macro split button
|
||||
jQuery('#sb').splitbutton({menu:'#codeTemplateMenu'});
|
||||
// jQuery('#sb').splitbutton({menu:'#codeTemplateMenu'});
|
||||
jQuery("#splitButton").appendTo("#splitButtonPlaceHolder");
|
||||
|
||||
jQuery(".codeTemplate").click(function(){
|
||||
@@ -185,12 +230,12 @@
|
||||
</cc1:PropertyPanel>
|
||||
</cc1:Pane>
|
||||
</cc1:UmbracoPanel>
|
||||
|
||||
<div id="splitButton" style="display: inline; height: 23px; vertical-align: top;">
|
||||
<a href="javascript:insertCodeBlock();" id="sb" class="sbLink">
|
||||
<img alt="Insert Inline Razor Macro" src="../images/editor/insRazorMacro.png" title="Insert Inline Razor Macro"
|
||||
style="vertical-align: top;">
|
||||
</a>
|
||||
<a href="#" id="sb" class="sbLink l-btn l-btn-plain"><span class="l-btn-left"><span class="l-btn-text"><img alt="Insert Inline Razor Macro" src="../images/editor/insRazorMacro.png" title="Insert Inline Razor Macro" style="vertical-align: top;" onclick="javascript:insertCodeBlock();">
|
||||
<span class="s-btn-downarrow" id="selectRazor"> </span></span></span></a>
|
||||
</div>
|
||||
|
||||
<div id="codeTemplateMenu" style="width: 285px;">
|
||||
<asp:Repeater ID="rpt_codeTemplates" runat="server">
|
||||
<ItemTemplate>
|
||||
@@ -200,11 +245,10 @@
|
||||
</ItemTemplate>
|
||||
</asp:Repeater>
|
||||
</div>
|
||||
|
||||
<div id="splitButtonMacro" style="display: inline; height: 23px; vertical-align: top;">
|
||||
<a href="javascript:openMacroModal();" id="sbMacro" class="sbLink">
|
||||
<img alt="Insert Macro" src="../images/editor/insMacroSB.png" title="Insert Macro"
|
||||
style="vertical-align: top;">
|
||||
</a>
|
||||
<a href="#" id="sbMacro" class="sbLink l-btn l-btn-plain"><span class="l-btn-left"><span class="l-btn-text"><img alt="Insert Macro" src="../images/editor/insMacroSB.png" title="Insert Macro" style="vertical-align: top;" onclick="javascript:openMacroModal();">
|
||||
<span class="s-btn-downarrow" id="selectMacro"> </span></span></span></a>
|
||||
</div>
|
||||
<div id="macroMenu" style="width: 285px">
|
||||
<asp:Repeater ID="rpt_macros" runat="server">
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
body
|
||||
{
|
||||
font-size:12px;
|
||||
font-family:monospace;
|
||||
line-height:16px;
|
||||
.CodeMirror, .CodeMirror-scroll {
|
||||
height: 100%;
|
||||
}
|
||||
@@ -1,20 +1,16 @@
|
||||
.CodeMirror {
|
||||
line-height: 1em;
|
||||
font-family: Consolas, monospace;
|
||||
font-family: monospace;
|
||||
|
||||
/* Necessary so the scrollbar can be absolutely positioned within the wrapper on Lion. */
|
||||
position: relative;
|
||||
/* This prevents unwanted scrollbars from showing up on the body and wrapper in IE. */
|
||||
overflow: hidden;
|
||||
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.CodeMirror-scroll {
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
height: 300px;
|
||||
/* This is needed to prevent an IE[67] bug where the scrolled content
|
||||
is visible outside of the scrolling box. */
|
||||
position: relative;
|
||||
@@ -23,13 +19,11 @@
|
||||
|
||||
/* Vertical scrollbar */
|
||||
.CodeMirror-scrollbar {
|
||||
float: right;
|
||||
position: absolute;
|
||||
right: 0; top: 0;
|
||||
overflow-x: hidden;
|
||||
overflow-y: scroll;
|
||||
|
||||
/* This corrects for the 1px gap introduced to the left of the scrollbar
|
||||
by the rule for .CodeMirror-scrollbar-inner. */
|
||||
margin-left: -1px;
|
||||
z-index: 5;
|
||||
}
|
||||
.CodeMirror-scrollbar-inner {
|
||||
/* This needs to have a nonzero width in order for the scrollbar to appear
|
||||
@@ -72,10 +66,6 @@
|
||||
white-space: pre;
|
||||
cursor: text;
|
||||
}
|
||||
.CodeMirror-lines * {
|
||||
/* Necessary for throw-scrolling to decelerate properly on Safari. */
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.CodeMirror pre {
|
||||
-moz-border-radius: 0;
|
||||
@@ -155,7 +145,7 @@ div.CodeMirror-selected { background: #d9d9d9; }
|
||||
.cm-s-default span.cm-error {color: #f00;}
|
||||
.cm-s-default span.cm-qualifier {color: #555;}
|
||||
.cm-s-default span.cm-builtin {color: #30a;}
|
||||
.cm-s-default span.cm-bracket {color: #cc7;}
|
||||
.cm-s-default span.cm-bracket {color: #997;}
|
||||
.cm-s-default span.cm-tag {color: #170;}
|
||||
.cm-s-default span.cm-attribute {color: #00c;}
|
||||
.cm-s-default span.cm-header {color: blue;}
|
||||
@@ -168,5 +158,16 @@ span.cm-em {font-style: italic;}
|
||||
span.cm-emstrong {font-style: italic; font-weight: bold;}
|
||||
span.cm-link {text-decoration: underline;}
|
||||
|
||||
span.cm-invalidchar {color: #f00;}
|
||||
|
||||
div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
|
||||
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
|
||||
|
||||
@media print {
|
||||
|
||||
/* Hide the cursor when printing */
|
||||
.CodeMirror pre.CodeMirror-cursor {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -26,6 +26,11 @@
|
||||
/** Array of tag names where an end tag is forbidden. */
|
||||
CodeMirror.defaults['closeTagVoid'] = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr'];
|
||||
|
||||
function innerState(cm, state) {
|
||||
return CodeMirror.innerMode(cm.getMode(), state).state;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Call during key processing to close tags. Handles the key event if the tag is closed, otherwise throws CodeMirror.Pass.
|
||||
* - cm: The editor instance.
|
||||
@@ -39,40 +44,34 @@
|
||||
throw CodeMirror.Pass;
|
||||
}
|
||||
|
||||
var mode = cm.getOption('mode');
|
||||
/*
|
||||
* Relevant structure of token:
|
||||
*
|
||||
* htmlmixed
|
||||
* className
|
||||
* state
|
||||
* htmlState
|
||||
* type
|
||||
* tagName
|
||||
* context
|
||||
* tagName
|
||||
* mode
|
||||
*
|
||||
* xml
|
||||
* className
|
||||
* state
|
||||
* tagName
|
||||
* type
|
||||
*/
|
||||
|
||||
if (mode == 'text/html' || mode == 'xml') {
|
||||
|
||||
/*
|
||||
* Relevant structure of token:
|
||||
*
|
||||
* htmlmixed
|
||||
* className
|
||||
* state
|
||||
* htmlState
|
||||
* type
|
||||
* tagName
|
||||
* context
|
||||
* tagName
|
||||
* mode
|
||||
*
|
||||
* xml
|
||||
* className
|
||||
* state
|
||||
* tagName
|
||||
* type
|
||||
*/
|
||||
|
||||
var pos = cm.getCursor();
|
||||
var tok = cm.getTokenAt(pos);
|
||||
var state = tok.state;
|
||||
|
||||
if (state.mode && state.mode != 'html') {
|
||||
throw CodeMirror.Pass; // With htmlmixed, we only care about the html sub-mode.
|
||||
}
|
||||
var pos = cm.getCursor();
|
||||
var tok = cm.getTokenAt(pos);
|
||||
var state = innerState(cm, tok.state);
|
||||
|
||||
if (state) {
|
||||
|
||||
if (ch == '>') {
|
||||
var type = state.htmlState ? state.htmlState.type : state.type; // htmlmixed : xml
|
||||
var type = state.type;
|
||||
|
||||
if (tok.className == 'tag' && type == 'closeTag') {
|
||||
throw CodeMirror.Pass; // Don't process the '>' at the end of an end-tag.
|
||||
@@ -83,11 +82,12 @@
|
||||
cm.setCursor(pos);
|
||||
|
||||
tok = cm.getTokenAt(cm.getCursor());
|
||||
state = tok.state;
|
||||
type = state.htmlState ? state.htmlState.type : state.type; // htmlmixed : xml
|
||||
state = innerState(cm, tok.state);
|
||||
if (!state) throw CodeMirror.Pass;
|
||||
var type = state.type;
|
||||
|
||||
if (tok.className == 'tag' && type != 'selfcloseTag') {
|
||||
var tagName = state.htmlState ? state.htmlState.tagName : state.tagName; // htmlmixed : xml
|
||||
var tagName = state.tagName;
|
||||
if (tagName.length > 0 && shouldClose(cm, vd, tagName)) {
|
||||
insertEndTag(cm, indent, pos, tagName);
|
||||
}
|
||||
@@ -100,7 +100,7 @@
|
||||
|
||||
} else if (ch == '/') {
|
||||
if (tok.className == 'tag' && tok.string == '<') {
|
||||
var tagName = state.htmlState ? (state.htmlState.context ? state.htmlState.context.tagName : '') : (state.context ? state.context.tagName : ''); // htmlmixed : xml
|
||||
var ctx = state.context, tagName = ctx ? ctx.tagName : '';
|
||||
if (tagName.length > 0) {
|
||||
completeEndTag(cm, pos, tagName);
|
||||
return;
|
||||
|
||||
@@ -30,7 +30,10 @@
|
||||
inp.focus();
|
||||
CodeMirror.connect(inp, "blur", close);
|
||||
} else if (button = dialog.getElementsByTagName("button")[0]) {
|
||||
CodeMirror.connect(button, "click", close);
|
||||
CodeMirror.connect(button, "click", function() {
|
||||
close();
|
||||
me.focus();
|
||||
});
|
||||
button.focus();
|
||||
CodeMirror.connect(button, "blur", close);
|
||||
}
|
||||
|
||||
@@ -1,110 +1,22 @@
|
||||
// ============== Formatting extensions ============================
|
||||
// A common storage for all mode-specific formatting features
|
||||
if (!CodeMirror.modeExtensions) CodeMirror.modeExtensions = {};
|
||||
|
||||
// Returns the extension of the editor's current mode
|
||||
CodeMirror.defineExtension("getModeExt", function () {
|
||||
var mname = CodeMirror.resolveMode(this.getOption("mode")).name;
|
||||
var ext = CodeMirror.modeExtensions[mname];
|
||||
if (!ext) throw new Error("No extensions found for mode " + mname);
|
||||
return ext;
|
||||
});
|
||||
|
||||
// If the current mode is 'htmlmixed', returns the extension of a mode located at
|
||||
// the specified position (can be htmlmixed, css or javascript). Otherwise, simply
|
||||
// returns the extension of the editor's current mode.
|
||||
CodeMirror.defineExtension("getModeExtAtPos", function (pos) {
|
||||
var token = this.getTokenAt(pos);
|
||||
if (token && token.state && token.state.mode)
|
||||
return CodeMirror.modeExtensions[token.state.mode == "html" ? "htmlmixed" : token.state.mode];
|
||||
else
|
||||
return this.getModeExt();
|
||||
});
|
||||
|
||||
// Comment/uncomment the specified range
|
||||
CodeMirror.defineExtension("commentRange", function (isComment, from, to) {
|
||||
var curMode = this.getModeExtAtPos(this.getCursor());
|
||||
if (isComment) { // Comment range
|
||||
var commentedText = this.getRange(from, to);
|
||||
this.replaceRange(curMode.commentStart + this.getRange(from, to) + curMode.commentEnd
|
||||
, from, to);
|
||||
if (from.line == to.line && from.ch == to.ch) { // An empty comment inserted - put cursor inside
|
||||
this.setCursor(from.line, from.ch + curMode.commentStart.length);
|
||||
}
|
||||
}
|
||||
else { // Uncomment range
|
||||
var selText = this.getRange(from, to);
|
||||
var startIndex = selText.indexOf(curMode.commentStart);
|
||||
var endIndex = selText.lastIndexOf(curMode.commentEnd);
|
||||
if (startIndex > -1 && endIndex > -1 && endIndex > startIndex) {
|
||||
// Take string till comment start
|
||||
selText = selText.substr(0, startIndex)
|
||||
// From comment start till comment end
|
||||
+ selText.substring(startIndex + curMode.commentStart.length, endIndex)
|
||||
// From comment end till string end
|
||||
+ selText.substr(endIndex + curMode.commentEnd.length);
|
||||
}
|
||||
this.replaceRange(selText, from, to);
|
||||
}
|
||||
});
|
||||
|
||||
// Applies automatic mode-aware indentation to the specified range
|
||||
CodeMirror.defineExtension("autoIndentRange", function (from, to) {
|
||||
var cmInstance = this;
|
||||
this.operation(function () {
|
||||
for (var i = from.line; i <= to.line; i++) {
|
||||
cmInstance.indentLine(i, "smart");
|
||||
(function() {
|
||||
// Define extensions for a few modes
|
||||
CodeMirror.extendMode("css", {
|
||||
commentStart: "/*",
|
||||
commentEnd: "*/",
|
||||
wordWrapChars: [";", "\\{", "\\}"],
|
||||
autoFormatLineBreaks: function (text) {
|
||||
return text.replace(new RegExp("(;|\\{|\\})([^\r\n])", "g"), "$1\n$2");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Applies automatic formatting to the specified range
|
||||
CodeMirror.defineExtension("autoFormatRange", function (from, to) {
|
||||
var absStart = this.indexFromPos(from);
|
||||
var absEnd = this.indexFromPos(to);
|
||||
// Insert additional line breaks where necessary according to the
|
||||
// mode's syntax
|
||||
var res = this.getModeExt().autoFormatLineBreaks(this.getValue(), absStart, absEnd);
|
||||
var cmInstance = this;
|
||||
|
||||
// Replace and auto-indent the range
|
||||
this.operation(function () {
|
||||
cmInstance.replaceRange(res, from, to);
|
||||
var startLine = cmInstance.posFromIndex(absStart).line;
|
||||
var endLine = cmInstance.posFromIndex(absStart + res.length).line;
|
||||
for (var i = startLine; i <= endLine; i++) {
|
||||
cmInstance.indentLine(i, "smart");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Define extensions for a few modes
|
||||
|
||||
CodeMirror.modeExtensions["css"] = {
|
||||
commentStart: "/*",
|
||||
commentEnd: "*/",
|
||||
wordWrapChars: [";", "\\{", "\\}"],
|
||||
autoFormatLineBreaks: function (text, startPos, endPos) {
|
||||
text = text.substring(startPos, endPos);
|
||||
return text.replace(new RegExp("(;|\\{|\\})([^\r\n])", "g"), "$1\n$2");
|
||||
}
|
||||
};
|
||||
|
||||
CodeMirror.modeExtensions["javascript"] = {
|
||||
commentStart: "/*",
|
||||
commentEnd: "*/",
|
||||
wordWrapChars: [";", "\\{", "\\}"],
|
||||
|
||||
getNonBreakableBlocks: function (text) {
|
||||
var nonBreakableRegexes = [
|
||||
new RegExp("for\\s*?\\(([\\s\\S]*?)\\)"),
|
||||
new RegExp("\\\\\"([\\s\\S]*?)(\\\\\"|$)"),
|
||||
new RegExp("\\\\\'([\\s\\S]*?)(\\\\\'|$)"),
|
||||
new RegExp("'([\\s\\S]*?)('|$)"),
|
||||
new RegExp("\"([\\s\\S]*?)(\"|$)"),
|
||||
new RegExp("//.*([\r\n]|$)")
|
||||
];
|
||||
var nonBreakableBlocks = new Array();
|
||||
function jsNonBreakableBlocks(text) {
|
||||
var nonBreakableRegexes = [/for\s*?\((.*?)\)/,
|
||||
/\"(.*?)(\"|$)/,
|
||||
/\'(.*?)(\'|$)/,
|
||||
/\/\*(.*?)(\*\/|$)/,
|
||||
/\/\/.*/];
|
||||
var nonBreakableBlocks = [];
|
||||
for (var i = 0; i < nonBreakableRegexes.length; i++) {
|
||||
var curPos = 0;
|
||||
while (curPos < text.length) {
|
||||
@@ -126,174 +38,156 @@ CodeMirror.modeExtensions["javascript"] = {
|
||||
});
|
||||
|
||||
return nonBreakableBlocks;
|
||||
},
|
||||
|
||||
autoFormatLineBreaks: function (text, startPos, endPos) {
|
||||
text = text.substring(startPos, endPos);
|
||||
var curPos = 0;
|
||||
var reLinesSplitter = new RegExp("(;|\\{|\\})([^\r\n])", "g");
|
||||
var nonBreakableBlocks = this.getNonBreakableBlocks(text);
|
||||
if (nonBreakableBlocks != null) {
|
||||
var res = "";
|
||||
for (var i = 0; i < nonBreakableBlocks.length; i++) {
|
||||
if (nonBreakableBlocks[i].start > curPos) { // Break lines till the block
|
||||
res += text.substring(curPos, nonBreakableBlocks[i].start).replace(reLinesSplitter, "$1\n$2");
|
||||
curPos = nonBreakableBlocks[i].start;
|
||||
}
|
||||
if (nonBreakableBlocks[i].start <= curPos
|
||||
&& nonBreakableBlocks[i].end >= curPos) { // Skip non-breakable block
|
||||
res += text.substring(curPos, nonBreakableBlocks[i].end);
|
||||
curPos = nonBreakableBlocks[i].end;
|
||||
}
|
||||
}
|
||||
if (curPos < text.length - 1) {
|
||||
res += text.substr(curPos).replace(reLinesSplitter, "$1\n$2");
|
||||
}
|
||||
return res;
|
||||
}
|
||||
else {
|
||||
return text.replace(reLinesSplitter, "$1\n$2");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CodeMirror.modeExtensions["xml"] = {
|
||||
commentStart: "<!--",
|
||||
commentEnd: "-->",
|
||||
wordWrapChars: [">"],
|
||||
CodeMirror.extendMode("javascript", {
|
||||
commentStart: "/*",
|
||||
commentEnd: "*/",
|
||||
wordWrapChars: [";", "\\{", "\\}"],
|
||||
|
||||
autoFormatLineBreaks: function (text, startPos, endPos) {
|
||||
text = text.substring(startPos, endPos);
|
||||
var lines = text.split("\n");
|
||||
var reProcessedPortion = new RegExp("(^\\s*?<|^[^<]*?)(.+)(>\\s*?$|[^>]*?$)");
|
||||
var reOpenBrackets = new RegExp("<", "g");
|
||||
var reCloseBrackets = new RegExp("(>)([^\r\n])", "g");
|
||||
for (var i = 0; i < lines.length; i++) {
|
||||
var mToProcess = lines[i].match(reProcessedPortion);
|
||||
if (mToProcess != null && mToProcess.length > 3) { // The line starts with whitespaces and ends with whitespaces
|
||||
lines[i] = mToProcess[1]
|
||||
autoFormatLineBreaks: function (text) {
|
||||
var curPos = 0;
|
||||
var reLinesSplitter = /(;|\{|\})([^\r\n;])/g;
|
||||
var nonBreakableBlocks = jsNonBreakableBlocks(text);
|
||||
if (nonBreakableBlocks != null) {
|
||||
var res = "";
|
||||
for (var i = 0; i < nonBreakableBlocks.length; i++) {
|
||||
if (nonBreakableBlocks[i].start > curPos) { // Break lines till the block
|
||||
res += text.substring(curPos, nonBreakableBlocks[i].start).replace(reLinesSplitter, "$1\n$2");
|
||||
curPos = nonBreakableBlocks[i].start;
|
||||
}
|
||||
if (nonBreakableBlocks[i].start <= curPos
|
||||
&& nonBreakableBlocks[i].end >= curPos) { // Skip non-breakable block
|
||||
res += text.substring(curPos, nonBreakableBlocks[i].end);
|
||||
curPos = nonBreakableBlocks[i].end;
|
||||
}
|
||||
}
|
||||
if (curPos < text.length)
|
||||
res += text.substr(curPos).replace(reLinesSplitter, "$1\n$2");
|
||||
return res;
|
||||
} else {
|
||||
return text.replace(reLinesSplitter, "$1\n$2");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
CodeMirror.extendMode("xml", {
|
||||
commentStart: "<!--",
|
||||
commentEnd: "-->",
|
||||
wordWrapChars: [">"],
|
||||
|
||||
autoFormatLineBreaks: function (text) {
|
||||
var lines = text.split("\n");
|
||||
var reProcessedPortion = new RegExp("(^\\s*?<|^[^<]*?)(.+)(>\\s*?$|[^>]*?$)");
|
||||
var reOpenBrackets = new RegExp("<", "g");
|
||||
var reCloseBrackets = new RegExp("(>)([^\r\n])", "g");
|
||||
for (var i = 0; i < lines.length; i++) {
|
||||
var mToProcess = lines[i].match(reProcessedPortion);
|
||||
if (mToProcess != null && mToProcess.length > 3) { // The line starts with whitespaces and ends with whitespaces
|
||||
lines[i] = mToProcess[1]
|
||||
+ mToProcess[2].replace(reOpenBrackets, "\n$&").replace(reCloseBrackets, "$1\n$2")
|
||||
+ mToProcess[3];
|
||||
continue;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return lines.join("\n");
|
||||
}
|
||||
});
|
||||
|
||||
return lines.join("\n");
|
||||
function localModeAt(cm, pos) {
|
||||
return CodeMirror.innerMode(cm.getMode(), cm.getTokenAt(pos).state).mode;
|
||||
}
|
||||
};
|
||||
|
||||
CodeMirror.modeExtensions["htmlmixed"] = {
|
||||
commentStart: "<!--",
|
||||
commentEnd: "-->",
|
||||
wordWrapChars: [">", ";", "\\{", "\\}"],
|
||||
|
||||
getModeInfos: function (text, absPos) {
|
||||
var modeInfos = new Array();
|
||||
modeInfos[0] =
|
||||
{
|
||||
pos: 0,
|
||||
modeExt: CodeMirror.modeExtensions["xml"],
|
||||
modeName: "xml"
|
||||
};
|
||||
|
||||
var modeMatchers = new Array();
|
||||
modeMatchers[0] =
|
||||
{
|
||||
regex: new RegExp("<style[^>]*>([\\s\\S]*?)(</style[^>]*>|$)", "i"),
|
||||
modeExt: CodeMirror.modeExtensions["css"],
|
||||
modeName: "css"
|
||||
};
|
||||
modeMatchers[1] =
|
||||
{
|
||||
regex: new RegExp("<script[^>]*>([\\s\\S]*?)(</script[^>]*>|$)", "i"),
|
||||
modeExt: CodeMirror.modeExtensions["javascript"],
|
||||
modeName: "javascript"
|
||||
};
|
||||
|
||||
var lastCharPos = (typeof (absPos) !== "undefined" ? absPos : text.length - 1);
|
||||
// Detect modes for the entire text
|
||||
for (var i = 0; i < modeMatchers.length; i++) {
|
||||
var curPos = 0;
|
||||
while (curPos <= lastCharPos) {
|
||||
var m = text.substr(curPos).match(modeMatchers[i].regex);
|
||||
if (m != null) {
|
||||
if (m.length > 1 && m[1].length > 0) {
|
||||
// Push block begin pos
|
||||
var blockBegin = curPos + m.index + m[0].indexOf(m[1]);
|
||||
modeInfos.push(
|
||||
{
|
||||
pos: blockBegin,
|
||||
modeExt: modeMatchers[i].modeExt,
|
||||
modeName: modeMatchers[i].modeName
|
||||
});
|
||||
// Push block end pos
|
||||
modeInfos.push(
|
||||
{
|
||||
pos: blockBegin + m[1].length,
|
||||
modeExt: modeInfos[0].modeExt,
|
||||
modeName: modeInfos[0].modeName
|
||||
});
|
||||
curPos += m.index + m[0].length;
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
curPos += m.index + Math.max(m[0].length, 1);
|
||||
}
|
||||
}
|
||||
else { // No more matches
|
||||
break;
|
||||
}
|
||||
function enumerateModesBetween(cm, line, start, end) {
|
||||
var outer = cm.getMode(), text = cm.getLine(line);
|
||||
if (end == null) end = text.length;
|
||||
if (!outer.innerMode) return [{from: start, to: end, mode: outer}];
|
||||
var state = cm.getTokenAt({line: line, ch: start}).state;
|
||||
var mode = CodeMirror.innerMode(outer, state).mode;
|
||||
var found = [], stream = new CodeMirror.StringStream(text);
|
||||
stream.pos = stream.start = start;
|
||||
for (;;) {
|
||||
outer.token(stream, state);
|
||||
var curMode = CodeMirror.innerMode(outer, state).mode;
|
||||
if (curMode != mode) {
|
||||
var cut = stream.start;
|
||||
// Crappy heuristic to deal with the fact that a change in
|
||||
// mode can occur both at the end and the start of a token,
|
||||
// and we don't know which it was.
|
||||
if (mode.name == "xml" && text.charAt(stream.pos - 1) == ">") cut = stream.pos;
|
||||
found.push({from: start, to: cut, mode: mode});
|
||||
start = cut;
|
||||
mode = curMode;
|
||||
}
|
||||
if (stream.pos >= end) break;
|
||||
stream.start = stream.pos;
|
||||
}
|
||||
// Sort mode infos
|
||||
modeInfos.sort(function sortModeInfo(a, b) {
|
||||
return a.pos - b.pos;
|
||||
if (start < end) found.push({from: start, to: end, mode: mode});
|
||||
return found;
|
||||
}
|
||||
|
||||
// Comment/uncomment the specified range
|
||||
CodeMirror.defineExtension("commentRange", function (isComment, from, to) {
|
||||
var curMode = localModeAt(this, from), cm = this;
|
||||
this.operation(function() {
|
||||
if (isComment) { // Comment range
|
||||
cm.replaceRange(curMode.commentEnd, to);
|
||||
cm.replaceRange(curMode.commentStart, from);
|
||||
if (from.line == to.line && from.ch == to.ch) // An empty comment inserted - put cursor inside
|
||||
cm.setCursor(from.line, from.ch + curMode.commentStart.length);
|
||||
} else { // Uncomment range
|
||||
var selText = cm.getRange(from, to);
|
||||
var startIndex = selText.indexOf(curMode.commentStart);
|
||||
var endIndex = selText.lastIndexOf(curMode.commentEnd);
|
||||
if (startIndex > -1 && endIndex > -1 && endIndex > startIndex) {
|
||||
// Take string till comment start
|
||||
selText = selText.substr(0, startIndex)
|
||||
// From comment start till comment end
|
||||
+ selText.substring(startIndex + curMode.commentStart.length, endIndex)
|
||||
// From comment end till string end
|
||||
+ selText.substr(endIndex + curMode.commentEnd.length);
|
||||
}
|
||||
cm.replaceRange(selText, from, to);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return modeInfos;
|
||||
},
|
||||
|
||||
autoFormatLineBreaks: function (text, startPos, endPos) {
|
||||
var modeInfos = this.getModeInfos(text);
|
||||
var reBlockStartsWithNewline = new RegExp("^\\s*?\n");
|
||||
var reBlockEndsWithNewline = new RegExp("\n\\s*?$");
|
||||
var res = "";
|
||||
// Use modes info to break lines correspondingly
|
||||
if (modeInfos.length > 1) { // Deal with multi-mode text
|
||||
for (var i = 1; i <= modeInfos.length; i++) {
|
||||
var selStart = modeInfos[i - 1].pos;
|
||||
var selEnd = (i < modeInfos.length ? modeInfos[i].pos : endPos);
|
||||
|
||||
if (selStart >= endPos) { // The block starts later than the needed fragment
|
||||
break;
|
||||
}
|
||||
if (selStart < startPos) {
|
||||
if (selEnd <= startPos) { // The block starts earlier than the needed fragment
|
||||
continue;
|
||||
}
|
||||
selStart = startPos;
|
||||
}
|
||||
if (selEnd > endPos) {
|
||||
selEnd = endPos;
|
||||
}
|
||||
var textPortion = text.substring(selStart, selEnd);
|
||||
if (modeInfos[i - 1].modeName != "xml") { // Starting a CSS or JavaScript block
|
||||
if (!reBlockStartsWithNewline.test(textPortion)
|
||||
&& selStart > 0) { // The block does not start with a line break
|
||||
textPortion = "\n" + textPortion;
|
||||
}
|
||||
if (!reBlockEndsWithNewline.test(textPortion)
|
||||
&& selEnd < text.length - 1) { // The block does not end with a line break
|
||||
textPortion += "\n";
|
||||
}
|
||||
}
|
||||
res += modeInfos[i - 1].modeExt.autoFormatLineBreaks(textPortion);
|
||||
// Applies automatic mode-aware indentation to the specified range
|
||||
CodeMirror.defineExtension("autoIndentRange", function (from, to) {
|
||||
var cmInstance = this;
|
||||
this.operation(function () {
|
||||
for (var i = from.line; i <= to.line; i++) {
|
||||
cmInstance.indentLine(i, "smart");
|
||||
}
|
||||
}
|
||||
else { // Single-mode text
|
||||
res = modeInfos[0].modeExt.autoFormatLineBreaks(text.substring(startPos, endPos));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return res;
|
||||
}
|
||||
};
|
||||
// Applies automatic formatting to the specified range
|
||||
CodeMirror.defineExtension("autoFormatRange", function (from, to) {
|
||||
var cm = this;
|
||||
cm.operation(function () {
|
||||
for (var cur = from.line, end = to.line; cur <= end; ++cur) {
|
||||
var f = {line: cur, ch: cur == from.line ? from.ch : 0};
|
||||
var t = {line: cur, ch: cur == end ? to.ch : null};
|
||||
var modes = enumerateModesBetween(cm, cur, f.ch, t.ch), mangled = "";
|
||||
var text = cm.getRange(f, t);
|
||||
for (var i = 0; i < modes.length; ++i) {
|
||||
var part = modes.length > 1 ? text.slice(modes[i].from, modes[i].to) : text;
|
||||
if (mangled) mangled += "\n";
|
||||
if (modes[i].mode.autoFormatLineBreaks) {
|
||||
mangled += modes[i].mode.autoFormatLineBreaks(part);
|
||||
} else mangled += text;
|
||||
}
|
||||
if (mangled != text) {
|
||||
for (var count = 0, pos = mangled.indexOf("\n"); pos != -1; pos = mangled.indexOf("\n", pos + 1), ++count) {}
|
||||
cm.replaceRange(mangled, f, t);
|
||||
cur += count;
|
||||
end += count;
|
||||
}
|
||||
}
|
||||
for (var cur = from.line + 1; cur <= end; ++cur)
|
||||
cm.indentLine(cur, "smart");
|
||||
cm.setSelection(from, cm.getCursor(false));
|
||||
});
|
||||
});
|
||||
})();
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
case '(': level--; break;
|
||||
default: break;
|
||||
}
|
||||
} while (level > 0)
|
||||
} while (level > 0);
|
||||
tprop = getToken(editor, {line: cur.line, ch: tprop.start});
|
||||
if (tprop.className == 'variable')
|
||||
tprop.className = 'function';
|
||||
@@ -55,7 +55,7 @@
|
||||
CodeMirror.javascriptHint = function(editor) {
|
||||
return scriptHint(editor, javascriptKeywords,
|
||||
function (e, cur) {return e.getTokenAt(cur);});
|
||||
}
|
||||
};
|
||||
|
||||
function getCoffeeScriptToken(editor, cur) {
|
||||
// This getToken, it is for coffeescript, imitates the behavior of
|
||||
@@ -77,7 +77,7 @@
|
||||
|
||||
CodeMirror.coffeescriptHint = function(editor) {
|
||||
return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken);
|
||||
}
|
||||
};
|
||||
|
||||
var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " +
|
||||
"toUpperCase toLowerCase split concat match replace search").split(" ");
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
var loading = {};
|
||||
function splitCallback(cont, n) {
|
||||
var countDown = n;
|
||||
return function() { if (--countDown == 0) cont(); }
|
||||
return function() { if (--countDown == 0) cont(); };
|
||||
}
|
||||
function ensureDeps(mode, cont) {
|
||||
var deps = CodeMirror.modes[mode].dependencies;
|
||||
|
||||
@@ -35,7 +35,7 @@ CodeMirror.multiplexingMode = function(outer /*, others */) {
|
||||
if (found == stream.pos) {
|
||||
stream.match(other.open);
|
||||
state.innerActive = other;
|
||||
state.inner = CodeMirror.startState(other.mode, outer.indent(state.outer, ""));
|
||||
state.inner = CodeMirror.startState(other.mode, outer.indent ? outer.indent(state.outer, "") : 0);
|
||||
return other.delimStyle;
|
||||
} else if (found != -1 && found < cutOff) {
|
||||
cutOff = found;
|
||||
@@ -68,14 +68,10 @@ CodeMirror.multiplexingMode = function(outer /*, others */) {
|
||||
return mode.indent(state.innerActive ? state.inner : state.outer, textAfter);
|
||||
},
|
||||
|
||||
compareStates: function(a, b) {
|
||||
if (a.innerActive != b.innerActive) return false;
|
||||
var mode = a.innerActive || outer;
|
||||
if (!mode.compareStates) return CodeMirror.Pass;
|
||||
return mode.compareStates(a.innerActive ? a.inner : a.outer,
|
||||
b.innerActive ? b.inner : b.outer);
|
||||
},
|
||||
electricChars: outer.electricChars,
|
||||
|
||||
electricChars: outer.electricChars
|
||||
innerMode: function(state) {
|
||||
return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer};
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
@@ -47,6 +47,8 @@ CodeMirror.overlayMode = CodeMirror.overlayParser = function(base, overlay, comb
|
||||
indent: base.indent && function(state, textAfter) {
|
||||
return base.indent(state.base, textAfter);
|
||||
},
|
||||
electricChars: base.electricChars
|
||||
electricChars: base.electricChars,
|
||||
|
||||
innerMode: function(state) { return {state: state.base, mode: base}; }
|
||||
};
|
||||
};
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
CodeMirror.pigHint = function(editor) {
|
||||
return scriptHint(editor, pigKeywordsU, function (e, cur) {return e.getTokenAt(cur);});
|
||||
}
|
||||
};
|
||||
|
||||
function toTitleCase(str) {
|
||||
return str.replace(/(?:^|\s)\w/g, function(match) {
|
||||
@@ -71,12 +71,10 @@
|
||||
+ "ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS "
|
||||
+ "LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA "
|
||||
+ "PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE "
|
||||
+ "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG "
|
||||
+ "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER";
|
||||
|
||||
var pigBuiltinsU = pigBuiltins.split(" ").join("() ").split(" ");
|
||||
var pigBuiltinsL = pigBuiltins.toLowerCase().split(" ").join("() ").split(" ");
|
||||
|
||||
+ "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG "
|
||||
+ "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER";
|
||||
var pigBuiltinsU = pigBuiltins.split(" ").join("() ").split(" ");
|
||||
var pigBuiltinsL = pigBuiltins.toLowerCase().split(" ").join("() ").split(" ");
|
||||
var pigBuiltinsC = ("BagSize BinStorage Bloom BuildBloom ConstantSize CubeDimensions DoubleAbs "
|
||||
+ "DoubleAvg DoubleBase DoubleMax DoubleMin DoubleRound DoubleSum FloatAbs FloatAvg FloatMax "
|
||||
+ "FloatMin FloatRound FloatSum GenericInvoker IntAbs IntAvg IntMax IntMin IntSum "
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
/* Just enough of CodeMirror to run runMode under node.js */
|
||||
|
||||
function splitLines(string){ return string.split(/\r?\n|\r/); };
|
||||
|
||||
function StringStream(string) {
|
||||
this.pos = this.start = 0;
|
||||
this.string = string;
|
||||
}
|
||||
StringStream.prototype = {
|
||||
eol: function() {return this.pos >= this.string.length;},
|
||||
sol: function() {return this.pos == 0;},
|
||||
peek: function() {return this.string.charAt(this.pos) || null;},
|
||||
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)){}
|
||||
return this.pos > start;
|
||||
},
|
||||
eatSpace: function() {
|
||||
var start = this.pos;
|
||||
while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;
|
||||
return this.pos > start;
|
||||
},
|
||||
skipToEnd: function() {this.pos = this.string.length;},
|
||||
skipTo: function(ch) {
|
||||
var found = this.string.indexOf(ch, this.pos);
|
||||
if (found > -1) {this.pos = found; return true;}
|
||||
},
|
||||
backUp: function(n) {this.pos -= n;},
|
||||
column: function() {return this.start;},
|
||||
indentation: function() {return 0;},
|
||||
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 += pattern.length;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
var match = this.string.slice(this.pos).match(pattern);
|
||||
if (match && consume !== false) this.pos += match[0].length;
|
||||
return match;
|
||||
}
|
||||
},
|
||||
current: function(){return this.string.slice(this.start, this.pos);}
|
||||
};
|
||||
exports.StringStream = StringStream;
|
||||
|
||||
exports.startState = function(mode, a1, a2) {
|
||||
return mode.startState ? mode.startState(a1, a2) : true;
|
||||
};
|
||||
|
||||
var modes = exports.modes = {}, mimeModes = exports.mimeModes = {};
|
||||
exports.defineMode = function(name, mode) { modes[name] = mode; };
|
||||
exports.defineMIME = function(mime, spec) { mimeModes[mime] = spec; };
|
||||
exports.getMode = function(options, spec) {
|
||||
if (typeof spec == "string" && mimeModes.hasOwnProperty(spec))
|
||||
spec = mimeModes[spec];
|
||||
if (typeof spec == "string")
|
||||
var mname = spec, config = {};
|
||||
else if (spec != null)
|
||||
var mname = spec.name, config = spec;
|
||||
var mfactory = modes[mname];
|
||||
if (!mfactory) throw new Error("Unknown mode: " + spec);
|
||||
return mfactory(options, config || {});
|
||||
};
|
||||
|
||||
exports.runMode = function(string, modespec, callback) {
|
||||
var mode = exports.getMode({indentUnit: 2}, modespec);
|
||||
var lines = splitLines(string), state = exports.startState(mode);
|
||||
for (var i = 0, e = lines.length; i < e; ++i) {
|
||||
if (i) callback("\n");
|
||||
var stream = new exports.StringStream(lines[i]);
|
||||
while (!stream.eol()) {
|
||||
var style = mode.token(stream, state);
|
||||
callback(stream.current(), style, i, stream.start);
|
||||
stream.start = stream.pos;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -1,4 +1,8 @@
|
||||
CodeMirror.runMode = function(string, modespec, callback, options) {
|
||||
function esc(str) {
|
||||
return str.replace(/[<&]/, function(ch) { return ch == "<" ? "<" : "&"; });
|
||||
}
|
||||
|
||||
var mode = CodeMirror.getMode(CodeMirror.defaults, modespec);
|
||||
var isNode = callback.nodeType == 1;
|
||||
var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize;
|
||||
@@ -15,12 +19,12 @@ CodeMirror.runMode = function(string, modespec, callback, options) {
|
||||
for (var pos = 0;;) {
|
||||
var idx = text.indexOf("\t", pos);
|
||||
if (idx == -1) {
|
||||
escaped += CodeMirror.htmlEscape(text.slice(pos));
|
||||
escaped += esc(text.slice(pos));
|
||||
col += text.length - pos;
|
||||
break;
|
||||
} else {
|
||||
col += idx - pos;
|
||||
escaped += CodeMirror.htmlEscape(text.slice(pos, idx));
|
||||
escaped += esc(text.slice(pos, idx));
|
||||
var size = tabSize - col % tabSize;
|
||||
col += size;
|
||||
for (var i = 0; i < size; ++i) escaped += " ";
|
||||
@@ -29,10 +33,10 @@ CodeMirror.runMode = function(string, modespec, callback, options) {
|
||||
}
|
||||
|
||||
if (style)
|
||||
accum.push("<span class=\"cm-" + CodeMirror.htmlEscape(style) + "\">" + escaped + "</span>");
|
||||
accum.push("<span class=\"cm-" + esc(style) + "\">" + escaped + "</span>");
|
||||
else
|
||||
accum.push(escaped);
|
||||
}
|
||||
};
|
||||
}
|
||||
var lines = CodeMirror.splitLines(string), state = CodeMirror.startState(mode);
|
||||
for (var i = 0, e = lines.length; i < e; ++i) {
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
if (!query || state.query) return;
|
||||
state.query = parseQuery(query);
|
||||
if (cm.lineCount() < 2000) { // This is too expensive on big documents.
|
||||
for (var cursor = getSearchCursor(cm, query); cursor.findNext();)
|
||||
for (var cursor = getSearchCursor(cm, state.query); cursor.findNext();)
|
||||
state.marked.push(cm.markText(cursor.from(), cursor.to(), "CodeMirror-searching"));
|
||||
}
|
||||
state.posFrom = state.posTo = cm.getCursor();
|
||||
@@ -57,14 +57,14 @@
|
||||
}
|
||||
cm.setSelection(cursor.from(), cursor.to());
|
||||
state.posFrom = cursor.from(); state.posTo = cursor.to();
|
||||
})}
|
||||
});}
|
||||
function clearSearch(cm) {cm.operation(function() {
|
||||
var state = getSearchState(cm);
|
||||
if (!state.query) return;
|
||||
state.query = null;
|
||||
for (var i = 0; i < state.marked.length; ++i) state.marked[i].clear();
|
||||
state.marked.length = 0;
|
||||
})}
|
||||
});}
|
||||
|
||||
var replaceQueryDialog =
|
||||
'Replace: <input type="text" style="width: 10em"/> <span style="color: #888">(Use /re/ syntax for regexp search)</span>';
|
||||
@@ -83,7 +83,7 @@
|
||||
cursor.replace(text.replace(/\$(\d)/, function(w, i) {return match[i];}));
|
||||
} else cursor.replace(text);
|
||||
}
|
||||
})});
|
||||
});});
|
||||
} else {
|
||||
clearSearch(cm);
|
||||
var cursor = getSearchCursor(cm, query, cm.getCursor());
|
||||
|
||||
@@ -10,30 +10,32 @@
|
||||
// It takes a position and a direction, and returns an object
|
||||
// describing the next occurrence of the query, or null if no
|
||||
// more matches were found.
|
||||
if (typeof query != "string") // Regexp match
|
||||
if (typeof query != "string") { // Regexp match
|
||||
if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "ig" : "g");
|
||||
this.matches = function(reverse, pos) {
|
||||
if (reverse) {
|
||||
var line = cm.getLine(pos.line).slice(0, pos.ch), match = line.match(query), start = 0;
|
||||
query.lastIndex = 0;
|
||||
var line = cm.getLine(pos.line).slice(0, pos.ch), match = query.exec(line), start = 0;
|
||||
while (match) {
|
||||
var ind = line.indexOf(match[0]);
|
||||
start += ind;
|
||||
line = line.slice(ind + 1);
|
||||
var newmatch = line.match(query);
|
||||
start += match.index;
|
||||
line = line.slice(match.index);
|
||||
query.lastIndex = 0;
|
||||
var newmatch = query.exec(line);
|
||||
if (newmatch) match = newmatch;
|
||||
else break;
|
||||
start++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
var line = cm.getLine(pos.line).slice(pos.ch), match = line.match(query),
|
||||
start = match && pos.ch + line.indexOf(match[0]);
|
||||
} else {
|
||||
query.lastIndex = pos.ch;
|
||||
var line = cm.getLine(pos.line), match = query.exec(line),
|
||||
start = match && match.index;
|
||||
}
|
||||
if (match)
|
||||
return {from: {line: pos.line, ch: start},
|
||||
to: {line: pos.line, ch: start + match[0].length},
|
||||
match: match};
|
||||
};
|
||||
else { // String query
|
||||
} else { // String query
|
||||
if (caseFold) query = query.toLowerCase();
|
||||
var fold = caseFold ? function(str){return str.toLowerCase();} : function(str){return str;};
|
||||
var target = query.split("\n");
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
(function() {
|
||||
CodeMirror.simpleHint = function(editor, getHints, givenOptions) {
|
||||
// Determine effective options based on given values and defaults.
|
||||
var options = {}, defaults = CodeMirror.simpleHint.defaults;
|
||||
for (var opt in defaults)
|
||||
if (defaults.hasOwnProperty(opt))
|
||||
options[opt] = (givenOptions && givenOptions.hasOwnProperty(opt) ? givenOptions : defaults)[opt];
|
||||
|
||||
function collectHints(previousToken) {
|
||||
// We want a single cursor position.
|
||||
if (editor.somethingSelected()) return;
|
||||
|
||||
var tempToken = editor.getTokenAt(editor.getCursor());
|
||||
|
||||
// Don't show completions if token has changed and the option is set.
|
||||
if (options.closeOnTokenChange && previousToken != null &&
|
||||
(tempToken.start != previousToken.start || tempToken.className != previousToken.className)) {
|
||||
return;
|
||||
}
|
||||
|
||||
var result = getHints(editor);
|
||||
if (!result || !result.list.length) return;
|
||||
var completions = result.list;
|
||||
function insert(str) {
|
||||
editor.replaceRange(str, result.from, result.to);
|
||||
}
|
||||
// When there is only one completion, use it directly.
|
||||
if (completions.length == 1) {insert(completions[0]); return true;}
|
||||
|
||||
// Build the select widget
|
||||
var complete = document.createElement("div");
|
||||
complete.className = "CodeMirror-completions";
|
||||
var sel = complete.appendChild(document.createElement("select"));
|
||||
// Opera doesn't move the selection when pressing up/down in a
|
||||
// multi-select, but it does properly support the size property on
|
||||
// single-selects, so no multi-select is necessary.
|
||||
if (!window.opera) sel.multiple = true;
|
||||
for (var i = 0; i < completions.length; ++i) {
|
||||
var opt = sel.appendChild(document.createElement("option"));
|
||||
opt.appendChild(document.createTextNode(completions[i]));
|
||||
}
|
||||
sel.firstChild.selected = true;
|
||||
sel.size = Math.min(10, completions.length);
|
||||
var pos = editor.cursorCoords();
|
||||
complete.style.left = pos.x + "px";
|
||||
complete.style.top = pos.yBot + "px";
|
||||
document.body.appendChild(complete);
|
||||
// If we're at the edge of the screen, then we want the menu to appear on the left of the cursor.
|
||||
var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth);
|
||||
if(winW - pos.x < sel.clientWidth)
|
||||
complete.style.left = (pos.x - sel.clientWidth) + "px";
|
||||
// Hack to hide the scrollbar.
|
||||
if (completions.length <= 10)
|
||||
complete.style.width = (sel.clientWidth - 1) + "px";
|
||||
|
||||
var done = false;
|
||||
function close() {
|
||||
if (done) return;
|
||||
done = true;
|
||||
complete.parentNode.removeChild(complete);
|
||||
}
|
||||
function pick() {
|
||||
insert(completions[sel.selectedIndex]);
|
||||
close();
|
||||
setTimeout(function(){editor.focus();}, 50);
|
||||
}
|
||||
CodeMirror.connect(sel, "blur", close);
|
||||
CodeMirror.connect(sel, "keydown", function(event) {
|
||||
var code = event.keyCode;
|
||||
// Enter
|
||||
if (code == 13) {CodeMirror.e_stop(event); pick();}
|
||||
// Escape
|
||||
else if (code == 27) {CodeMirror.e_stop(event); close(); editor.focus();}
|
||||
else if (code != 38 && code != 40 && code != 33 && code != 34) {
|
||||
close(); editor.focus();
|
||||
// Pass the event to the CodeMirror instance so that it can handle things like backspace properly.
|
||||
editor.triggerOnKeyDown(event);
|
||||
// Don't show completions if the code is backspace and the option is set.
|
||||
if (!options.closeOnBackspace || code != 8) {
|
||||
setTimeout(function(){collectHints(tempToken);}, 50);
|
||||
}
|
||||
}
|
||||
});
|
||||
CodeMirror.connect(sel, "dblclick", pick);
|
||||
|
||||
sel.focus();
|
||||
// Opera sometimes ignores focusing a freshly created node
|
||||
if (window.opera) setTimeout(function(){if (!done) sel.focus();}, 100);
|
||||
return true;
|
||||
}
|
||||
return collectHints();
|
||||
};
|
||||
CodeMirror.simpleHint.defaults = {
|
||||
closeOnBackspace: true,
|
||||
closeOnTokenChange: false
|
||||
};
|
||||
})();
|
||||
@@ -1,8 +1,10 @@
|
||||
|
||||
|
||||
(function() {
|
||||
|
||||
CodeMirror.xmlHints = [];
|
||||
|
||||
CodeMirror.xmlHint = function(cm, simbol) {
|
||||
|
||||
if(simbol.length > 0) {
|
||||
var cursor = cm.getCursor();
|
||||
cm.replaceSelection(simbol);
|
||||
@@ -13,7 +15,7 @@
|
||||
// dirty hack for simple-hint to receive getHint event on space
|
||||
var getTokenAt = editor.getTokenAt;
|
||||
|
||||
editor.getTokenAt = function() { return 'disabled'; }
|
||||
editor.getTokenAt = function() { return 'disabled'; };
|
||||
CodeMirror.simpleHint(cm, getHint);
|
||||
|
||||
editor.getTokenAt = getTokenAt;
|
||||
@@ -38,7 +40,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
text = text.substr(0, text.length - typed.length);
|
||||
text = text.slice(0, text.length - typed.length);
|
||||
|
||||
var path = getActiveElement(cm, text) + simbol;
|
||||
var hints = CodeMirror.xmlHints[path];
|
||||
@@ -56,10 +58,10 @@
|
||||
return {
|
||||
list: hints,
|
||||
from: { line: cursor.line, ch: cursor.ch - typed.length },
|
||||
to: cursor,
|
||||
to: cursor
|
||||
};
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
var getActiveElement = function(codeMirror, text) {
|
||||
|
||||
@@ -74,7 +76,7 @@
|
||||
while ((match = regex.exec(text)) != null) {
|
||||
matches.push({
|
||||
tag: match[1],
|
||||
selfclose: (match[0].substr(-1) === '/>')
|
||||
selfclose: (match[0].slice(match[0].length - 2) === '/>')
|
||||
});
|
||||
}
|
||||
|
||||
@@ -112,7 +114,7 @@
|
||||
|
||||
if (close < open)
|
||||
{
|
||||
text = text.substr(open);
|
||||
text = text.slice(open);
|
||||
|
||||
if(text != '<') {
|
||||
|
||||
@@ -125,7 +127,7 @@
|
||||
if (space < 0)
|
||||
space = text.length;
|
||||
|
||||
return text.substr(0, space);
|
||||
return text.slice(0, space);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -181,14 +181,18 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
|
||||
return "string";
|
||||
}
|
||||
|
||||
CodeMirror.defineMIME("text/x-csrc", {
|
||||
function mimes(ms, mode) {
|
||||
for (var i = 0; i < ms.length; ++i) CodeMirror.defineMIME(ms[i], mode);
|
||||
}
|
||||
|
||||
mimes(["text/x-csrc", "text/x-c", "text/x-chdr"], {
|
||||
name: "clike",
|
||||
keywords: words(cKeywords),
|
||||
blockKeywords: words("case do else for if switch while struct"),
|
||||
atoms: words("null"),
|
||||
hooks: {"#": cppHook}
|
||||
});
|
||||
CodeMirror.defineMIME("text/x-c++src", {
|
||||
mimes(["text/x-c++src", "text/x-c++hdr"], {
|
||||
name: "clike",
|
||||
keywords: words(cKeywords + " asm dynamic_cast namespace reinterpret_cast try bool explicit new " +
|
||||
"static_cast typeid catch operator template typename class friend private " +
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: C-like mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: C-like mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<link rel="stylesheet" href="../../theme/ambiance.css">
|
||||
|
||||
@@ -40,9 +40,9 @@ CodeMirror.defineMode("clojure", function (config, mode) {
|
||||
var tests = {
|
||||
digit: /\d/,
|
||||
digit_or_colon: /[\d:]/,
|
||||
hex: /[0-9a-fA-F]/,
|
||||
hex: /[0-9a-f]/i,
|
||||
sign: /[+-]/,
|
||||
exponent: /[eE]/,
|
||||
exponent: /e/i,
|
||||
keyword_char: /[^\s\(\[\;\)\]]/,
|
||||
basic: /[\w\$_\-]/,
|
||||
lang_keyword: /[\w*+!\-_?:\/]/
|
||||
@@ -64,14 +64,13 @@ CodeMirror.defineMode("clojure", function (config, mode) {
|
||||
|
||||
function isNumber(ch, stream){
|
||||
// hex
|
||||
if ( ch === '0' && 'x' == stream.peek().toLowerCase() ) {
|
||||
stream.eat('x');
|
||||
if ( ch === '0' && stream.eat(/x/i) ) {
|
||||
stream.eatWhile(tests.hex);
|
||||
return true;
|
||||
}
|
||||
|
||||
// leading sign
|
||||
if ( ch == '+' || ch == '-' ) {
|
||||
if ( ( ch == '+' || ch == '-' ) && ( tests.digit.test(stream.peek()) ) ) {
|
||||
stream.eat(tests.sign);
|
||||
ch = stream.next();
|
||||
}
|
||||
@@ -85,8 +84,7 @@ CodeMirror.defineMode("clojure", function (config, mode) {
|
||||
stream.eatWhile(tests.digit);
|
||||
}
|
||||
|
||||
if ( 'e' == stream.peek().toLowerCase() ) {
|
||||
stream.eat(tests.exponent);
|
||||
if ( stream.eat(tests.exponent) ) {
|
||||
stream.eat(tests.sign);
|
||||
stream.eatWhile(tests.digit);
|
||||
}
|
||||
@@ -145,7 +143,7 @@ CodeMirror.defineMode("clojure", function (config, mode) {
|
||||
} else if (isNumber(ch,stream)){
|
||||
returnType = NUMBER;
|
||||
} else if (ch == "(" || ch == "[") {
|
||||
var keyWord = ''; var indentTemp = stream.column();
|
||||
var keyWord = '', indentTemp = stream.column(), letter;
|
||||
/**
|
||||
Either
|
||||
(indent-word ..
|
||||
@@ -157,7 +155,8 @@ CodeMirror.defineMode("clojure", function (config, mode) {
|
||||
keyWord += letter;
|
||||
}
|
||||
|
||||
if (keyWord.length > 0 && indentKeys.propertyIsEnumerable(keyWord)) { // indent-word
|
||||
if (keyWord.length > 0 && (indentKeys.propertyIsEnumerable(keyWord) ||
|
||||
/^(?:def|with)/.test(keyWord))) { // indent-word
|
||||
pushStack(state, indentTemp + INDENT_WORD_SKIP, ch);
|
||||
} else { // non-indent word
|
||||
// we continue eating the spaces
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Clojure mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -187,7 +187,7 @@ CodeMirror.defineMode('coffeescript', function(conf) {
|
||||
}
|
||||
if (singleline) {
|
||||
if (conf.mode.singleLineStringErrors) {
|
||||
outclass = ERRORCLASS
|
||||
outclass = ERRORCLASS;
|
||||
} else {
|
||||
state.tokenize = tokenBase;
|
||||
}
|
||||
@@ -205,7 +205,7 @@ CodeMirror.defineMode('coffeescript', function(conf) {
|
||||
}
|
||||
stream.eatWhile("#");
|
||||
}
|
||||
return "comment"
|
||||
return "comment";
|
||||
}
|
||||
|
||||
function indent(stream, state, type) {
|
||||
@@ -244,7 +244,7 @@ CodeMirror.defineMode('coffeescript', function(conf) {
|
||||
while (state.scopes[0].offset !== _indent) {
|
||||
state.scopes.shift();
|
||||
}
|
||||
return false
|
||||
return false;
|
||||
} else {
|
||||
state.scopes.shift();
|
||||
return false;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: CoffeeScript mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
CodeMirror.defineMode("commonlisp", function (config) {
|
||||
var assumeBody = /^with|^def|^do|^prog|case$|^cond$|bind$|when$|unless$/;
|
||||
var numLiteral = /^(?:[+\-]?(?:\d+|\d*\.\d+)(?:[efd][+\-]?\d+)?|[+\-]?\d+(?:\/[+\-]?\d+)?|#b[+\-]?[01]+|#o[+\-]?[0-7]+|#x[+\-]?[\da-f]+)/;
|
||||
var symbol = /[^\s'`,@()\[\]";]/;
|
||||
var type;
|
||||
|
||||
function readSym(stream) {
|
||||
var ch;
|
||||
while (ch = stream.next()) {
|
||||
if (ch == "\\") stream.next();
|
||||
else if (!symbol.test(ch)) { stream.backUp(1); break; }
|
||||
}
|
||||
return stream.current();
|
||||
}
|
||||
|
||||
function base(stream, state) {
|
||||
if (stream.eatSpace()) {type = "ws"; return null;}
|
||||
if (stream.match(numLiteral)) return "number";
|
||||
var ch = stream.next();
|
||||
if (ch == "\\") ch = stream.next();
|
||||
|
||||
if (ch == '"') return (state.tokenize = inString)(stream, state);
|
||||
else if (ch == "(") { type = "open"; return "bracket"; }
|
||||
else if (ch == ")" || ch == "]") { type = "close"; return "bracket"; }
|
||||
else if (ch == ";") { stream.skipToEnd(); type = "ws"; return "comment"; }
|
||||
else if (/['`,@]/.test(ch)) return null;
|
||||
else if (ch == "|") {
|
||||
if (stream.skipTo("|")) { stream.next(); return "symbol"; }
|
||||
else { stream.skipToEnd(); return "error"; }
|
||||
} else if (ch == "#") {
|
||||
var ch = stream.next();
|
||||
if (ch == "[") { type = "open"; return "bracket"; }
|
||||
else if (/[+\-=\.']/.test(ch)) return null;
|
||||
else if (/\d/.test(ch) && stream.match(/^\d*#/)) return null;
|
||||
else if (ch == "|") return (state.tokenize = inComment)(stream, state);
|
||||
else if (ch == ":") { readSym(stream); return "meta"; }
|
||||
else return "error";
|
||||
} else {
|
||||
var name = readSym(stream);
|
||||
if (name == ".") return null;
|
||||
type = "symbol";
|
||||
if (name == "nil" || name == "t") return "atom";
|
||||
if (name.charAt(0) == ":") return "keyword";
|
||||
if (name.charAt(0) == "&") return "variable-2";
|
||||
return "variable";
|
||||
}
|
||||
}
|
||||
|
||||
function inString(stream, state) {
|
||||
var escaped = false, next;
|
||||
while (next = stream.next()) {
|
||||
if (next == '"' && !escaped) { state.tokenize = base; break; }
|
||||
escaped = !escaped && next == "\\";
|
||||
}
|
||||
return "string";
|
||||
}
|
||||
|
||||
function inComment(stream, state) {
|
||||
var next, last;
|
||||
while (next = stream.next()) {
|
||||
if (next == "#" && last == "|") { state.tokenize = base; break; }
|
||||
last = next;
|
||||
}
|
||||
type = "ws";
|
||||
return "comment";
|
||||
}
|
||||
|
||||
return {
|
||||
startState: function () {
|
||||
return {ctx: {prev: null, start: 0, indentTo: 0}, tokenize: base};
|
||||
},
|
||||
|
||||
token: function (stream, state) {
|
||||
if (stream.sol() && typeof state.ctx.indentTo != "number")
|
||||
state.ctx.indentTo = state.ctx.start + 1;
|
||||
|
||||
type = null;
|
||||
var style = state.tokenize(stream, state);
|
||||
if (type != "ws") {
|
||||
if (state.ctx.indentTo == null) {
|
||||
if (type == "symbol" && assumeBody.test(stream.current()))
|
||||
state.ctx.indentTo = state.ctx.start + config.indentUnit;
|
||||
else
|
||||
state.ctx.indentTo = "next";
|
||||
} else if (state.ctx.indentTo == "next") {
|
||||
state.ctx.indentTo = stream.column();
|
||||
}
|
||||
}
|
||||
if (type == "open") state.ctx = {prev: state.ctx, start: stream.column(), indentTo: null};
|
||||
else if (type == "close") state.ctx = state.ctx.prev || state.ctx;
|
||||
return style;
|
||||
},
|
||||
|
||||
indent: function (state, textAfter) {
|
||||
var i = state.ctx.indentTo;
|
||||
return typeof i == "number" ? i : state.ctx.start + 1;
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
CodeMirror.defineMIME("text/x-common-lisp", "commonlisp");
|
||||
@@ -0,0 +1,165 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Common Lisp mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
<script src="commonlisp.js"></script>
|
||||
<style>.CodeMirror {background: #f8f8f8;}</style>
|
||||
<link rel="stylesheet" href="../../doc/docs.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>CodeMirror: Common Lisp mode</h1>
|
||||
<form><textarea id="code" name="code">(in-package :cl-postgres)
|
||||
|
||||
;; These are used to synthesize reader and writer names for integer
|
||||
;; reading/writing functions when the amount of bytes and the
|
||||
;; signedness is known. Both the macro that creates the functions and
|
||||
;; some macros that use them create names this way.
|
||||
(eval-when (:compile-toplevel :load-toplevel :execute)
|
||||
(defun integer-reader-name (bytes signed)
|
||||
(intern (with-standard-io-syntax
|
||||
(format nil "~a~a~a~a" '#:read- (if signed "" '#:u) '#:int bytes))))
|
||||
(defun integer-writer-name (bytes signed)
|
||||
(intern (with-standard-io-syntax
|
||||
(format nil "~a~a~a~a" '#:write- (if signed "" '#:u) '#:int bytes)))))
|
||||
|
||||
(defmacro integer-reader (bytes)
|
||||
"Create a function to read integers from a binary stream."
|
||||
(let ((bits (* bytes 8)))
|
||||
(labels ((return-form (signed)
|
||||
(if signed
|
||||
`(if (logbitp ,(1- bits) result)
|
||||
(dpb result (byte ,(1- bits) 0) -1)
|
||||
result)
|
||||
`result))
|
||||
(generate-reader (signed)
|
||||
`(defun ,(integer-reader-name bytes signed) (socket)
|
||||
(declare (type stream socket)
|
||||
#.*optimize*)
|
||||
,(if (= bytes 1)
|
||||
`(let ((result (the (unsigned-byte 8) (read-byte socket))))
|
||||
(declare (type (unsigned-byte 8) result))
|
||||
,(return-form signed))
|
||||
`(let ((result 0))
|
||||
(declare (type (unsigned-byte ,bits) result))
|
||||
,@(loop :for byte :from (1- bytes) :downto 0
|
||||
:collect `(setf (ldb (byte 8 ,(* 8 byte)) result)
|
||||
(the (unsigned-byte 8) (read-byte socket))))
|
||||
,(return-form signed))))))
|
||||
`(progn
|
||||
;; This causes weird errors on SBCL in some circumstances. Disabled for now.
|
||||
;; (declaim (inline ,(integer-reader-name bytes t)
|
||||
;; ,(integer-reader-name bytes nil)))
|
||||
(declaim (ftype (function (t) (signed-byte ,bits))
|
||||
,(integer-reader-name bytes t)))
|
||||
,(generate-reader t)
|
||||
(declaim (ftype (function (t) (unsigned-byte ,bits))
|
||||
,(integer-reader-name bytes nil)))
|
||||
,(generate-reader nil)))))
|
||||
|
||||
(defmacro integer-writer (bytes)
|
||||
"Create a function to write integers to a binary stream."
|
||||
(let ((bits (* 8 bytes)))
|
||||
`(progn
|
||||
(declaim (inline ,(integer-writer-name bytes t)
|
||||
,(integer-writer-name bytes nil)))
|
||||
(defun ,(integer-writer-name bytes nil) (socket value)
|
||||
(declare (type stream socket)
|
||||
(type (unsigned-byte ,bits) value)
|
||||
#.*optimize*)
|
||||
,@(if (= bytes 1)
|
||||
`((write-byte value socket))
|
||||
(loop :for byte :from (1- bytes) :downto 0
|
||||
:collect `(write-byte (ldb (byte 8 ,(* byte 8)) value)
|
||||
socket)))
|
||||
(values))
|
||||
(defun ,(integer-writer-name bytes t) (socket value)
|
||||
(declare (type stream socket)
|
||||
(type (signed-byte ,bits) value)
|
||||
#.*optimize*)
|
||||
,@(if (= bytes 1)
|
||||
`((write-byte (ldb (byte 8 0) value) socket))
|
||||
(loop :for byte :from (1- bytes) :downto 0
|
||||
:collect `(write-byte (ldb (byte 8 ,(* byte 8)) value)
|
||||
socket)))
|
||||
(values)))))
|
||||
|
||||
;; All the instances of the above that we need.
|
||||
|
||||
(integer-reader 1)
|
||||
(integer-reader 2)
|
||||
(integer-reader 4)
|
||||
(integer-reader 8)
|
||||
|
||||
(integer-writer 1)
|
||||
(integer-writer 2)
|
||||
(integer-writer 4)
|
||||
|
||||
(defun write-bytes (socket bytes)
|
||||
"Write a byte-array to a stream."
|
||||
(declare (type stream socket)
|
||||
(type (simple-array (unsigned-byte 8)) bytes)
|
||||
#.*optimize*)
|
||||
(write-sequence bytes socket))
|
||||
|
||||
(defun write-str (socket string)
|
||||
"Write a null-terminated string to a stream \(encoding it when UTF-8
|
||||
support is enabled.)."
|
||||
(declare (type stream socket)
|
||||
(type string string)
|
||||
#.*optimize*)
|
||||
(enc-write-string string socket)
|
||||
(write-uint1 socket 0))
|
||||
|
||||
(declaim (ftype (function (t unsigned-byte)
|
||||
(simple-array (unsigned-byte 8) (*)))
|
||||
read-bytes))
|
||||
(defun read-bytes (socket length)
|
||||
"Read a byte array of the given length from a stream."
|
||||
(declare (type stream socket)
|
||||
(type fixnum length)
|
||||
#.*optimize*)
|
||||
(let ((result (make-array length :element-type '(unsigned-byte 8))))
|
||||
(read-sequence result socket)
|
||||
result))
|
||||
|
||||
(declaim (ftype (function (t) string) read-str))
|
||||
(defun read-str (socket)
|
||||
"Read a null-terminated string from a stream. Takes care of encoding
|
||||
when UTF-8 support is enabled."
|
||||
(declare (type stream socket)
|
||||
#.*optimize*)
|
||||
(enc-read-string socket :null-terminated t))
|
||||
|
||||
(defun skip-bytes (socket length)
|
||||
"Skip a given number of bytes in a binary stream."
|
||||
(declare (type stream socket)
|
||||
(type (unsigned-byte 32) length)
|
||||
#.*optimize*)
|
||||
(dotimes (i length)
|
||||
(read-byte socket)))
|
||||
|
||||
(defun skip-str (socket)
|
||||
"Skip a null-terminated string."
|
||||
(declare (type stream socket)
|
||||
#.*optimize*)
|
||||
(loop :for char :of-type fixnum = (read-byte socket)
|
||||
:until (zerop char)))
|
||||
|
||||
(defun ensure-socket-is-closed (socket &key abort)
|
||||
(when (open-stream-p socket)
|
||||
(handler-case
|
||||
(close socket :abort abort)
|
||||
(error (error)
|
||||
(warn "Ignoring the error which happened while trying to close PostgreSQL socket: ~A" error)))))
|
||||
</textarea></form>
|
||||
<script>
|
||||
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {lineNumbers: true});
|
||||
</script>
|
||||
|
||||
<p><strong>MIME types defined:</strong> <code>text/x-common-lisp</code>.</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,10 +1,196 @@
|
||||
CodeMirror.defineMode("css", function(config) {
|
||||
var indentUnit = config.indentUnit, type;
|
||||
|
||||
var atMediaTypes = keySet([
|
||||
"all", "aural", "braille", "handheld", "print", "projection", "screen",
|
||||
"tty", "tv", "embossed"
|
||||
]);
|
||||
|
||||
var atMediaFeatures = keySet([
|
||||
"width", "min-width", "max-width", "height", "min-height", "max-height",
|
||||
"device-width", "min-device-width", "max-device-width", "device-height",
|
||||
"min-device-height", "max-device-height", "aspect-ratio",
|
||||
"min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio",
|
||||
"min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color",
|
||||
"max-color", "color-index", "min-color-index", "max-color-index",
|
||||
"monochrome", "min-monochrome", "max-monochrome", "resolution",
|
||||
"min-resolution", "max-resolution", "scan", "grid"
|
||||
]);
|
||||
|
||||
var propertyKeywords = keySet([
|
||||
"align-content", "align-items", "align-self", "alignment-adjust",
|
||||
"alignment-baseline", "anchor-point", "animation", "animation-delay",
|
||||
"animation-direction", "animation-duration", "animation-iteration-count",
|
||||
"animation-name", "animation-play-state", "animation-timing-function",
|
||||
"appearance", "azimuth", "backface-visibility", "background",
|
||||
"background-attachment", "background-clip", "background-color",
|
||||
"background-image", "background-origin", "background-position",
|
||||
"background-repeat", "background-size", "baseline-shift", "binding",
|
||||
"bleed", "bookmark-label", "bookmark-level", "bookmark-state",
|
||||
"bookmark-target", "border", "border-bottom", "border-bottom-color",
|
||||
"border-bottom-left-radius", "border-bottom-right-radius",
|
||||
"border-bottom-style", "border-bottom-width", "border-collapse",
|
||||
"border-color", "border-image", "border-image-outset",
|
||||
"border-image-repeat", "border-image-slice", "border-image-source",
|
||||
"border-image-width", "border-left", "border-left-color",
|
||||
"border-left-style", "border-left-width", "border-radius", "border-right",
|
||||
"border-right-color", "border-right-style", "border-right-width",
|
||||
"border-spacing", "border-style", "border-top", "border-top-color",
|
||||
"border-top-left-radius", "border-top-right-radius", "border-top-style",
|
||||
"border-top-width", "border-width", "bottom", "box-decoration-break",
|
||||
"box-shadow", "box-sizing", "break-after", "break-before", "break-inside",
|
||||
"caption-side", "clear", "clip", "color", "color-profile", "column-count",
|
||||
"column-fill", "column-gap", "column-rule", "column-rule-color",
|
||||
"column-rule-style", "column-rule-width", "column-span", "column-width",
|
||||
"columns", "content", "counter-increment", "counter-reset", "crop", "cue",
|
||||
"cue-after", "cue-before", "cursor", "direction", "display",
|
||||
"dominant-baseline", "drop-initial-after-adjust",
|
||||
"drop-initial-after-align", "drop-initial-before-adjust",
|
||||
"drop-initial-before-align", "drop-initial-size", "drop-initial-value",
|
||||
"elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis",
|
||||
"flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap",
|
||||
"float", "float-offset", "font", "font-feature-settings", "font-family",
|
||||
"font-kerning", "font-language-override", "font-size", "font-size-adjust",
|
||||
"font-stretch", "font-style", "font-synthesis", "font-variant",
|
||||
"font-variant-alternates", "font-variant-caps", "font-variant-east-asian",
|
||||
"font-variant-ligatures", "font-variant-numeric", "font-variant-position",
|
||||
"font-weight", "grid-cell", "grid-column", "grid-column-align",
|
||||
"grid-column-sizing", "grid-column-span", "grid-columns", "grid-flow",
|
||||
"grid-row", "grid-row-align", "grid-row-sizing", "grid-row-span",
|
||||
"grid-rows", "grid-template", "hanging-punctuation", "height", "hyphens",
|
||||
"icon", "image-orientation", "image-rendering", "image-resolution",
|
||||
"inline-box-align", "justify-content", "left", "letter-spacing",
|
||||
"line-break", "line-height", "line-stacking", "line-stacking-ruby",
|
||||
"line-stacking-shift", "line-stacking-strategy", "list-style",
|
||||
"list-style-image", "list-style-position", "list-style-type", "margin",
|
||||
"margin-bottom", "margin-left", "margin-right", "margin-top",
|
||||
"marker-offset", "marks", "marquee-direction", "marquee-loop",
|
||||
"marquee-play-count", "marquee-speed", "marquee-style", "max-height",
|
||||
"max-width", "min-height", "min-width", "move-to", "nav-down", "nav-index",
|
||||
"nav-left", "nav-right", "nav-up", "opacity", "order", "orphans", "outline",
|
||||
"outline-color", "outline-offset", "outline-style", "outline-width",
|
||||
"overflow", "overflow-style", "overflow-wrap", "overflow-x", "overflow-y",
|
||||
"padding", "padding-bottom", "padding-left", "padding-right", "padding-top",
|
||||
"page", "page-break-after", "page-break-before", "page-break-inside",
|
||||
"page-policy", "pause", "pause-after", "pause-before", "perspective",
|
||||
"perspective-origin", "pitch", "pitch-range", "play-during", "position",
|
||||
"presentation-level", "punctuation-trim", "quotes", "rendering-intent",
|
||||
"resize", "rest", "rest-after", "rest-before", "richness", "right",
|
||||
"rotation", "rotation-point", "ruby-align", "ruby-overhang",
|
||||
"ruby-position", "ruby-span", "size", "speak", "speak-as", "speak-header",
|
||||
"speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set",
|
||||
"tab-size", "table-layout", "target", "target-name", "target-new",
|
||||
"target-position", "text-align", "text-align-last", "text-decoration",
|
||||
"text-decoration-color", "text-decoration-line", "text-decoration-skip",
|
||||
"text-decoration-style", "text-emphasis", "text-emphasis-color",
|
||||
"text-emphasis-position", "text-emphasis-style", "text-height",
|
||||
"text-indent", "text-justify", "text-outline", "text-shadow",
|
||||
"text-space-collapse", "text-transform", "text-underline-position",
|
||||
"text-wrap", "top", "transform", "transform-origin", "transform-style",
|
||||
"transition", "transition-delay", "transition-duration",
|
||||
"transition-property", "transition-timing-function", "unicode-bidi",
|
||||
"vertical-align", "visibility", "voice-balance", "voice-duration",
|
||||
"voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress",
|
||||
"voice-volume", "volume", "white-space", "widows", "width", "word-break",
|
||||
"word-spacing", "word-wrap", "z-index"
|
||||
]);
|
||||
|
||||
var colorKeywords = keySet([
|
||||
"black", "silver", "gray", "white", "maroon", "red", "purple", "fuchsia",
|
||||
"green", "lime", "olive", "yellow", "navy", "blue", "teal", "aqua"
|
||||
]);
|
||||
|
||||
var valueKeywords = keySet([
|
||||
"above", "absolute", "activeborder", "activecaption", "afar",
|
||||
"after-white-space", "ahead", "alias", "all", "all-scroll", "alternate",
|
||||
"always", "amharic", "amharic-abegede", "antialiased", "appworkspace",
|
||||
"arabic-indic", "armenian", "asterisks", "auto", "avoid", "background",
|
||||
"backwards", "baseline", "below", "bidi-override", "binary", "bengali",
|
||||
"blink", "block", "block-axis", "bold", "bolder", "border", "border-box",
|
||||
"both", "bottom", "break-all", "break-word", "button", "button-bevel",
|
||||
"buttonface", "buttonhighlight", "buttonshadow", "buttontext", "cambodian",
|
||||
"capitalize", "caps-lock-indicator", "caption", "captiontext", "caret",
|
||||
"cell", "center", "checkbox", "circle", "cjk-earthly-branch",
|
||||
"cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote",
|
||||
"col-resize", "collapse", "compact", "condensed", "contain", "content",
|
||||
"content-box", "context-menu", "continuous", "copy", "cover", "crop",
|
||||
"cross", "crosshair", "currentcolor", "cursive", "dashed", "decimal",
|
||||
"decimal-leading-zero", "default", "default-button", "destination-atop",
|
||||
"destination-in", "destination-out", "destination-over", "devanagari",
|
||||
"disc", "discard", "document", "dot-dash", "dot-dot-dash", "dotted",
|
||||
"double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out",
|
||||
"element", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede",
|
||||
"ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er",
|
||||
"ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er",
|
||||
"ethiopic-halehame-aa-et", "ethiopic-halehame-am-et",
|
||||
"ethiopic-halehame-gez", "ethiopic-halehame-om-et",
|
||||
"ethiopic-halehame-sid-et", "ethiopic-halehame-so-et",
|
||||
"ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et",
|
||||
"ethiopic-halehame-tig", "ew-resize", "expanded", "extra-condensed",
|
||||
"extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "footnotes",
|
||||
"forwards", "from", "geometricPrecision", "georgian", "graytext", "groove",
|
||||
"gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hebrew",
|
||||
"help", "hidden", "hide", "higher", "highlight", "highlighttext",
|
||||
"hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "icon", "ignore",
|
||||
"inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite",
|
||||
"infobackground", "infotext", "inherit", "initial", "inline", "inline-axis",
|
||||
"inline-block", "inline-table", "inset", "inside", "intrinsic", "invert",
|
||||
"italic", "justify", "kannada", "katakana", "katakana-iroha", "khmer",
|
||||
"landscape", "lao", "large", "larger", "left", "level", "lighter",
|
||||
"line-through", "linear", "lines", "list-item", "listbox", "listitem",
|
||||
"local", "logical", "loud", "lower", "lower-alpha", "lower-armenian",
|
||||
"lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian",
|
||||
"lower-roman", "lowercase", "ltr", "malayalam", "match",
|
||||
"media-controls-background", "media-current-time-display",
|
||||
"media-fullscreen-button", "media-mute-button", "media-play-button",
|
||||
"media-return-to-realtime-button", "media-rewind-button",
|
||||
"media-seek-back-button", "media-seek-forward-button", "media-slider",
|
||||
"media-sliderthumb", "media-time-remaining-display", "media-volume-slider",
|
||||
"media-volume-slider-container", "media-volume-sliderthumb", "medium",
|
||||
"menu", "menulist", "menulist-button", "menulist-text",
|
||||
"menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic",
|
||||
"mix", "mongolian", "monospace", "move", "multiple", "myanmar", "n-resize",
|
||||
"narrower", "navy", "ne-resize", "nesw-resize", "no-close-quote", "no-drop",
|
||||
"no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap",
|
||||
"ns-resize", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote",
|
||||
"optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset",
|
||||
"outside", "overlay", "overline", "padding", "padding-box", "painted",
|
||||
"paused", "persian", "plus-darker", "plus-lighter", "pointer", "portrait",
|
||||
"pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button",
|
||||
"radio", "read-only", "read-write", "read-write-plaintext-only", "relative",
|
||||
"repeat", "repeat-x", "repeat-y", "reset", "reverse", "rgb", "rgba",
|
||||
"ridge", "right", "round", "row-resize", "rtl", "run-in", "running",
|
||||
"s-resize", "sans-serif", "scroll", "scrollbar", "se-resize", "searchfield",
|
||||
"searchfield-cancel-button", "searchfield-decoration",
|
||||
"searchfield-results-button", "searchfield-results-decoration",
|
||||
"semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama",
|
||||
"single", "skip-white-space", "slide", "slider-horizontal",
|
||||
"slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow",
|
||||
"small", "small-caps", "small-caption", "smaller", "solid", "somali",
|
||||
"source-atop", "source-in", "source-out", "source-over", "space", "square",
|
||||
"square-button", "start", "static", "status-bar", "stretch", "stroke",
|
||||
"sub", "subpixel-antialiased", "super", "sw-resize", "table",
|
||||
"table-caption", "table-cell", "table-column", "table-column-group",
|
||||
"table-footer-group", "table-header-group", "table-row", "table-row-group",
|
||||
"telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai",
|
||||
"thick", "thin", "threeddarkshadow", "threedface", "threedhighlight",
|
||||
"threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er",
|
||||
"tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top",
|
||||
"transparent", "ultra-condensed", "ultra-expanded", "underline", "up",
|
||||
"upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal",
|
||||
"upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url",
|
||||
"vertical", "vertical-text", "visible", "visibleFill", "visiblePainted",
|
||||
"visibleStroke", "visual", "w-resize", "wait", "wave", "white", "wider",
|
||||
"window", "windowframe", "windowtext", "x-large", "x-small", "xor",
|
||||
"xx-large", "xx-small", "yellow"
|
||||
]);
|
||||
|
||||
function keySet(array) { var keys = {}; for (var i = 0; i < array.length; ++i) keys[array[i]] = true; return keys; }
|
||||
function ret(style, tp) {type = tp; return style;}
|
||||
|
||||
function tokenBase(stream, state) {
|
||||
var ch = stream.next();
|
||||
if (ch == "@") {stream.eatWhile(/[\w\\\-]/); return ret("meta", stream.current());}
|
||||
if (ch == "@") {stream.eatWhile(/[\w\\\-]/); return ret("def", stream.current());}
|
||||
else if (ch == "/" && stream.eat("*")) {
|
||||
state.tokenize = tokenCComment;
|
||||
return tokenCComment(stream, state);
|
||||
@@ -31,15 +217,29 @@ CodeMirror.defineMode("css", function(config) {
|
||||
stream.eatWhile(/[\w.%]/);
|
||||
return ret("number", "unit");
|
||||
}
|
||||
else if (/[,.+>*\/]/.test(ch)) {
|
||||
else if (ch === "-") {
|
||||
if (/\d/.test(stream.peek())) {
|
||||
stream.eatWhile(/[\w.%]/);
|
||||
return ret("number", "unit");
|
||||
} else if (stream.match(/^[^-]+-/)) {
|
||||
return ret("meta", type);
|
||||
}
|
||||
}
|
||||
else if (/[,+>*\/]/.test(ch)) {
|
||||
return ret(null, "select-op");
|
||||
}
|
||||
else if (/[;{}:\[\]]/.test(ch)) {
|
||||
else if (ch == "." && stream.match(/^\w+/)) {
|
||||
return ret("qualifier", type);
|
||||
}
|
||||
else if (ch == ":") {
|
||||
return ret("operator", ch);
|
||||
}
|
||||
else if (/[;{}\[\]\(\)]/.test(ch)) {
|
||||
return ret(null, ch);
|
||||
}
|
||||
else {
|
||||
stream.eatWhile(/[\w\\\-]/);
|
||||
return ret("variable", "variable");
|
||||
return ret("property", "variable");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,32 +288,156 @@ CodeMirror.defineMode("css", function(config) {
|
||||
},
|
||||
|
||||
token: function(stream, state) {
|
||||
|
||||
// Use these terms when applicable (see http://www.xanthir.com/blog/b4E50)
|
||||
//
|
||||
// rule** or **ruleset:
|
||||
// A selector + braces combo, or an at-rule.
|
||||
//
|
||||
// declaration block:
|
||||
// A sequence of declarations.
|
||||
//
|
||||
// declaration:
|
||||
// A property + colon + value combo.
|
||||
//
|
||||
// property value:
|
||||
// The entire value of a property.
|
||||
//
|
||||
// component value:
|
||||
// A single piece of a property value. Like the 5px in
|
||||
// text-shadow: 0 0 5px blue;. Can also refer to things that are
|
||||
// multiple terms, like the 1-4 terms that make up the background-size
|
||||
// portion of the background shorthand.
|
||||
//
|
||||
// term:
|
||||
// The basic unit of author-facing CSS, like a single number (5),
|
||||
// dimension (5px), string ("foo"), or function. Officially defined
|
||||
// by the CSS 2.1 grammar (look for the 'term' production)
|
||||
//
|
||||
//
|
||||
// simple selector:
|
||||
// A single atomic selector, like a type selector, an attr selector, a
|
||||
// class selector, etc.
|
||||
//
|
||||
// compound selector:
|
||||
// One or more simple selectors without a combinator. div.example is
|
||||
// compound, div > .example is not.
|
||||
//
|
||||
// complex selector:
|
||||
// One or more compound selectors chained with combinators.
|
||||
//
|
||||
// combinator:
|
||||
// The parts of selectors that express relationships. There are four
|
||||
// currently - the space (descendant combinator), the greater-than
|
||||
// bracket (child combinator), the plus sign (next sibling combinator),
|
||||
// and the tilda (following sibling combinator).
|
||||
//
|
||||
// sequence of selectors:
|
||||
// One or more of the named type of selector chained with commas.
|
||||
|
||||
if (stream.eatSpace()) return null;
|
||||
var style = state.tokenize(stream, state);
|
||||
|
||||
// Changing style returned based on context
|
||||
var context = state.stack[state.stack.length-1];
|
||||
if (type == "hash" && context != "rule") style = "string-2";
|
||||
else if (style == "variable") {
|
||||
if (context == "rule") style = "number";
|
||||
else if (!context || context == "@media{") style = "tag";
|
||||
if (style == "property") {
|
||||
if (context == "propertyValue"){
|
||||
if (valueKeywords[stream.current()]) {
|
||||
style = "string-2";
|
||||
} else if (colorKeywords[stream.current()]) {
|
||||
style = "keyword";
|
||||
} else {
|
||||
style = "variable-2";
|
||||
}
|
||||
} else if (context == "rule") {
|
||||
if (!propertyKeywords[stream.current()]) {
|
||||
style += " error";
|
||||
}
|
||||
} else if (!context || context == "@media{") {
|
||||
style = "tag";
|
||||
} else if (context == "@media") {
|
||||
if (atMediaTypes[stream.current()]) {
|
||||
style = "attribute"; // Known attribute
|
||||
} else if (/^(only|not)$/i.test(stream.current())) {
|
||||
style = "keyword";
|
||||
} else if (stream.current().toLowerCase() == "and") {
|
||||
style = "error"; // "and" is only allowed in @mediaType
|
||||
} else if (atMediaFeatures[stream.current()]) {
|
||||
style = "error"; // Known property, should be in @mediaType(
|
||||
} else {
|
||||
// Unknown, expecting keyword or attribute, assuming attribute
|
||||
style = "attribute error";
|
||||
}
|
||||
} else if (context == "@mediaType") {
|
||||
if (atMediaTypes[stream.current()]) {
|
||||
style = "attribute";
|
||||
} else if (stream.current().toLowerCase() == "and") {
|
||||
style = "operator";
|
||||
} else if (/^(only|not)$/i.test(stream.current())) {
|
||||
style = "error"; // Only allowed in @media
|
||||
} else if (atMediaFeatures[stream.current()]) {
|
||||
style = "error"; // Known property, should be in parentheses
|
||||
} else {
|
||||
// Unknown attribute or property, but expecting property (preceded
|
||||
// by "and"). Should be in parentheses
|
||||
style = "error";
|
||||
}
|
||||
} else if (context == "@mediaType(") {
|
||||
if (propertyKeywords[stream.current()]) {
|
||||
// do nothing, remains "property"
|
||||
} else if (atMediaTypes[stream.current()]) {
|
||||
style = "error"; // Known property, should be in parentheses
|
||||
} else if (stream.current().toLowerCase() == "and") {
|
||||
style = "operator";
|
||||
} else if (/^(only|not)$/i.test(stream.current())) {
|
||||
style = "error"; // Only allowed in @media
|
||||
} else {
|
||||
style += " error";
|
||||
}
|
||||
} else {
|
||||
style = "error";
|
||||
}
|
||||
} else if (style == "atom") {
|
||||
if(!context || context == "@media{") {
|
||||
style = "builtin";
|
||||
} else if (context == "propertyValue") {
|
||||
if (!/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(stream.current())) {
|
||||
style += " error";
|
||||
}
|
||||
} else {
|
||||
style = "error";
|
||||
}
|
||||
} else if (context == "@media" && type == "{") {
|
||||
style = "error";
|
||||
}
|
||||
|
||||
if (context == "rule" && /^[\{\};]$/.test(type))
|
||||
state.stack.pop();
|
||||
// Push/pop context stack
|
||||
if (type == "{") {
|
||||
if (context == "@media") state.stack[state.stack.length-1] = "@media{";
|
||||
else state.stack.push("{");
|
||||
if (context == "@media" || context == "@mediaType") {
|
||||
state.stack.pop();
|
||||
state.stack[state.stack.length-1] = "@media{";
|
||||
}
|
||||
else state.stack.push("rule");
|
||||
}
|
||||
else if (type == "}") {
|
||||
state.stack.pop();
|
||||
if (context == "propertyValue") state.stack.pop();
|
||||
}
|
||||
else if (type == "}") state.stack.pop();
|
||||
else if (type == "@media") state.stack.push("@media");
|
||||
else if (context == "{" && type != "comment") state.stack.push("rule");
|
||||
else if (context == "@media" && /\b(keyword|attribute)\b/.test(style))
|
||||
state.stack.push("@mediaType");
|
||||
else if (context == "@mediaType" && stream.current() == ",") state.stack.pop();
|
||||
else if (context == "@mediaType" && type == "(") state.stack.push("@mediaType(");
|
||||
else if (context == "@mediaType(" && type == ")") state.stack.pop();
|
||||
else if (context == "rule" && type == ":") state.stack.push("propertyValue");
|
||||
else if (context == "propertyValue" && type == ";") state.stack.pop();
|
||||
return style;
|
||||
},
|
||||
|
||||
indent: function(state, textAfter) {
|
||||
var n = state.stack.length;
|
||||
if (/^\}/.test(textAfter))
|
||||
n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1;
|
||||
n -= state.stack[state.stack.length-1] == "propertyValue" ? 2 : 1;
|
||||
return state.baseIndent + n * indentUnit;
|
||||
},
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: CSS mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
@@ -51,5 +52,7 @@ code {
|
||||
|
||||
<p><strong>MIME types defined:</strong> <code>text/css</code>.</p>
|
||||
|
||||
<p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#css_*">normal</a>, <a href="../../test/index.html#verbose,css_*">verbose</a>.</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -0,0 +1,501 @@
|
||||
// Initiate ModeTest and set defaults
|
||||
var MT = ModeTest;
|
||||
MT.modeName = 'css';
|
||||
MT.modeOptions = {};
|
||||
|
||||
// Requires at least one media query
|
||||
MT.testMode(
|
||||
'atMediaEmpty',
|
||||
'@media { }',
|
||||
[
|
||||
'def', '@media',
|
||||
null, ' ',
|
||||
'error', '{',
|
||||
null, ' }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'atMediaMultiple',
|
||||
'@media not screen and (color), not print and (color) { }',
|
||||
[
|
||||
'def', '@media',
|
||||
null, ' ',
|
||||
'keyword', 'not',
|
||||
null, ' ',
|
||||
'attribute', 'screen',
|
||||
null, ' ',
|
||||
'operator', 'and',
|
||||
null, ' (',
|
||||
'property', 'color',
|
||||
null, '), ',
|
||||
'keyword', 'not',
|
||||
null, ' ',
|
||||
'attribute', 'print',
|
||||
null, ' ',
|
||||
'operator', 'and',
|
||||
null, ' (',
|
||||
'property', 'color',
|
||||
null, ') { }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'atMediaCheckStack',
|
||||
'@media screen { } foo { }',
|
||||
[
|
||||
'def', '@media',
|
||||
null, ' ',
|
||||
'attribute', 'screen',
|
||||
null, ' { } ',
|
||||
'tag', 'foo',
|
||||
null, ' { }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'atMediaCheckStack',
|
||||
'@media screen (color) { } foo { }',
|
||||
[
|
||||
'def', '@media',
|
||||
null, ' ',
|
||||
'attribute', 'screen',
|
||||
null, ' (',
|
||||
'property', 'color',
|
||||
null, ') { } ',
|
||||
'tag', 'foo',
|
||||
null, ' { }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'atMediaCheckStackInvalidAttribute',
|
||||
'@media foobarhello { } foo { }',
|
||||
[
|
||||
'def', '@media',
|
||||
null, ' ',
|
||||
'attribute error', 'foobarhello',
|
||||
null, ' { } ',
|
||||
'tag', 'foo',
|
||||
null, ' { }'
|
||||
]
|
||||
);
|
||||
|
||||
// Error, because "and" is only allowed immediately preceding a media expression
|
||||
MT.testMode(
|
||||
'atMediaInvalidAttribute',
|
||||
'@media foobarhello { }',
|
||||
[
|
||||
'def', '@media',
|
||||
null, ' ',
|
||||
'attribute error', 'foobarhello',
|
||||
null, ' { }'
|
||||
]
|
||||
);
|
||||
|
||||
// Error, because "and" is only allowed immediately preceding a media expression
|
||||
MT.testMode(
|
||||
'atMediaInvalidAnd',
|
||||
'@media and screen { }',
|
||||
[
|
||||
'def', '@media',
|
||||
null, ' ',
|
||||
'error', 'and',
|
||||
null, ' ',
|
||||
'attribute', 'screen',
|
||||
null, ' { }'
|
||||
]
|
||||
);
|
||||
|
||||
// Error, because "not" is only allowed as the first item in each media query
|
||||
MT.testMode(
|
||||
'atMediaInvalidNot',
|
||||
'@media screen not (not) { }',
|
||||
[
|
||||
'def', '@media',
|
||||
null, ' ',
|
||||
'attribute', 'screen',
|
||||
null, ' ',
|
||||
'error', 'not',
|
||||
null, ' (',
|
||||
'error', 'not',
|
||||
null, ') { }'
|
||||
]
|
||||
);
|
||||
|
||||
// Error, because "only" is only allowed as the first item in each media query
|
||||
MT.testMode(
|
||||
'atMediaInvalidOnly',
|
||||
'@media screen only (only) { }',
|
||||
[
|
||||
'def', '@media',
|
||||
null, ' ',
|
||||
'attribute', 'screen',
|
||||
null, ' ',
|
||||
'error', 'only',
|
||||
null, ' (',
|
||||
'error', 'only',
|
||||
null, ') { }'
|
||||
]
|
||||
);
|
||||
|
||||
// Error, because "foobarhello" is neither a known type or property, but
|
||||
// property was expected (after "and"), and it should be in parenthese.
|
||||
MT.testMode(
|
||||
'atMediaUnknownType',
|
||||
'@media screen and foobarhello { }',
|
||||
[
|
||||
'def', '@media',
|
||||
null, ' ',
|
||||
'attribute', 'screen',
|
||||
null, ' ',
|
||||
'operator', 'and',
|
||||
null, ' ',
|
||||
'error', 'foobarhello',
|
||||
null, ' { }'
|
||||
]
|
||||
);
|
||||
|
||||
// Error, because "color" is not a known type, but is a known property, and
|
||||
// should be in parentheses.
|
||||
MT.testMode(
|
||||
'atMediaInvalidType',
|
||||
'@media screen and color { }',
|
||||
[
|
||||
'def', '@media',
|
||||
null, ' ',
|
||||
'attribute', 'screen',
|
||||
null, ' ',
|
||||
'operator', 'and',
|
||||
null, ' ',
|
||||
'error', 'color',
|
||||
null, ' { }'
|
||||
]
|
||||
);
|
||||
|
||||
// Error, because "print" is not a known property, but is a known type,
|
||||
// and should not be in parenthese.
|
||||
MT.testMode(
|
||||
'atMediaInvalidProperty',
|
||||
'@media screen and (print) { }',
|
||||
[
|
||||
'def', '@media',
|
||||
null, ' ',
|
||||
'attribute', 'screen',
|
||||
null, ' ',
|
||||
'operator', 'and',
|
||||
null, ' (',
|
||||
'error', 'print',
|
||||
null, ') { }'
|
||||
]
|
||||
);
|
||||
|
||||
// Soft error, because "foobarhello" is not a known property or type.
|
||||
MT.testMode(
|
||||
'atMediaUnknownProperty',
|
||||
'@media screen and (foobarhello) { }',
|
||||
[
|
||||
'def', '@media',
|
||||
null, ' ',
|
||||
'attribute', 'screen',
|
||||
null, ' ',
|
||||
'operator', 'and',
|
||||
null, ' (',
|
||||
'property error', 'foobarhello',
|
||||
null, ') { }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagSelector',
|
||||
'foo { }',
|
||||
[
|
||||
'tag', 'foo',
|
||||
null, ' { }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'classSelector',
|
||||
'.foo { }',
|
||||
[
|
||||
'qualifier', '.foo',
|
||||
null, ' { }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'idSelector',
|
||||
'#foo { #foo }',
|
||||
[
|
||||
'builtin', '#foo',
|
||||
null, ' { ',
|
||||
'error', '#foo',
|
||||
null, ' }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagSelectorUnclosed',
|
||||
'foo { margin: 0 } bar { }',
|
||||
[
|
||||
'tag', 'foo',
|
||||
null, ' { ',
|
||||
'property', 'margin',
|
||||
'operator', ':',
|
||||
null, ' ',
|
||||
'number', '0',
|
||||
null, ' } ',
|
||||
'tag', 'bar',
|
||||
null, ' { }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagStringNoQuotes',
|
||||
'foo { font-family: hello world; }',
|
||||
[
|
||||
'tag', 'foo',
|
||||
null, ' { ',
|
||||
'property', 'font-family',
|
||||
'operator', ':',
|
||||
null, ' ',
|
||||
'variable-2', 'hello',
|
||||
null, ' ',
|
||||
'variable-2', 'world',
|
||||
null, '; }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagStringDouble',
|
||||
'foo { font-family: "hello world"; }',
|
||||
[
|
||||
'tag', 'foo',
|
||||
null, ' { ',
|
||||
'property', 'font-family',
|
||||
'operator', ':',
|
||||
null, ' ',
|
||||
'string', '"hello world"',
|
||||
null, '; }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagStringSingle',
|
||||
'foo { font-family: \'hello world\'; }',
|
||||
[
|
||||
'tag', 'foo',
|
||||
null, ' { ',
|
||||
'property', 'font-family',
|
||||
'operator', ':',
|
||||
null, ' ',
|
||||
'string', '\'hello world\'',
|
||||
null, '; }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagColorKeyword',
|
||||
'foo { color: black; }',
|
||||
[
|
||||
'tag', 'foo',
|
||||
null, ' { ',
|
||||
'property', 'color',
|
||||
'operator', ':',
|
||||
null, ' ',
|
||||
'keyword', 'black',
|
||||
null, '; }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagColorHex3',
|
||||
'foo { background: #fff; }',
|
||||
[
|
||||
'tag', 'foo',
|
||||
null, ' { ',
|
||||
'property', 'background',
|
||||
'operator', ':',
|
||||
null, ' ',
|
||||
'atom', '#fff',
|
||||
null, '; }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagColorHex6',
|
||||
'foo { background: #ffffff; }',
|
||||
[
|
||||
'tag', 'foo',
|
||||
null, ' { ',
|
||||
'property', 'background',
|
||||
'operator', ':',
|
||||
null, ' ',
|
||||
'atom', '#ffffff',
|
||||
null, '; }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagColorHex4',
|
||||
'foo { background: #ffff; }',
|
||||
[
|
||||
'tag', 'foo',
|
||||
null, ' { ',
|
||||
'property', 'background',
|
||||
'operator', ':',
|
||||
null, ' ',
|
||||
'atom error', '#ffff',
|
||||
null, '; }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagColorHexInvalid',
|
||||
'foo { background: #ffg; }',
|
||||
[
|
||||
'tag', 'foo',
|
||||
null, ' { ',
|
||||
'property', 'background',
|
||||
'operator', ':',
|
||||
null, ' ',
|
||||
'atom error', '#ffg',
|
||||
null, '; }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagNegativeNumber',
|
||||
'foo { margin: -5px; }',
|
||||
[
|
||||
'tag', 'foo',
|
||||
null, ' { ',
|
||||
'property', 'margin',
|
||||
'operator', ':',
|
||||
null, ' ',
|
||||
'number', '-5px',
|
||||
null, '; }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagPositiveNumber',
|
||||
'foo { padding: 5px; }',
|
||||
[
|
||||
'tag', 'foo',
|
||||
null, ' { ',
|
||||
'property', 'padding',
|
||||
'operator', ':',
|
||||
null, ' ',
|
||||
'number', '5px',
|
||||
null, '; }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagVendor',
|
||||
'foo { -foo-box-sizing: -foo-border-box; }',
|
||||
[
|
||||
'tag', 'foo',
|
||||
null, ' { ',
|
||||
'meta', '-foo-',
|
||||
'property', 'box-sizing',
|
||||
'operator', ':',
|
||||
null, ' ',
|
||||
'meta', '-foo-',
|
||||
'string-2', 'border-box',
|
||||
null, '; }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagBogusProperty',
|
||||
'foo { barhelloworld: 0; }',
|
||||
[
|
||||
'tag', 'foo',
|
||||
null, ' { ',
|
||||
'property error', 'barhelloworld',
|
||||
'operator', ':',
|
||||
null, ' ',
|
||||
'number', '0',
|
||||
null, '; }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagTwoProperties',
|
||||
'foo { margin: 0; padding: 0; }',
|
||||
[
|
||||
'tag', 'foo',
|
||||
null, ' { ',
|
||||
'property', 'margin',
|
||||
'operator', ':',
|
||||
null, ' ',
|
||||
'number', '0',
|
||||
null, '; ',
|
||||
'property', 'padding',
|
||||
'operator', ':',
|
||||
null, ' ',
|
||||
'number', '0',
|
||||
null, '; }'
|
||||
]
|
||||
);
|
||||
//
|
||||
//MT.testMode(
|
||||
// 'tagClass',
|
||||
// '@media only screen and (min-width: 500px), print {foo.bar#hello { color: black !important; background: #f00; margin: -5px; padding: 5px; -foo-box-sizing: border-box; } /* world */}',
|
||||
// [
|
||||
// 'def', '@media',
|
||||
// null, ' ',
|
||||
// 'keyword', 'only',
|
||||
// null, ' ',
|
||||
// 'attribute', 'screen',
|
||||
// null, ' ',
|
||||
// 'operator', 'and',
|
||||
// null, ' ',
|
||||
// 'bracket', '(',
|
||||
// 'property', 'min-width',
|
||||
// 'operator', ':',
|
||||
// null, ' ',
|
||||
// 'number', '500px',
|
||||
// 'bracket', ')',
|
||||
// null, ', ',
|
||||
// 'attribute', 'print',
|
||||
// null, ' {',
|
||||
// 'tag', 'foo',
|
||||
// 'qualifier', '.bar',
|
||||
// 'header', '#hello',
|
||||
// null, ' { ',
|
||||
// 'property', 'color',
|
||||
// 'operator', ':',
|
||||
// null, ' ',
|
||||
// 'keyword', 'black',
|
||||
// null, ' ',
|
||||
// 'keyword', '!important',
|
||||
// null, '; ',
|
||||
// 'property', 'background',
|
||||
// 'operator', ':',
|
||||
// null, ' ',
|
||||
// 'atom', '#f00',
|
||||
// null, '; ',
|
||||
// 'property', 'padding',
|
||||
// 'operator', ':',
|
||||
// null, ' ',
|
||||
// 'number', '5px',
|
||||
// null, '; ',
|
||||
// 'property', 'margin',
|
||||
// 'operator', ':',
|
||||
// null, ' ',
|
||||
// 'number', '-5px',
|
||||
// null, '; ',
|
||||
// 'meta', '-foo-',
|
||||
// 'property', 'box-sizing',
|
||||
// 'operator', ':',
|
||||
// null, ' ',
|
||||
// 'string-2', 'border-box',
|
||||
// null, '; } ',
|
||||
// 'comment', '/* world */',
|
||||
// null, '}'
|
||||
// ]
|
||||
//);
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Diff mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -49,7 +49,7 @@ CodeMirror.defineMode("ecl", function(config) {
|
||||
}
|
||||
if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
|
||||
curPunc = ch;
|
||||
return null
|
||||
return null;
|
||||
}
|
||||
if (/\d/.test(ch)) {
|
||||
stream.eatWhile(/[\w\.]/);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Erlang mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -32,14 +32,14 @@ CodeMirror.defineMode("gfm", function(config, parserConfig) {
|
||||
|
||||
return function (lang) {
|
||||
return modes[lang] ? CodeMirror.getMode(config, modes[lang]) : null;
|
||||
}
|
||||
};
|
||||
}());
|
||||
|
||||
function markdown(stream, state) {
|
||||
// intercept fenced code blocks
|
||||
if (stream.sol() && stream.match(/^```([\w+#]*)/)) {
|
||||
// try switching mode
|
||||
state.localMode = getMode(RegExp.$1)
|
||||
state.localMode = getMode(RegExp.$1);
|
||||
if (state.localMode)
|
||||
state.localState = state.localMode.startState();
|
||||
|
||||
@@ -96,13 +96,14 @@ CodeMirror.defineMode("gfm", function(config, parserConfig) {
|
||||
},
|
||||
|
||||
copyState: function(state) {
|
||||
return {token: state.token, mode: state.mode, mdState: CodeMirror.copyState(mdMode, state.mdState),
|
||||
return {token: state.token, mdState: CodeMirror.copyState(mdMode, state.mdState),
|
||||
localMode: state.localMode,
|
||||
localState: state.localMode ? CodeMirror.copyState(state.localMode, state.localState) : null};
|
||||
},
|
||||
|
||||
token: function(stream, state) {
|
||||
/* Parse GFM double bracket links */
|
||||
var ch;
|
||||
if ((ch = stream.peek()) != undefined && ch == '[') {
|
||||
stream.next(); // Advance the stream
|
||||
|
||||
@@ -139,6 +140,11 @@ CodeMirror.defineMode("gfm", function(config, parserConfig) {
|
||||
}
|
||||
|
||||
return state.token(stream, state);
|
||||
},
|
||||
|
||||
innerMode: function(state) {
|
||||
if (state.token == markdown) return {state: state.mdState, mode: mdMode};
|
||||
else return {state: state.localState, mode: state.localMode};
|
||||
}
|
||||
}
|
||||
};
|
||||
}, "markdown");
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: GFM mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -47,7 +47,7 @@ CodeMirror.defineMode("go", function(config, parserConfig) {
|
||||
}
|
||||
if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
|
||||
curPunc = ch;
|
||||
return null
|
||||
return null;
|
||||
}
|
||||
if (ch == "/") {
|
||||
if (stream.eat("*")) {
|
||||
@@ -144,7 +144,7 @@ CodeMirror.defineMode("go", function(config, parserConfig) {
|
||||
if (curPunc == "{") pushContext(state, stream.column(), "}");
|
||||
else if (curPunc == "[") pushContext(state, stream.column(), "]");
|
||||
else if (curPunc == "(") pushContext(state, stream.column(), ")");
|
||||
else if (curPunc == "case") ctx.type = "case"
|
||||
else if (curPunc == "case") ctx.type = "case";
|
||||
else if (curPunc == "}" && ctx.type == "}") ctx = popContext(state);
|
||||
else if (curPunc == ctx.type) popContext(state);
|
||||
state.startOfLine = false;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Go mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<link rel="stylesheet" href="../../theme/elegant.css">
|
||||
|
||||
@@ -21,7 +21,7 @@ CodeMirror.defineMode("groovy", function(config, parserConfig) {
|
||||
}
|
||||
if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
|
||||
curPunc = ch;
|
||||
return null
|
||||
return null;
|
||||
}
|
||||
if (/\d/.test(ch)) {
|
||||
stream.eatWhile(/[\w\.]/);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Groovy mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -128,7 +128,7 @@ CodeMirror.defineMode("haskell", function(cmCfg, modeCfg) {
|
||||
}
|
||||
setState(ncomment(type, currNest));
|
||||
return type;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function stringLiteral(source, setState) {
|
||||
@@ -170,7 +170,7 @@ CodeMirror.defineMode("haskell", function(cmCfg, modeCfg) {
|
||||
return function () {
|
||||
for (var i = 0; i < arguments.length; i++)
|
||||
wkw[arguments[i]] = t;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
setType("keyword")(
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Haskell mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -6,7 +6,7 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
|
||||
var keywords = function(){
|
||||
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 operator = kw("operator"), atom = {type: "atom", style: "atom"}, attribute = {type:"attribute", style: "attribute"};
|
||||
var type = kw("typedef");
|
||||
return {
|
||||
"if": A, "while": A, "else": B, "do": B, "try": B,
|
||||
@@ -219,7 +219,7 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
|
||||
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)
|
||||
state.lexical = new HaxeLexical(state.indented, cx.stream.column(), type, null, state.lexical, info);
|
||||
};
|
||||
result.lex = true;
|
||||
return result;
|
||||
@@ -243,7 +243,7 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
|
||||
}
|
||||
|
||||
function statement(type) {
|
||||
if (type == "@") return cont(metadef)
|
||||
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);
|
||||
@@ -297,7 +297,7 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
|
||||
function metadef(type, value) {
|
||||
if(type == ":") return cont(metadef);
|
||||
if(type == "variable") return cont(metadef);
|
||||
if(type == "(") return cont(pushlex(")"), comasep(metaargs, ")"), poplex, statement)
|
||||
if(type == "(") return cont(pushlex(")"), comasep(metaargs, ")"), poplex, statement);
|
||||
}
|
||||
function metaargs(type, value) {
|
||||
if(typ == "variable") return cont();
|
||||
@@ -421,9 +421,6 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
|
||||
else if (lexical.align) return lexical.column + (closing ? 0 : 1);
|
||||
else return lexical.indented + (closing ? 0 : indentUnit);
|
||||
},
|
||||
compareStates: function(state1, state2) {
|
||||
return (state1.localVars == state2.localVars) && (state1.context == state2.context);
|
||||
},
|
||||
|
||||
electricChars: "{}"
|
||||
};
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Haxe mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -36,7 +36,7 @@ CodeMirror.defineMode("htmlembedded", function(config, parserConfig) {
|
||||
token : parserConfig.startOpen ? scriptingDispatch : htmlDispatch,
|
||||
htmlState : htmlMixedMode.startState(),
|
||||
scriptState : scriptingMode.startState()
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
token: function(stream, state) {
|
||||
@@ -55,12 +55,16 @@ CodeMirror.defineMode("htmlembedded", function(config, parserConfig) {
|
||||
token : state.token,
|
||||
htmlState : CodeMirror.copyState(htmlMixedMode, state.htmlState),
|
||||
scriptState : CodeMirror.copyState(scriptingMode, state.scriptState)
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
electricChars: "/{}:",
|
||||
|
||||
electricChars: "/{}:"
|
||||
}
|
||||
innerMode: function(state) {
|
||||
if (state.token == scriptingDispatch) return {state: state.scriptState, mode: scriptingMode};
|
||||
else return {state: state.htmlState, mode: htmlMixedMode};
|
||||
}
|
||||
};
|
||||
}, "htmlmixed");
|
||||
|
||||
CodeMirror.defineMIME("application/x-ejs", { name: "htmlembedded", scriptingModeSpec:"javascript"});
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Html Embedded Scripts mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
CodeMirror.defineMode("htmlmixed", function(config, parserConfig) {
|
||||
CodeMirror.defineMode("htmlmixed", function(config) {
|
||||
var htmlMode = CodeMirror.getMode(config, {name: "xml", htmlMode: true});
|
||||
var jsMode = CodeMirror.getMode(config, "javascript");
|
||||
var cssMode = CodeMirror.getMode(config, "css");
|
||||
@@ -9,27 +9,28 @@ CodeMirror.defineMode("htmlmixed", function(config, parserConfig) {
|
||||
if (/^script$/i.test(state.htmlState.context.tagName)) {
|
||||
state.token = javascript;
|
||||
state.localState = jsMode.startState(htmlMode.indent(state.htmlState, ""));
|
||||
state.mode = "javascript";
|
||||
}
|
||||
else if (/^style$/i.test(state.htmlState.context.tagName)) {
|
||||
state.token = css;
|
||||
state.localState = cssMode.startState(htmlMode.indent(state.htmlState, ""));
|
||||
state.mode = "css";
|
||||
}
|
||||
}
|
||||
return style;
|
||||
}
|
||||
function maybeBackup(stream, pat, style) {
|
||||
var cur = stream.current();
|
||||
var close = cur.search(pat);
|
||||
var close = cur.search(pat), m;
|
||||
if (close > -1) stream.backUp(cur.length - close);
|
||||
else if (m = cur.match(/<\/?$/)) {
|
||||
stream.backUp(cur[0].length);
|
||||
if (!stream.match(pat, false)) stream.match(cur[0]);
|
||||
}
|
||||
return style;
|
||||
}
|
||||
function javascript(stream, state) {
|
||||
if (stream.match(/^<\/\s*script\s*>/i, false)) {
|
||||
state.token = html;
|
||||
state.localState = null;
|
||||
state.mode = "html";
|
||||
return html(stream, state);
|
||||
}
|
||||
return maybeBackup(stream, /<\/\s*script\s*>/,
|
||||
@@ -39,7 +40,6 @@ CodeMirror.defineMode("htmlmixed", function(config, parserConfig) {
|
||||
if (stream.match(/^<\/\s*style\s*>/i, false)) {
|
||||
state.token = html;
|
||||
state.localState = null;
|
||||
state.mode = "html";
|
||||
return html(stream, state);
|
||||
}
|
||||
return maybeBackup(stream, /<\/\s*style\s*>/,
|
||||
@@ -72,14 +72,13 @@ CodeMirror.defineMode("htmlmixed", function(config, parserConfig) {
|
||||
return cssMode.indent(state.localState, textAfter);
|
||||
},
|
||||
|
||||
compareStates: function(a, b) {
|
||||
if (a.mode != b.mode) return false;
|
||||
if (a.localState) return CodeMirror.Pass;
|
||||
return htmlMode.compareStates(a.htmlState, b.htmlState);
|
||||
},
|
||||
electricChars: "/{}:",
|
||||
|
||||
electricChars: "/{}:"
|
||||
}
|
||||
innerMode: function(state) {
|
||||
var mode = state.token == html ? htmlMode : state.token == javascript ? jsMode : cssMode;
|
||||
return {state: state.localState || state.htmlState, mode: mode};
|
||||
}
|
||||
};
|
||||
}, "xml", "javascript", "css");
|
||||
|
||||
CodeMirror.defineMIME("text/html", "htmlmixed");
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: HTML mixed mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: JavaScript mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -175,8 +175,8 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
||||
|
||||
var defaultVars = {name: "this", next: {name: "arguments"}};
|
||||
function pushcontext() {
|
||||
if (!cx.state.context) cx.state.localVars = defaultVars;
|
||||
cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
|
||||
cx.state.localVars = defaultVars;
|
||||
}
|
||||
function popcontext() {
|
||||
cx.state.localVars = cx.state.context.vars;
|
||||
@@ -185,7 +185,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
||||
function pushlex(type, info) {
|
||||
var result = function() {
|
||||
var state = cx.state;
|
||||
state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info)
|
||||
state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info);
|
||||
};
|
||||
result.lex = true;
|
||||
return result;
|
||||
@@ -243,7 +243,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
||||
|
||||
function maybeoperator(type, value) {
|
||||
if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator);
|
||||
if (type == "operator" || type == ":") return cont(expression);
|
||||
if (type == "operator" && value == "?") return cont(expression, expect(":"), expression);
|
||||
if (type == ";") return;
|
||||
if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator);
|
||||
if (type == ".") return cont(property, maybeoperator);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Jinja2 mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: LESS mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
@@ -8,11 +9,132 @@
|
||||
<style>.CodeMirror {background: #f8f8f8; border: 1px solid #ddd; font-size:12px} .CodeMirror-scroll {height: 400px}</style>
|
||||
<link rel="stylesheet" href="../../doc/docs.css">
|
||||
<link rel="stylesheet" href="../../theme/lesser-dark.css">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
</head>
|
||||
<body>
|
||||
<h1>CodeMirror: LESS mode</h1>
|
||||
<form><textarea id="code" name="code">/* Some LESS code */
|
||||
<form><textarea id="code" name="code">@media screen and (device-aspect-ratio: 16/9) { … }
|
||||
@media screen and (device-aspect-ratio: 32/18) { … }
|
||||
@media screen and (device-aspect-ratio: 1280/720) { … }
|
||||
@media screen and (device-aspect-ratio: 2560/1440) { … }
|
||||
|
||||
html:lang(fr-be)
|
||||
html:lang(de)
|
||||
:lang(fr-be) > q
|
||||
:lang(de) > q
|
||||
|
||||
tr:nth-child(2n+1) /* represents every odd row of an HTML table */
|
||||
tr:nth-child(odd) /* same */
|
||||
tr:nth-child(2n+0) /* represents every even row of an HTML table */
|
||||
tr:nth-child(even) /* same */
|
||||
|
||||
/* Alternate paragraph colours in CSS */
|
||||
p:nth-child(4n+1) { color: navy; }
|
||||
p:nth-child(4n+2) { color: green; }
|
||||
p:nth-child(4n+3) { color: maroon; }
|
||||
p:nth-child(4n+4) { color: purple; }
|
||||
|
||||
:nth-child(10n-1) /* represents the 9th, 19th, 29th, etc, element */
|
||||
:nth-child(10n+9) /* Same */
|
||||
:nth-child(10n+-1) /* Syntactically invalid, and would be ignored */
|
||||
|
||||
:nth-child( 3n + 1 )
|
||||
:nth-child( +3n - 2 )
|
||||
:nth-child( -n+ 6)
|
||||
:nth-child( +6 )
|
||||
|
||||
html|tr:nth-child(-n+6) /* represents the 6 first rows of XHTML tables */
|
||||
|
||||
img:nth-of-type(2n+1) { float: right; }
|
||||
img:nth-of-type(2n) { float: left; }
|
||||
|
||||
body > h2:nth-of-type(n+2):nth-last-of-type(n+2)
|
||||
body > h2:not(:first-of-type):not(:last-of-type)
|
||||
|
||||
html|*:not(:link):not(:visited)
|
||||
*|*:not(:hover)
|
||||
p::first-line { text-transform: uppercase }
|
||||
|
||||
p { color: red; font-size: 12pt }
|
||||
p::first-letter { color: green; font-size: 200% }
|
||||
p::first-line { color: blue }
|
||||
|
||||
p { line-height: 1.1 }
|
||||
p::first-letter { font-size: 3em; font-weight: normal }
|
||||
span { font-weight: bold }
|
||||
|
||||
* /* a=0 b=0 c=0 -> specificity = 0 */
|
||||
LI /* a=0 b=0 c=1 -> specificity = 1 */
|
||||
UL LI /* a=0 b=0 c=2 -> specificity = 2 */
|
||||
UL OL+LI /* a=0 b=0 c=3 -> specificity = 3 */
|
||||
H1 + *[REL=up] /* a=0 b=1 c=1 -> specificity = 11 */
|
||||
UL OL LI.red /* a=0 b=1 c=3 -> specificity = 13 */
|
||||
LI.red.level /* a=0 b=2 c=1 -> specificity = 21 */
|
||||
#x34y /* a=1 b=0 c=0 -> specificity = 100 */
|
||||
#s12:not(FOO) /* a=1 b=0 c=1 -> specificity = 101 */
|
||||
|
||||
@namespace foo url(http://www.example.com);
|
||||
foo|h1 { color: blue } /* first rule */
|
||||
foo|* { color: yellow } /* second rule */
|
||||
|h1 { color: red } /* ...*/
|
||||
*|h1 { color: green }
|
||||
h1 { color: green }
|
||||
|
||||
span[hello="Ocean"][goodbye="Land"]
|
||||
|
||||
a[rel~="copyright"] { ... }
|
||||
a[href="http://www.w3.org/"] { ... }
|
||||
|
||||
DIALOGUE[character=romeo]
|
||||
DIALOGUE[character=juliet]
|
||||
|
||||
[att^=val]
|
||||
[att$=val]
|
||||
[att*=val]
|
||||
|
||||
@namespace foo "http://www.example.com";
|
||||
[foo|att=val] { color: blue }
|
||||
[*|att] { color: yellow }
|
||||
[|att] { color: green }
|
||||
[att] { color: green }
|
||||
|
||||
|
||||
*:target { color : red }
|
||||
*:target::before { content : url(target.png) }
|
||||
|
||||
E[foo]{
|
||||
padding:65px;
|
||||
}
|
||||
E[foo] ~ F{
|
||||
padding:65px;
|
||||
}
|
||||
E#myid{
|
||||
padding:65px;
|
||||
}
|
||||
input[type="search"]::-webkit-search-decoration,
|
||||
input[type="search"]::-webkit-search-cancel-button {
|
||||
-webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5
|
||||
}
|
||||
button::-moz-focus-inner,
|
||||
input::-moz-focus-inner { // Inner padding and border oddities in FF3/4
|
||||
padding: 0;
|
||||
border: 0;
|
||||
}
|
||||
.btn {
|
||||
// reset here as of 2.0.3 due to Recess property order
|
||||
border-color: #ccc;
|
||||
border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);
|
||||
}
|
||||
fieldset span button, fieldset span input[type="file"] {
|
||||
font-size:12px;
|
||||
font-family:Arial, Helvetica, sans-serif;
|
||||
}
|
||||
.el tr:nth-child(even):last-child td:first-child{
|
||||
-moz-border-radius-bottomleft:3px;
|
||||
-webkit-border-bottom-left-radius:3px;
|
||||
border-bottom-left-radius:3px;
|
||||
}
|
||||
|
||||
/* Some LESS code */
|
||||
|
||||
button {
|
||||
width: 32px;
|
||||
|
||||
@@ -1,25 +1,24 @@
|
||||
/*
|
||||
LESS mode - http://www.lesscss.org/
|
||||
Ported to CodeMirror by Peter Kroon
|
||||
Ported to CodeMirror by Peter Kroon <plakroon@gmail.com>
|
||||
Report bugs/issues here: https://github.com/marijnh/CodeMirror/issues GitHub: @peterkroon
|
||||
*/
|
||||
|
||||
CodeMirror.defineMode("less", function(config) {
|
||||
var indentUnit = config.indentUnit, type;
|
||||
function ret(style, tp) {type = tp; return style;}
|
||||
//html5 tags
|
||||
var tags = ["a","abbr","acronym","address","applet","area","article","aside","audio","b","base","basefont","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","command","datalist","dd","del","details","dfn","dir","div","dl","dt","em","embed","fieldset","figcaption","figure","font","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","keygen","kbd","label","legend","li","link","map","mark","menu","meta","meter","nav","noframes","noscript","object","ol","optgroup","option","output","p","param","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strike","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","tt","u","ul","var","video","wbr"];
|
||||
//html tags
|
||||
var tags = "a abbr acronym address applet area article aside audio b base basefont bdi bdo big blockquote body br button canvas caption cite code col colgroup command datalist dd del details dfn dir div dl dt em embed fieldset figcaption figure font footer form frame frameset h1 h2 h3 h4 h5 h6 head header hgroup hr html i iframe img input ins keygen kbd label legend li link map mark menu meta meter nav noframes noscript object ol optgroup option output p param pre progress q rp rt ruby s samp script section select small source span strike strong style sub summary sup table tbody td textarea tfoot th thead time title tr track tt u ul var video wbr".split(' ');
|
||||
|
||||
function inTagsArray(val){
|
||||
for(var i=0; i<tags.length; i++){
|
||||
if(val === tags[i]){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
for(var i=0; i<tags.length; i++)if(val === tags[i])return true;
|
||||
}
|
||||
|
||||
|
||||
var selectors = /(^\:root$|^\:nth\-child$|^\:nth\-last\-child$|^\:nth\-of\-type$|^\:nth\-last\-of\-type$|^\:first\-child$|^\:last\-child$|^\:first\-of\-type$|^\:last\-of\-type$|^\:only\-child$|^\:only\-of\-type$|^\:empty$|^\:link|^\:visited$|^\:active$|^\:hover$|^\:focus$|^\:target$|^\:lang$|^\:enabled^\:disabled$|^\:checked$|^\:first\-line$|^\:first\-letter$|^\:before$|^\:after$|^\:not$|^\:required$|^\:invalid$)/;
|
||||
|
||||
function tokenBase(stream, state) {
|
||||
var ch = stream.next();
|
||||
|
||||
|
||||
if (ch == "@") {stream.eatWhile(/[\w\-]/); return ret("meta", stream.current());}
|
||||
else if (ch == "/" && stream.eat("*")) {
|
||||
state.tokenize = tokenCComment;
|
||||
@@ -30,19 +29,20 @@ CodeMirror.defineMode("less", function(config) {
|
||||
return tokenSGMLComment(stream, state);
|
||||
}
|
||||
else if (ch == "=") ret(null, "compare");
|
||||
else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare");
|
||||
else if (ch == "|" && stream.eat("=")) return ret(null, "compare");
|
||||
else if (ch == "\"" || ch == "'") {
|
||||
state.tokenize = tokenString(ch);
|
||||
return state.tokenize(stream, state);
|
||||
}
|
||||
else if (ch == "/") { // lesscss e.g.: .png will not be parsed as a class
|
||||
else if (ch == "/") { // e.g.: .png will not be parsed as a class
|
||||
if(stream.eat("/")){
|
||||
state.tokenize = tokenSComment;
|
||||
return tokenSComment(stream, state);
|
||||
}else{
|
||||
stream.eatWhile(/[\a-zA-Z0-9\-_.\s]/);
|
||||
if(/\/|\)|#/.test(stream.peek() || stream.eol() || (stream.eatSpace() && stream.peek() == ")")))return ret("string", "string");//let url(/images/logo.png) without quotes return as string
|
||||
return ret("number", "unit");
|
||||
if(type == "string" || type == "(")return ret("string", "string");
|
||||
if(state.stack[state.stack.length-1] != undefined)return ret(null, ch);
|
||||
stream.eatWhile(/[\a-zA-Z0-9\-_.\s]/);
|
||||
if( /\/|\)|#/.test(stream.peek() || (stream.eatSpace() && stream.peek() == ")")) || stream.eol() )return ret("string", "string"); // let url(/images/logo.png) without quotes return as string
|
||||
}
|
||||
}
|
||||
else if (ch == "!") {
|
||||
@@ -53,30 +53,42 @@ CodeMirror.defineMode("less", function(config) {
|
||||
stream.eatWhile(/[\w.%]/);
|
||||
return ret("number", "unit");
|
||||
}
|
||||
else if (/[,+<>*\/]/.test(ch)) {//removed . dot character original was [,.+>*\/]
|
||||
else if (/[,+<>*\/]/.test(ch)) {
|
||||
if(stream.peek() == "=" || type == "a")return ret("string", "string");
|
||||
return ret(null, "select-op");
|
||||
}
|
||||
else if (/[;{}:\[\]()]/.test(ch)) { //added () char for lesscss original was [;{}:\[\]]
|
||||
if(ch == ":"){
|
||||
stream.eatWhile(/[active|hover|link|visited]/);
|
||||
if( stream.current().match(/active|hover|link|visited/)){
|
||||
else if (/[;{}:\[\]()~\|]/.test(ch)) {
|
||||
if(ch == ":"){
|
||||
stream.eatWhile(/[a-z\\\-]/);
|
||||
if( selectors.test(stream.current()) ){
|
||||
return ret("tag", "tag");
|
||||
}else if(stream.peek() == ":"){//::-webkit-search-decoration
|
||||
stream.next();
|
||||
stream.eatWhile(/[a-z\\\-]/);
|
||||
if(stream.current().match(/\:\:\-(o|ms|moz|webkit)\-/))return ret("string", "string");
|
||||
if( selectors.test(stream.current().substring(1)) )return ret("tag", "tag");
|
||||
return ret(null, ch);
|
||||
}else{
|
||||
return ret(null, ch);
|
||||
}
|
||||
}else if(ch == "~"){
|
||||
if(type == "r")return ret("string", "string");
|
||||
}else{
|
||||
return ret(null, ch);
|
||||
}
|
||||
}
|
||||
else if (ch == ".") { // lesscss
|
||||
else if (ch == ".") {
|
||||
if(type == "(" || type == "string")return ret("string", "string"); // allow url(../image.png)
|
||||
stream.eatWhile(/[\a-zA-Z0-9\-_]/);
|
||||
if(stream.peek() == " ")stream.eatSpace();
|
||||
if(stream.peek() == ")")return ret("number", "unit");//rgba(0,0,0,.25);
|
||||
return ret("tag", "tag");
|
||||
}
|
||||
else if (ch == "#") { // lesscss
|
||||
else if (ch == "#") {
|
||||
//we don't eat white-space, we want the hex color and or id only
|
||||
stream.eatWhile(/[A-Za-z0-9]/);
|
||||
//check if there is a proper hex color length e.g. #eee || #eeeEEE
|
||||
if(stream.current().length ===4 || stream.current().length ===7){
|
||||
if(stream.current().length == 4 || stream.current().length == 7){
|
||||
if(stream.current().match(/[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}/,false) != null){//is there a valid hex color value present in the current stream
|
||||
//when not a valid hex value, parse as id
|
||||
if(stream.current().substring(1) != stream.current().match(/[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}/,false))return ret("atom", "tag");
|
||||
@@ -96,8 +108,8 @@ CodeMirror.defineMode("less", function(config) {
|
||||
stream.eatWhile(/[\w\\\-]/);
|
||||
return ret("atom", "tag");
|
||||
}
|
||||
}else{
|
||||
stream.eatWhile(/[\w\\\-]/);
|
||||
}else{//when not a valid hexvalue length
|
||||
stream.eatWhile(/[\w\\\-]/);
|
||||
return ret("atom", "tag");
|
||||
}
|
||||
}
|
||||
@@ -107,39 +119,62 @@ CodeMirror.defineMode("less", function(config) {
|
||||
}
|
||||
else {
|
||||
stream.eatWhile(/[\w\\\-_%.{]/);
|
||||
if(stream.current().match(/http|https/) != null){
|
||||
if(type == "string"){
|
||||
return ret("string", "string");
|
||||
}else if(stream.current().match(/(^http$|^https$)/) != null){
|
||||
stream.eatWhile(/[\w\\\-_%.{:\/]/);
|
||||
return ret("string", "string");
|
||||
}else if(stream.peek() == "<" || stream.peek() == ">"){
|
||||
return ret("tag", "tag");
|
||||
}else if( stream.peek().match(/\(/) != null ){// lessc
|
||||
}else if( /\(/.test(stream.peek()) ){
|
||||
return ret(null, ch);
|
||||
}else if (stream.peek() == "/" && state.stack[state.stack.length-1] != undefined){ // url(dir/center/image.png)
|
||||
return ret("string", "string");
|
||||
}else if( stream.current().match(/\-\d|\-.\d/) ){ // lesscss match e.g.: -5px -0.4 etc... only colorize the minus sign
|
||||
//stream.backUp(stream.current().length-1); //commment out these 2 comment if you want the minus sign to be parsed as null -500px
|
||||
//return ret(null, ch);
|
||||
}else if( stream.current().match(/\-\d|\-.\d/) ){ // match e.g.: -5px -0.4 etc... only colorize the minus sign
|
||||
//commment out these 2 comment if you want the minus sign to be parsed as null -500px
|
||||
//stream.backUp(stream.current().length-1);
|
||||
//return ret(null, ch); //console.log( stream.current() );
|
||||
return ret("number", "unit");
|
||||
}else if( inTagsArray(stream.current()) ){ // lesscss match html tags
|
||||
}else if( inTagsArray(stream.current().toLowerCase()) ){ // match html tags
|
||||
return ret("tag", "tag");
|
||||
}else if( /\/|[\s\)]/.test(stream.peek() || stream.eol() || (stream.eatSpace() && stream.peek() == "/")) && stream.current().indexOf(".") !== -1){
|
||||
if(stream.current().substring(stream.current().length-1,stream.current().length) == "{"){
|
||||
stream.backUp(1);
|
||||
return ret("tag", "tag");
|
||||
}//end if
|
||||
if( (stream.eatSpace() && stream.peek().match(/[{<>.a-zA-Z]/) != null) || stream.eol() )return ret("tag", "tag");//e.g. button.icon-plus
|
||||
return ret("string", "string");//let url(/images/logo.png) without quotes return as string
|
||||
}else if( stream.eol() ){
|
||||
if(stream.current().substring(stream.current().length-1,stream.current().length) == "{")stream.backUp(1);
|
||||
return ret("tag", "tag");
|
||||
}else{
|
||||
return ret("variable", "variable");
|
||||
if(stream.current().substring(stream.current().length-1,stream.current().length) == "{"){
|
||||
stream.backUp(1);
|
||||
return ret("tag", "tag");
|
||||
}//end if
|
||||
stream.eatSpace();
|
||||
if( /[{<>.a-zA-Z\/]/.test(stream.peek()) || stream.eol() )return ret("tag", "tag"); // e.g. button.icon-plus
|
||||
return ret("string", "string"); // let url(/images/logo.png) without quotes return as string
|
||||
}else if( stream.eol() || stream.peek() == "[" || stream.peek() == "#" || type == "tag" ){
|
||||
if(stream.current().substring(stream.current().length-1,stream.current().length) == "{")stream.backUp(1);
|
||||
return ret("tag", "tag");
|
||||
}else if(type == "compare" || type == "a" || type == "("){
|
||||
return ret("string", "string");
|
||||
}else if(type == "|" || stream.current() == "-" || type == "["){
|
||||
return ret(null, ch);
|
||||
}else if(stream.peek() == ":") {
|
||||
stream.next();
|
||||
var t_v = stream.peek() == ":" ? true : false;
|
||||
if(!t_v){
|
||||
var old_pos = stream.pos;
|
||||
var sc = stream.current().length;
|
||||
stream.eatWhile(/[a-z\\\-]/);
|
||||
var new_pos = stream.pos;
|
||||
if(stream.current().substring(sc-1).match(selectors) != null){
|
||||
stream.backUp(new_pos-(old_pos-1));
|
||||
return ret("tag", "tag");
|
||||
} else stream.backUp(new_pos-(old_pos-1));
|
||||
}else{
|
||||
stream.backUp(1);
|
||||
}
|
||||
if(t_v)return ret("tag", "tag"); else return ret("variable", "variable");
|
||||
}else{
|
||||
return ret("variable", "variable");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
function tokenSComment(stream, state) {// SComment = Slash comment
|
||||
|
||||
function tokenSComment(stream, state) { // SComment = Slash comment
|
||||
stream.skipToEnd();
|
||||
state.tokenize = tokenBase;
|
||||
return ret("comment", "comment");
|
||||
@@ -156,7 +191,7 @@ CodeMirror.defineMode("less", function(config) {
|
||||
}
|
||||
return ret("comment", "comment");
|
||||
}
|
||||
|
||||
|
||||
function tokenSGMLComment(stream, state) {
|
||||
var dashes = 0, ch;
|
||||
while ((ch = stream.next()) != null) {
|
||||
@@ -168,7 +203,7 @@ CodeMirror.defineMode("less", function(config) {
|
||||
}
|
||||
return ret("comment", "comment");
|
||||
}
|
||||
|
||||
|
||||
function tokenString(quote) {
|
||||
return function(stream, state) {
|
||||
var escaped = false, ch;
|
||||
@@ -181,29 +216,28 @@ CodeMirror.defineMode("less", function(config) {
|
||||
return ret("string", "string");
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
return {
|
||||
startState: function(base) {
|
||||
return {tokenize: tokenBase,
|
||||
baseIndent: base || 0,
|
||||
stack: []};
|
||||
},
|
||||
|
||||
|
||||
token: function(stream, state) {
|
||||
if (stream.eatSpace()) return null;
|
||||
var style = state.tokenize(stream, state);
|
||||
|
||||
|
||||
var context = state.stack[state.stack.length-1];
|
||||
if (type == "hash" && context == "rule") style = "atom";
|
||||
else if (style == "variable") {
|
||||
if (context == "rule") style = null; //"tag"
|
||||
else if (!context || context == "@media{"){
|
||||
style = stream.current() == "when" ? "variable" :
|
||||
stream.string.match(/#/g) != undefined ? null :
|
||||
/[\s,|\s\)]/.test(stream.peek()) ? "tag" : null;
|
||||
}
|
||||
else if (!context || context == "@media{") {
|
||||
style = stream.current() == "when" ? "variable" :
|
||||
/[\s,|\s\)|\s]/.test(stream.peek()) ? "tag" : type;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (context == "rule" && /^[\{\};]$/.test(type))
|
||||
state.stack.pop();
|
||||
if (type == "{") {
|
||||
@@ -215,18 +249,18 @@ CodeMirror.defineMode("less", function(config) {
|
||||
else if (context == "{" && type != "comment") state.stack.push("rule");
|
||||
return style;
|
||||
},
|
||||
|
||||
|
||||
indent: function(state, textAfter) {
|
||||
var n = state.stack.length;
|
||||
if (/^\}/.test(textAfter))
|
||||
n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1;
|
||||
return state.baseIndent + n * indentUnit;
|
||||
},
|
||||
|
||||
|
||||
electricChars: "}"
|
||||
};
|
||||
});
|
||||
|
||||
CodeMirror.defineMIME("text/x-less", "less");
|
||||
if (!CodeMirror.mimeModes.hasOwnProperty("text/css"))
|
||||
CodeMirror.defineMIME("text/css", "less");
|
||||
CodeMirror.defineMIME("text/css", "less");
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Lua mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Markdown mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
@@ -336,5 +337,7 @@ Output:
|
||||
|
||||
<p><strong>MIME types defined:</strong> <code>text/x-markdown</code>.</p>
|
||||
|
||||
<p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#markdown_*">normal</a>, <a href="../../test/index.html#verbose,markdown_*">verbose</a>.</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -2,12 +2,18 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
||||
|
||||
var htmlFound = CodeMirror.mimeModes.hasOwnProperty("text/html");
|
||||
var htmlMode = CodeMirror.getMode(cmCfg, htmlFound ? "text/html" : "text/plain");
|
||||
|
||||
var codeDepth = 0;
|
||||
var prevLineHasContent = false
|
||||
, thisLineHasContent = false;
|
||||
|
||||
var header = 'header'
|
||||
, code = 'comment'
|
||||
, quote = 'quote'
|
||||
, list = 'string'
|
||||
, hr = 'hr'
|
||||
, linkinline = 'link'
|
||||
, linkemail = 'link'
|
||||
, linktext = 'link'
|
||||
, linkhref = 'string'
|
||||
, em = 'em'
|
||||
@@ -17,8 +23,8 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
||||
var hrRE = /^([*\-=_])(?:\s*\1){2,}\s*$/
|
||||
, ulRE = /^[*\-+]\s+/
|
||||
, olRE = /^[0-9]+\.\s+/
|
||||
, headerRE = /^(?:\={3,}|-{3,})$/
|
||||
, textRE = /^[^\[*_\\<>`]+/;
|
||||
, headerRE = /^(?:\={1,}|-{1,})$/
|
||||
, textRE = /^[^\[*_\\<>` "'(]+/;
|
||||
|
||||
function switchInline(stream, state, f) {
|
||||
state.f = state.inline = f;
|
||||
@@ -34,10 +40,16 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
||||
// Blocks
|
||||
|
||||
function blankLine(state) {
|
||||
// Reset linkTitle state
|
||||
state.linkTitle = false;
|
||||
// Reset CODE state
|
||||
state.code = false;
|
||||
// Reset EM state
|
||||
state.em = false;
|
||||
// Reset STRONG state
|
||||
state.strong = false;
|
||||
// Reset state.quote
|
||||
state.quote = false;
|
||||
if (!htmlFound && state.f == htmlBlock) {
|
||||
state.f = inlineNormal;
|
||||
state.block = blockNormal;
|
||||
@@ -47,13 +59,23 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
||||
|
||||
function blockNormal(stream, state) {
|
||||
var match;
|
||||
|
||||
if (state.list !== false && state.indentationDiff >= 0) { // Continued list
|
||||
if (state.indentationDiff < 4) { // Only adjust indentation if *not* a code block
|
||||
state.indentation -= state.indentationDiff;
|
||||
}
|
||||
state.list = null;
|
||||
} else { // No longer a list
|
||||
state.list = false;
|
||||
}
|
||||
|
||||
if (state.indentationDiff >= 4) {
|
||||
state.indentation -= state.indentationDiff;
|
||||
state.indentation -= 4;
|
||||
stream.skipToEnd();
|
||||
return code;
|
||||
} else if (stream.eatSpace()) {
|
||||
return null;
|
||||
} else if (stream.peek() === '#' || stream.match(headerRE)) {
|
||||
} else if (stream.peek() === '#' || (prevLineHasContent && stream.match(headerRE)) ) {
|
||||
state.header = true;
|
||||
} else if (stream.eat('>')) {
|
||||
state.indentation++;
|
||||
@@ -63,8 +85,8 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
||||
} else if (stream.match(hrRE, true)) {
|
||||
return hr;
|
||||
} else if (match = stream.match(ulRE, true) || stream.match(olRE, true)) {
|
||||
state.indentation += match[0].length;
|
||||
return list;
|
||||
state.indentation += 4;
|
||||
state.list = true;
|
||||
}
|
||||
|
||||
return switchInline(stream, state, state.inline);
|
||||
@@ -92,8 +114,11 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
||||
if (state.strong) { styles.push(state.em ? emstrong : strong); }
|
||||
else if (state.em) { styles.push(em); }
|
||||
|
||||
if (state.code) { styles.push(code); }
|
||||
|
||||
if (state.header) { styles.push(header); }
|
||||
if (state.quote) { styles.push(quote); }
|
||||
if (state.list !== false) { styles.push(list); }
|
||||
|
||||
return styles.length ? styles.join(' ') : null;
|
||||
}
|
||||
@@ -106,22 +131,68 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
||||
}
|
||||
|
||||
function inlineNormal(stream, state) {
|
||||
var style = state.text(stream, state)
|
||||
var style = state.text(stream, state);
|
||||
if (typeof style !== 'undefined')
|
||||
return style;
|
||||
|
||||
if (state.list) { // List marker (*, +, -, 1., etc)
|
||||
state.list = null;
|
||||
return list;
|
||||
}
|
||||
|
||||
var ch = stream.next();
|
||||
|
||||
if (ch === '\\') {
|
||||
stream.next();
|
||||
return getType(state);
|
||||
}
|
||||
if (ch === '`') {
|
||||
return switchInline(stream, state, inlineElement(code, '`'));
|
||||
|
||||
// Matches link titles present on next line
|
||||
if (state.linkTitle) {
|
||||
state.linkTitle = false;
|
||||
var matchCh = ch;
|
||||
if (ch === '(') {
|
||||
matchCh = ')';
|
||||
}
|
||||
matchCh = (matchCh+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
|
||||
var regex = '^\\s*(?:[^' + matchCh + '\\\\]+|\\\\\\\\|\\\\.)' + matchCh;
|
||||
if (stream.match(new RegExp(regex), true)) {
|
||||
return linkhref;
|
||||
}
|
||||
}
|
||||
if (ch === '[') {
|
||||
|
||||
if (ch === '`') {
|
||||
var t = getType(state);
|
||||
var before = stream.pos;
|
||||
stream.eatWhile('`');
|
||||
var difference = 1 + stream.pos - before;
|
||||
if (!state.code) {
|
||||
codeDepth = difference;
|
||||
state.code = true;
|
||||
return getType(state);
|
||||
} else {
|
||||
if (difference === codeDepth) { // Must be exact
|
||||
state.code = false;
|
||||
return t;
|
||||
}
|
||||
return getType(state);
|
||||
}
|
||||
} else if (state.code) {
|
||||
return getType(state);
|
||||
}
|
||||
|
||||
if (ch === '[' && stream.match(/.*\] ?(?:\(|\[)/, false)) {
|
||||
return switchInline(stream, state, linkText);
|
||||
}
|
||||
|
||||
if (ch === '<' && stream.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/, true)) {
|
||||
return switchInline(stream, state, inlineElement(linkinline, '>'));
|
||||
}
|
||||
|
||||
if (ch === '<' && stream.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/, true)) {
|
||||
return switchInline(stream, state, inlineElement(linkemail, '>'));
|
||||
}
|
||||
|
||||
if (ch === '<' && stream.match(/^\w/, false)) {
|
||||
var md_inside = false;
|
||||
if (stream.string.indexOf(">")!=-1) {
|
||||
@@ -141,10 +212,27 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
||||
|
||||
var t = getType(state);
|
||||
if (ch === '*' || ch === '_') {
|
||||
if (stream.eat(ch)) {
|
||||
return (state.strong = !state.strong) ? getType(state) : t;
|
||||
if (state.strong === ch && stream.eat(ch)) { // Remove STRONG
|
||||
state.strong = false;
|
||||
return t;
|
||||
} else if (!state.strong && stream.eat(ch)) { // Add STRONG
|
||||
state.strong = ch;
|
||||
return getType(state);
|
||||
} else if (state.em === ch) { // Remove EM
|
||||
state.em = false;
|
||||
return t;
|
||||
} else if (!state.em) { // Add EM
|
||||
state.em = ch;
|
||||
return getType(state);
|
||||
}
|
||||
} else if (ch === ' ') {
|
||||
if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces
|
||||
if (stream.peek() === ' ') { // Surrounded by spaces, ignore
|
||||
return getType(state);
|
||||
} else { // Not surrounded by spaces, back up pointer
|
||||
stream.backUp(1);
|
||||
}
|
||||
}
|
||||
return (state.em = !state.em) ? getType(state) : t;
|
||||
}
|
||||
|
||||
return getType(state);
|
||||
@@ -163,7 +251,10 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
||||
}
|
||||
|
||||
function linkHref(stream, state) {
|
||||
stream.eatSpace();
|
||||
// Check if space, and return NULL if so (to avoid marking the space)
|
||||
if(stream.eatSpace()){
|
||||
return null;
|
||||
}
|
||||
var ch = stream.next();
|
||||
if (ch === '(' || ch === '[') {
|
||||
return switchInline(stream, state, inlineElement(linkhref, ch === '(' ? ')' : ']'));
|
||||
@@ -180,17 +271,29 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
||||
}
|
||||
|
||||
function footnoteUrl(stream, state) {
|
||||
stream.eatSpace();
|
||||
// Check if space, and return NULL if so (to avoid marking the space)
|
||||
if(stream.eatSpace()){
|
||||
return null;
|
||||
}
|
||||
// Match URL
|
||||
stream.match(/^[^\s]+/, true);
|
||||
// Check for link title
|
||||
if (stream.peek() === undefined) { // End of line, set flag to check next line
|
||||
state.linkTitle = true;
|
||||
} else { // More content on line, check if link title
|
||||
stream.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/, true);
|
||||
}
|
||||
state.f = state.inline = inlineNormal;
|
||||
return linkhref;
|
||||
}
|
||||
|
||||
function inlineRE(endChar) {
|
||||
if (!inlineRE[endChar]) {
|
||||
// match any not-escaped-non-endChar and any escaped char
|
||||
// then match endChar or eol
|
||||
inlineRE[endChar] = new RegExp('^(?:[^\\\\\\' + endChar + ']|\\\\.)*(?:\\' + endChar + '|$)');
|
||||
// Escape endChar for RegExp (taken from http://stackoverflow.com/a/494122/526741)
|
||||
endChar = (endChar+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
|
||||
// Match any non-endChar, escaped character, as well as the closing
|
||||
// endChar.
|
||||
inlineRE[endChar] = new RegExp('^(?:[^\\\\]+?|\\\\.)*?(' + endChar + ')');
|
||||
}
|
||||
return inlineRE[endChar];
|
||||
}
|
||||
@@ -215,9 +318,11 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
||||
|
||||
inline: inlineNormal,
|
||||
text: handleText,
|
||||
linkTitle: false,
|
||||
em: false,
|
||||
strong: false,
|
||||
header: false,
|
||||
list: false,
|
||||
quote: false
|
||||
};
|
||||
},
|
||||
@@ -232,9 +337,11 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
||||
|
||||
inline: s.inline,
|
||||
text: s.text,
|
||||
linkTitle: s.linkTitle,
|
||||
em: s.em,
|
||||
strong: s.strong,
|
||||
header: s.header,
|
||||
list: s.list,
|
||||
quote: s.quote,
|
||||
md_inside: s.md_inside
|
||||
};
|
||||
@@ -242,12 +349,19 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
|
||||
|
||||
token: function(stream, state) {
|
||||
if (stream.sol()) {
|
||||
if (stream.match(/^\s*$/, true)) { return blankLine(state); }
|
||||
if (stream.match(/^\s*$/, true)) {
|
||||
prevLineHasContent = false;
|
||||
return blankLine(state);
|
||||
} else {
|
||||
if(thisLineHasContent){
|
||||
prevLineHasContent = true;
|
||||
thisLineHasContent = false;
|
||||
}
|
||||
thisLineHasContent = true;
|
||||
}
|
||||
|
||||
// Reset state.header
|
||||
state.header = false;
|
||||
// Reset state.quote
|
||||
state.quote = false;
|
||||
|
||||
state.f = state.block;
|
||||
var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, ' ').length;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: MySQL mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: NTriples mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
*/
|
||||
CodeMirror.defineMode("ntriples", function() {
|
||||
|
||||
Location = {
|
||||
var Location = {
|
||||
PRE_SUBJECT : 0,
|
||||
WRITING_SUB_URI : 1,
|
||||
WRITING_BNODE_URI : 2,
|
||||
@@ -87,8 +87,8 @@ CodeMirror.defineMode("ntriples", function() {
|
||||
currState.location=ret;
|
||||
}
|
||||
|
||||
untilSpace = function(c) { return c != ' '; };
|
||||
untilEndURI = function(c) { return c != '>'; };
|
||||
var untilSpace = function(c) { return c != ' '; };
|
||||
var untilEndURI = function(c) { return c != '>'; };
|
||||
return {
|
||||
startState: function() {
|
||||
return {
|
||||
@@ -114,7 +114,7 @@ CodeMirror.defineMode("ntriples", function() {
|
||||
}
|
||||
if(ch == '#') {
|
||||
var parsedAnchor = '';
|
||||
stream.eatWhile(function(c) { if(c != '>' && c != ' ') { parsedAnchor+= c; return true; } return false});
|
||||
stream.eatWhile(function(c) { if(c != '>' && c != ' ') { parsedAnchor+= c; return true; } return false;});
|
||||
state.anchors.push(parsedAnchor);
|
||||
return 'variable-2';
|
||||
}
|
||||
|
||||
@@ -103,7 +103,7 @@ CodeMirror.defineMode('ocaml', function(config) {
|
||||
}
|
||||
|
||||
return {
|
||||
startState: function() {return {tokenize: tokenBase, commentLevel: 0}},
|
||||
startState: function() {return {tokenize: tokenBase, commentLevel: 0};},
|
||||
token: function(stream, state) {
|
||||
if (stream.eatSpace()) return null;
|
||||
return state.tokenize(stream, state);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Pascal mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -26,7 +26,7 @@ CodeMirror.defineMode("pascal", function(config) {
|
||||
return tokenComment(stream, state);
|
||||
}
|
||||
if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
|
||||
return null
|
||||
return null;
|
||||
}
|
||||
if (/\d/.test(ch)) {
|
||||
stream.eatWhile(/[\w\.]/);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Perl mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -477,22 +477,22 @@ CodeMirror.defineMode("perl",function(config,parserConfig){
|
||||
if(chain[++i]!==undefined){
|
||||
state.chain=chain[i];
|
||||
state.style=style;
|
||||
state.tail=tail}
|
||||
state.tail=tail;}
|
||||
else if(tail)
|
||||
stream.eatWhile(tail);
|
||||
state.tokenize=tokenPerl;
|
||||
return style}
|
||||
e=!e&&c=="\\"}
|
||||
return style};
|
||||
return state.tokenize(stream,state)}
|
||||
return style;}
|
||||
e=!e&&c=="\\";}
|
||||
return style;};
|
||||
return state.tokenize(stream,state);}
|
||||
|
||||
function tokenSOMETHING(stream,state,string){
|
||||
state.tokenize=function(stream,state){
|
||||
if(stream.string==string)
|
||||
state.tokenize=tokenPerl;
|
||||
stream.skipToEnd();
|
||||
return "string"};
|
||||
return state.tokenize(stream,state)}
|
||||
return "string";};
|
||||
return state.tokenize(stream,state);}
|
||||
|
||||
function tokenPerl(stream,state){
|
||||
if(stream.eatSpace())
|
||||
@@ -504,9 +504,9 @@ CodeMirror.defineMode("perl",function(config,parserConfig){
|
||||
return 'number';
|
||||
if(stream.match(/^<<(?=\w)/)){ // NOTE: <<SOMETHING\n...\nSOMETHING\n
|
||||
stream.eatWhile(/\w/);
|
||||
return tokenSOMETHING(stream,state,stream.current().substr(2))}
|
||||
return tokenSOMETHING(stream,state,stream.current().substr(2));}
|
||||
if(stream.sol()&&stream.match(/^\=item(?!\w)/)){// NOTE: \n=item...\n=cut\n
|
||||
return tokenSOMETHING(stream,state,'=cut')}
|
||||
return tokenSOMETHING(stream,state,'=cut');}
|
||||
var ch=stream.next();
|
||||
if(ch=='"'||ch=="'"){ // NOTE: ' or " or <<'SOMETHING'\n...\nSOMETHING\n or <<"SOMETHING"\n...\nSOMETHING\n
|
||||
if(stream.prefix(3)=="<<"+ch){
|
||||
@@ -515,8 +515,8 @@ CodeMirror.defineMode("perl",function(config,parserConfig){
|
||||
var n=stream.current().substr(1);
|
||||
if(n&&stream.eat(ch))
|
||||
return tokenSOMETHING(stream,state,n);
|
||||
stream.pos=p}
|
||||
return tokenChain(stream,state,[ch],"string")}
|
||||
stream.pos=p;}
|
||||
return tokenChain(stream,state,[ch],"string");}
|
||||
if(ch=="q"){
|
||||
var c=stream.look(-2);
|
||||
if(!(c&&/\w/.test(c))){
|
||||
@@ -525,100 +525,100 @@ CodeMirror.defineMode("perl",function(config,parserConfig){
|
||||
c=stream.look(1);
|
||||
if(c=="("){
|
||||
stream.eatSuffix(2);
|
||||
return tokenChain(stream,state,[")"],RXstyle,RXmodifiers)}
|
||||
return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);}
|
||||
if(c=="["){
|
||||
stream.eatSuffix(2);
|
||||
return tokenChain(stream,state,["]"],RXstyle,RXmodifiers)}
|
||||
return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);}
|
||||
if(c=="{"){
|
||||
stream.eatSuffix(2);
|
||||
return tokenChain(stream,state,["}"],RXstyle,RXmodifiers)}
|
||||
return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);}
|
||||
if(c=="<"){
|
||||
stream.eatSuffix(2);
|
||||
return tokenChain(stream,state,[">"],RXstyle,RXmodifiers)}
|
||||
return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}
|
||||
if(/[\^'"!~\/]/.test(c)){
|
||||
stream.eatSuffix(1);
|
||||
return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers)}}
|
||||
return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}}
|
||||
else if(c=="q"){
|
||||
c=stream.look(1);
|
||||
if(c=="("){
|
||||
stream.eatSuffix(2);
|
||||
return tokenChain(stream,state,[")"],"string")}
|
||||
return tokenChain(stream,state,[")"],"string");}
|
||||
if(c=="["){
|
||||
stream.eatSuffix(2);
|
||||
return tokenChain(stream,state,["]"],"string")}
|
||||
return tokenChain(stream,state,["]"],"string");}
|
||||
if(c=="{"){
|
||||
stream.eatSuffix(2);
|
||||
return tokenChain(stream,state,["}"],"string")}
|
||||
return tokenChain(stream,state,["}"],"string");}
|
||||
if(c=="<"){
|
||||
stream.eatSuffix(2);
|
||||
return tokenChain(stream,state,[">"],"string")}
|
||||
return tokenChain(stream,state,[">"],"string");}
|
||||
if(/[\^'"!~\/]/.test(c)){
|
||||
stream.eatSuffix(1);
|
||||
return tokenChain(stream,state,[stream.eat(c)],"string")}}
|
||||
return tokenChain(stream,state,[stream.eat(c)],"string");}}
|
||||
else if(c=="w"){
|
||||
c=stream.look(1);
|
||||
if(c=="("){
|
||||
stream.eatSuffix(2);
|
||||
return tokenChain(stream,state,[")"],"bracket")}
|
||||
return tokenChain(stream,state,[")"],"bracket");}
|
||||
if(c=="["){
|
||||
stream.eatSuffix(2);
|
||||
return tokenChain(stream,state,["]"],"bracket")}
|
||||
return tokenChain(stream,state,["]"],"bracket");}
|
||||
if(c=="{"){
|
||||
stream.eatSuffix(2);
|
||||
return tokenChain(stream,state,["}"],"bracket")}
|
||||
return tokenChain(stream,state,["}"],"bracket");}
|
||||
if(c=="<"){
|
||||
stream.eatSuffix(2);
|
||||
return tokenChain(stream,state,[">"],"bracket")}
|
||||
return tokenChain(stream,state,[">"],"bracket");}
|
||||
if(/[\^'"!~\/]/.test(c)){
|
||||
stream.eatSuffix(1);
|
||||
return tokenChain(stream,state,[stream.eat(c)],"bracket")}}
|
||||
return tokenChain(stream,state,[stream.eat(c)],"bracket");}}
|
||||
else if(c=="r"){
|
||||
c=stream.look(1);
|
||||
if(c=="("){
|
||||
stream.eatSuffix(2);
|
||||
return tokenChain(stream,state,[")"],RXstyle,RXmodifiers)}
|
||||
return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);}
|
||||
if(c=="["){
|
||||
stream.eatSuffix(2);
|
||||
return tokenChain(stream,state,["]"],RXstyle,RXmodifiers)}
|
||||
return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);}
|
||||
if(c=="{"){
|
||||
stream.eatSuffix(2);
|
||||
return tokenChain(stream,state,["}"],RXstyle,RXmodifiers)}
|
||||
return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);}
|
||||
if(c=="<"){
|
||||
stream.eatSuffix(2);
|
||||
return tokenChain(stream,state,[">"],RXstyle,RXmodifiers)}
|
||||
return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}
|
||||
if(/[\^'"!~\/]/.test(c)){
|
||||
stream.eatSuffix(1);
|
||||
return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers)}}
|
||||
return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}}
|
||||
else if(/[\^'"!~\/(\[{<]/.test(c)){
|
||||
if(c=="("){
|
||||
stream.eatSuffix(1);
|
||||
return tokenChain(stream,state,[")"],"string")}
|
||||
return tokenChain(stream,state,[")"],"string");}
|
||||
if(c=="["){
|
||||
stream.eatSuffix(1);
|
||||
return tokenChain(stream,state,["]"],"string")}
|
||||
return tokenChain(stream,state,["]"],"string");}
|
||||
if(c=="{"){
|
||||
stream.eatSuffix(1);
|
||||
return tokenChain(stream,state,["}"],"string")}
|
||||
return tokenChain(stream,state,["}"],"string");}
|
||||
if(c=="<"){
|
||||
stream.eatSuffix(1);
|
||||
return tokenChain(stream,state,[">"],"string")}
|
||||
return tokenChain(stream,state,[">"],"string");}
|
||||
if(/[\^'"!~\/]/.test(c)){
|
||||
return tokenChain(stream,state,[stream.eat(c)],"string")}}}}
|
||||
return tokenChain(stream,state,[stream.eat(c)],"string");}}}}
|
||||
if(ch=="m"){
|
||||
var c=stream.look(-2);
|
||||
if(!(c&&/\w/.test(c))){
|
||||
c=stream.eat(/[(\[{<\^'"!~\/]/);
|
||||
if(c){
|
||||
if(/[\^'"!~\/]/.test(c)){
|
||||
return tokenChain(stream,state,[c],RXstyle,RXmodifiers)}
|
||||
return tokenChain(stream,state,[c],RXstyle,RXmodifiers);}
|
||||
if(c=="("){
|
||||
return tokenChain(stream,state,[")"],RXstyle,RXmodifiers)}
|
||||
return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);}
|
||||
if(c=="["){
|
||||
return tokenChain(stream,state,["]"],RXstyle,RXmodifiers)}
|
||||
return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);}
|
||||
if(c=="{"){
|
||||
return tokenChain(stream,state,["}"],RXstyle,RXmodifiers)}
|
||||
return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);}
|
||||
if(c=="<"){
|
||||
return tokenChain(stream,state,[">"],RXstyle,RXmodifiers)}}}}
|
||||
return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}}}}
|
||||
if(ch=="s"){
|
||||
var c=/[\/>\]})\w]/.test(stream.look(-2));
|
||||
if(!c){
|
||||
@@ -632,7 +632,7 @@ CodeMirror.defineMode("perl",function(config,parserConfig){
|
||||
return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers);
|
||||
if(c=="(")
|
||||
return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers);
|
||||
return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers)}}}
|
||||
return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}
|
||||
if(ch=="y"){
|
||||
var c=/[\/>\]})\w]/.test(stream.look(-2));
|
||||
if(!c){
|
||||
@@ -646,7 +646,7 @@ CodeMirror.defineMode("perl",function(config,parserConfig){
|
||||
return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers);
|
||||
if(c=="(")
|
||||
return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers);
|
||||
return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers)}}}
|
||||
return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}
|
||||
if(ch=="t"){
|
||||
var c=/[\/>\]})\w]/.test(stream.look(-2));
|
||||
if(!c){
|
||||
@@ -661,65 +661,65 @@ CodeMirror.defineMode("perl",function(config,parserConfig){
|
||||
return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers);
|
||||
if(c=="(")
|
||||
return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers);
|
||||
return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers)}}}}
|
||||
return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}}
|
||||
if(ch=="`"){
|
||||
return tokenChain(stream,state,[ch],"variable-2")}
|
||||
return tokenChain(stream,state,[ch],"variable-2");}
|
||||
if(ch=="/"){
|
||||
if(!/~\s*$/.test(stream.prefix()))
|
||||
return "operator";
|
||||
else
|
||||
return tokenChain(stream,state,[ch],RXstyle,RXmodifiers)}
|
||||
return tokenChain(stream,state,[ch],RXstyle,RXmodifiers);}
|
||||
if(ch=="$"){
|
||||
var p=stream.pos;
|
||||
if(stream.eatWhile(/\d/)||stream.eat("{")&&stream.eatWhile(/\d/)&&stream.eat("}"))
|
||||
return "variable-2";
|
||||
else
|
||||
stream.pos=p}
|
||||
stream.pos=p;}
|
||||
if(/[$@%]/.test(ch)){
|
||||
var p=stream.pos;
|
||||
if(stream.eat("^")&&stream.eat(/[A-Z]/)||!/[@$%&]/.test(stream.look(-2))&&stream.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){
|
||||
var c=stream.current();
|
||||
if(PERL[c])
|
||||
return "variable-2"}
|
||||
stream.pos=p}
|
||||
return "variable-2";}
|
||||
stream.pos=p;}
|
||||
if(/[$@%&]/.test(ch)){
|
||||
if(stream.eatWhile(/[\w$\[\]]/)||stream.eat("{")&&stream.eatWhile(/[\w$\[\]]/)&&stream.eat("}")){
|
||||
var c=stream.current();
|
||||
if(PERL[c])
|
||||
return "variable-2";
|
||||
else
|
||||
return "variable"}}
|
||||
return "variable";}}
|
||||
if(ch=="#"){
|
||||
if(stream.look(-2)!="$"){
|
||||
stream.skipToEnd();
|
||||
return "comment"}}
|
||||
return "comment";}}
|
||||
if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(ch)){
|
||||
var p=stream.pos;
|
||||
stream.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/);
|
||||
if(PERL[stream.current()])
|
||||
return "operator";
|
||||
else
|
||||
stream.pos=p}
|
||||
stream.pos=p;}
|
||||
if(ch=="_"){
|
||||
if(stream.pos==1){
|
||||
if(stream.suffix(6)=="_END__"){
|
||||
return tokenChain(stream,state,['\0'],"comment")}
|
||||
return tokenChain(stream,state,['\0'],"comment");}
|
||||
else if(stream.suffix(7)=="_DATA__"){
|
||||
return tokenChain(stream,state,['\0'],"variable-2")}
|
||||
return tokenChain(stream,state,['\0'],"variable-2");}
|
||||
else if(stream.suffix(7)=="_C__"){
|
||||
return tokenChain(stream,state,['\0'],"string")}}}
|
||||
return tokenChain(stream,state,['\0'],"string");}}}
|
||||
if(/\w/.test(ch)){
|
||||
var p=stream.pos;
|
||||
if(stream.look(-2)=="{"&&(stream.look(0)=="}"||stream.eatWhile(/\w/)&&stream.look(0)=="}"))
|
||||
return "string";
|
||||
else
|
||||
stream.pos=p}
|
||||
stream.pos=p;}
|
||||
if(/[A-Z]/.test(ch)){
|
||||
var l=stream.look(-2);
|
||||
var p=stream.pos;
|
||||
stream.eatWhile(/[A-Z_]/);
|
||||
if(/[\da-z]/.test(stream.look(0))){
|
||||
stream.pos=p}
|
||||
stream.pos=p;}
|
||||
else{
|
||||
var c=PERL[stream.current()];
|
||||
if(!c)
|
||||
@@ -738,9 +738,9 @@ CodeMirror.defineMode("perl",function(config,parserConfig){
|
||||
else if(c==5)
|
||||
return "variable-2";
|
||||
else
|
||||
return "meta"}
|
||||
return "meta";}
|
||||
else
|
||||
return "meta"}}
|
||||
return "meta";}}
|
||||
if(/[a-zA-Z_]/.test(ch)){
|
||||
var l=stream.look(-2);
|
||||
stream.eatWhile(/\w/);
|
||||
@@ -761,10 +761,10 @@ CodeMirror.defineMode("perl",function(config,parserConfig){
|
||||
else if(c==5)
|
||||
return "variable-2";
|
||||
else
|
||||
return "meta"}
|
||||
return "meta";}
|
||||
else
|
||||
return "meta"}
|
||||
return null}
|
||||
return "meta";}
|
||||
return null;}
|
||||
|
||||
return{
|
||||
startState:function(){
|
||||
@@ -772,37 +772,37 @@ CodeMirror.defineMode("perl",function(config,parserConfig){
|
||||
tokenize:tokenPerl,
|
||||
chain:null,
|
||||
style:null,
|
||||
tail:null}},
|
||||
tail:null};},
|
||||
token:function(stream,state){
|
||||
return (state.tokenize||tokenPerl)(stream,state)},
|
||||
electricChars:"{}"}});
|
||||
return (state.tokenize||tokenPerl)(stream,state);},
|
||||
electricChars:"{}"};});
|
||||
|
||||
CodeMirror.defineMIME("text/x-perl", "perl");
|
||||
|
||||
// it's like "peek", but need for look-ahead or look-behind if index < 0
|
||||
CodeMirror.StringStream.prototype.look=function(c){
|
||||
return this.string.charAt(this.pos+(c||0))};
|
||||
return this.string.charAt(this.pos+(c||0));};
|
||||
|
||||
// return a part of prefix of current stream from current position
|
||||
CodeMirror.StringStream.prototype.prefix=function(c){
|
||||
if(c){
|
||||
var x=this.pos-c;
|
||||
return this.string.substr((x>=0?x:0),c)}
|
||||
return this.string.substr((x>=0?x:0),c);}
|
||||
else{
|
||||
return this.string.substr(0,this.pos-1)}};
|
||||
return this.string.substr(0,this.pos-1);}};
|
||||
|
||||
// return a part of suffix of current stream from current position
|
||||
CodeMirror.StringStream.prototype.suffix=function(c){
|
||||
var y=this.string.length;
|
||||
var x=y-this.pos+1;
|
||||
return this.string.substr(this.pos,(c&&c<y?c:x))};
|
||||
return this.string.substr(this.pos,(c&&c<y?c:x));};
|
||||
|
||||
// return a part of suffix of current stream from current position and change current position
|
||||
CodeMirror.StringStream.prototype.nsuffix=function(c){
|
||||
var p=this.pos;
|
||||
var l=c||(this.string.length-this.pos+1);
|
||||
this.pos+=l;
|
||||
return this.string.substr(p,l)};
|
||||
return this.string.substr(p,l);};
|
||||
|
||||
// eating and vomiting a part of stream from current position
|
||||
CodeMirror.StringStream.prototype.eatSuffix=function(c){
|
||||
@@ -813,4 +813,4 @@ CodeMirror.StringStream.prototype.eatSuffix=function(c){
|
||||
else if(x>=(y=this.string.length-1))
|
||||
this.pos=y;
|
||||
else
|
||||
this.pos=x};
|
||||
this.pos=x;};
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: PHP mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
if (stream.match(delim)) state.tokenize = null;
|
||||
else stream.skipToEnd();
|
||||
return "string";
|
||||
}
|
||||
};
|
||||
}
|
||||
var phpConfig = {
|
||||
name: "clike",
|
||||
@@ -56,14 +56,13 @@
|
||||
var phpMode = CodeMirror.getMode(config, phpConfig);
|
||||
|
||||
function dispatch(stream, state) { // TODO open PHP inside text/css
|
||||
var isPHP = state.mode == "php";
|
||||
var isPHP = state.curMode == phpMode;
|
||||
if (stream.sol() && state.pending != '"') state.pending = null;
|
||||
if (state.curMode == htmlMode) {
|
||||
if (stream.match(/^<\?\w*/)) {
|
||||
state.curMode = phpMode;
|
||||
state.curState = state.php;
|
||||
state.curClose = "?>";
|
||||
state.mode = "php";
|
||||
return "meta";
|
||||
}
|
||||
if (state.pending == '"') {
|
||||
@@ -86,13 +85,11 @@
|
||||
state.curMode = jsMode;
|
||||
state.curState = jsMode.startState(htmlMode.indent(state.curState, ""));
|
||||
state.curClose = /^<\/\s*script\s*>/i;
|
||||
state.mode = "javascript";
|
||||
}
|
||||
else if (/^style$/i.test(state.curState.context.tagName)) {
|
||||
state.curMode = cssMode;
|
||||
state.curState = cssMode.startState(htmlMode.indent(state.curState, ""));
|
||||
state.curClose = /^<\/\s*style\s*>/i;
|
||||
state.mode = "css";
|
||||
}
|
||||
}
|
||||
return style;
|
||||
@@ -101,7 +98,6 @@
|
||||
state.curMode = htmlMode;
|
||||
state.curState = state.html;
|
||||
state.curClose = null;
|
||||
state.mode = "html";
|
||||
if (isPHP) return "meta";
|
||||
else return dispatch(stream, state);
|
||||
} else {
|
||||
@@ -118,7 +114,7 @@
|
||||
curState: parserConfig.startOpen ? phpMode.startState() : html,
|
||||
curClose: parserConfig.startOpen ? /^\?>/ : null,
|
||||
mode: parserConfig.startOpen ? "php" : "html",
|
||||
pending: null}
|
||||
pending: null};
|
||||
},
|
||||
|
||||
copyState: function(state) {
|
||||
@@ -141,8 +137,10 @@
|
||||
return state.curMode.indent(state.curState, textAfter);
|
||||
},
|
||||
|
||||
electricChars: "/{}:"
|
||||
}
|
||||
electricChars: "/{}:",
|
||||
|
||||
innerMode: function(state) { return {state: state.curState, mode: state.curMode}; }
|
||||
};
|
||||
}, "xml", "clike", "javascript", "css");
|
||||
CodeMirror.defineMIME("application/x-httpd-php", "php");
|
||||
CodeMirror.defineMIME("application/x-httpd-php-open", {name: "php", startOpen: true});
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Pig Latin mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -107,11 +107,11 @@ CodeMirror.defineMode("pig", function(config, parserConfig) {
|
||||
// is it one of the builtin functions?
|
||||
if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase()))
|
||||
{
|
||||
return ("keyword", "variable-2")
|
||||
return ("keyword", "variable-2");
|
||||
}
|
||||
// is it one of the listed types?
|
||||
if (types && types.propertyIsEnumerable(stream.current().toUpperCase()))
|
||||
return ("keyword", "variable-3")
|
||||
return ("keyword", "variable-3");
|
||||
// default is a 'variable'
|
||||
return ret("variable", "pig-word");
|
||||
}
|
||||
@@ -161,7 +161,7 @@ CodeMirror.defineMode("pig", function(config, parserConfig) {
|
||||
+ "NEQ MATCHES TRUE FALSE ";
|
||||
|
||||
// data types
|
||||
var pTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP "
|
||||
var pTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP ";
|
||||
|
||||
CodeMirror.defineMIME("text/x-pig", {
|
||||
name: "pig",
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Oracle PL/SQL mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Properties files mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Python mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -227,7 +227,7 @@ CodeMirror.defineMode("python", function(conf, parserConf) {
|
||||
while (state.scopes[0].offset !== _indent) {
|
||||
state.scopes.shift();
|
||||
}
|
||||
return false
|
||||
return false;
|
||||
} else {
|
||||
if (type === 'py') {
|
||||
state.scopes[0].offset = stream.indentation();
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: R mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: RPM changes mode</title>
|
||||
<link rel="stylesheet" href="../../../lib/codemirror.css">
|
||||
<script src="../../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: RPM spec mode</title>
|
||||
<link rel="stylesheet" href="../../../lib/codemirror.css">
|
||||
<script src="../../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: reStructuredText mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Ruby mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Rust mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Scheme mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -166,7 +166,7 @@ CodeMirror.defineMode("scheme", function (config, mode) {
|
||||
stream.skipToEnd(); // rest of the line is a comment
|
||||
returnType = COMMENT;
|
||||
} else if (ch == "(" || ch == "[") {
|
||||
var keyWord = ''; var indentTemp = stream.column();
|
||||
var keyWord = ''; var indentTemp = stream.column(), letter;
|
||||
/**
|
||||
Either
|
||||
(indent-word ..
|
||||
|
||||
@@ -60,7 +60,7 @@ CodeMirror.defineMode('shell', function(config) {
|
||||
stream.eatWhile(/\w/);
|
||||
var cur = stream.current();
|
||||
if (stream.peek() === '=' && /\w+/.test(cur)) return 'def';
|
||||
return words[cur] || null;
|
||||
return words.hasOwnProperty(cur) ? words[cur] : null;
|
||||
}
|
||||
|
||||
function tokenString(quote) {
|
||||
@@ -107,7 +107,7 @@ CodeMirror.defineMode('shell', function(config) {
|
||||
};
|
||||
|
||||
return {
|
||||
startState: function() {return {tokens:[]}},
|
||||
startState: function() {return {tokens:[]};},
|
||||
token: function(stream, state) {
|
||||
if (stream.eatSpace()) return null;
|
||||
return tokenize(stream, state);
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
Copyright (C) 2012 Thomas Schmid <schmid-thomas@gmx.net>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
Please note that some subdirectories of the CodeMirror distribution
|
||||
include their own LICENSE files, and are released under different
|
||||
licences.
|
||||
@@ -0,0 +1,81 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Sieve (RFC5228) mode</title>
|
||||
<link rel="stylesheet" href="../../doc/docs.css">
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
<script src="sieve.js"></script>
|
||||
<style>.CodeMirror {background: #f8f8f8;}</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>CodeMirror: Sieve (RFC5228) mode</h1>
|
||||
<form><textarea id="code" name="code">
|
||||
#
|
||||
# Example Sieve Filter
|
||||
# Declare any optional features or extension used by the script
|
||||
#
|
||||
|
||||
require ["fileinto", "reject"];
|
||||
|
||||
#
|
||||
# Reject any large messages (note that the four leading dots get
|
||||
# "stuffed" to three)
|
||||
#
|
||||
if size :over 1M
|
||||
{
|
||||
reject text:
|
||||
Please do not send me large attachments.
|
||||
Put your file on a server and send me the URL.
|
||||
Thank you.
|
||||
.... Fred
|
||||
.
|
||||
;
|
||||
stop;
|
||||
}
|
||||
|
||||
#
|
||||
# Handle messages from known mailing lists
|
||||
# Move messages from IETF filter discussion list to filter folder
|
||||
#
|
||||
if header :is "Sender" "owner-ietf-mta-filters@imc.org"
|
||||
{
|
||||
fileinto "filter"; # move to "filter" folder
|
||||
}
|
||||
#
|
||||
# Keep all messages to or from people in my company
|
||||
#
|
||||
elsif address :domain :is ["From", "To"] "example.com"
|
||||
{
|
||||
keep; # keep in "In" folder
|
||||
}
|
||||
|
||||
#
|
||||
# Try and catch unsolicited email. If a message is not to me,
|
||||
# or it contains a subject known to be spam, file it away.
|
||||
#
|
||||
elsif anyof (not address :all :contains
|
||||
["To", "Cc", "Bcc"] "me@example.com",
|
||||
header :matches "subject"
|
||||
["*make*money*fast*", "*university*dipl*mas*"])
|
||||
{
|
||||
# If message header does not contain my address,
|
||||
# it's from a list.
|
||||
fileinto "spam"; # move to "spam" folder
|
||||
}
|
||||
else
|
||||
{
|
||||
# Move all other (non-company) mail to "personal"
|
||||
# folder.
|
||||
fileinto "personal";
|
||||
}
|
||||
</textarea></form>
|
||||
<script>
|
||||
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
|
||||
</script>
|
||||
|
||||
<p><strong>MIME types defined:</strong> <code>application/sieve</code>.</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,156 @@
|
||||
/*
|
||||
* See LICENSE in this directory for the license under which this code
|
||||
* is released.
|
||||
*/
|
||||
|
||||
CodeMirror.defineMode("sieve", function(config) {
|
||||
function words(str) {
|
||||
var obj = {}, words = str.split(" ");
|
||||
for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
|
||||
return obj;
|
||||
}
|
||||
|
||||
var keywords = words("if elsif else stop require");
|
||||
var atoms = words("true false not");
|
||||
var indentUnit = config.indentUnit;
|
||||
|
||||
function tokenBase(stream, state) {
|
||||
|
||||
var ch = stream.next();
|
||||
if (ch == "/" && stream.eat("*")) {
|
||||
state.tokenize = tokenCComment;
|
||||
return tokenCComment(stream, state);
|
||||
}
|
||||
|
||||
if (ch === '#') {
|
||||
stream.skipToEnd();
|
||||
return "comment";
|
||||
}
|
||||
|
||||
if (ch == "\"") {
|
||||
state.tokenize = tokenString(ch);
|
||||
return state.tokenize(stream, state);
|
||||
}
|
||||
|
||||
if (ch === "{")
|
||||
{
|
||||
state._indent++;
|
||||
return null;
|
||||
}
|
||||
|
||||
if (ch === "}")
|
||||
{
|
||||
state._indent--;
|
||||
return null;
|
||||
}
|
||||
|
||||
if (/[{}\(\),;]/.test(ch))
|
||||
return null;
|
||||
|
||||
// 1*DIGIT "K" / "M" / "G"
|
||||
if (/\d/.test(ch)) {
|
||||
stream.eatWhile(/[\d]/);
|
||||
stream.eat(/[KkMmGg]/);
|
||||
return "number";
|
||||
}
|
||||
|
||||
// ":" (ALPHA / "_") *(ALPHA / DIGIT / "_")
|
||||
if (ch == ":") {
|
||||
stream.eatWhile(/[a-zA-Z_]/);
|
||||
stream.eatWhile(/[a-zA-Z0-9_]/);
|
||||
|
||||
return "operator";
|
||||
}
|
||||
|
||||
stream.eatWhile(/[\w\$_]/);
|
||||
var cur = stream.current();
|
||||
|
||||
// "text:" *(SP / HTAB) (hash-comment / CRLF)
|
||||
// *(multiline-literal / multiline-dotstart)
|
||||
// "." CRLF
|
||||
if ((cur == "text") && stream.eat(":"))
|
||||
{
|
||||
state.tokenize = tokenMultiLineString;
|
||||
return "string";
|
||||
}
|
||||
|
||||
if (keywords.propertyIsEnumerable(cur))
|
||||
return "keyword";
|
||||
|
||||
if (atoms.propertyIsEnumerable(cur))
|
||||
return "atom";
|
||||
}
|
||||
|
||||
function tokenMultiLineString(stream, state)
|
||||
{
|
||||
state._multiLineString = true;
|
||||
// the first line is special it may contain a comment
|
||||
if (!stream.sol()) {
|
||||
stream.eatSpace();
|
||||
|
||||
if (stream.peek() == "#") {
|
||||
stream.skipToEnd();
|
||||
return "comment";
|
||||
}
|
||||
|
||||
stream.skipToEnd();
|
||||
return "string";
|
||||
}
|
||||
|
||||
if ((stream.next() == ".") && (stream.eol()))
|
||||
{
|
||||
state._multiLineString = false;
|
||||
state.tokenize = tokenBase;
|
||||
}
|
||||
|
||||
return "string";
|
||||
}
|
||||
|
||||
function tokenCComment(stream, state) {
|
||||
var maybeEnd = false, ch;
|
||||
while ((ch = stream.next()) != null) {
|
||||
if (maybeEnd && ch == "/") {
|
||||
state.tokenize = tokenBase;
|
||||
break;
|
||||
}
|
||||
maybeEnd = (ch == "*");
|
||||
}
|
||||
return "comment";
|
||||
}
|
||||
|
||||
function tokenString(quote) {
|
||||
return function(stream, state) {
|
||||
var escaped = false, ch;
|
||||
while ((ch = stream.next()) != null) {
|
||||
if (ch == quote && !escaped)
|
||||
break;
|
||||
escaped = !escaped && ch == "\\";
|
||||
}
|
||||
if (!escaped) state.tokenize = tokenBase;
|
||||
return "string";
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
startState: function(base) {
|
||||
return {tokenize: tokenBase,
|
||||
baseIndent: base || 0,
|
||||
_indent: 0};
|
||||
},
|
||||
|
||||
token: function(stream, state) {
|
||||
if (stream.eatSpace())
|
||||
return null;
|
||||
|
||||
return (state.tokenize || tokenBase)(stream, state);;
|
||||
},
|
||||
|
||||
indent: function(state, textAfter) {
|
||||
return state.baseIndent + state._indent * indentUnit;
|
||||
},
|
||||
|
||||
electricChars: "}"
|
||||
};
|
||||
});
|
||||
|
||||
CodeMirror.defineMIME("application/sieve", "sieve");
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Smalltalk mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -63,7 +63,7 @@ CodeMirror.defineMode('smalltalk', function(config, modeConfig) {
|
||||
|
||||
} else if (/\d/.test(aChar)) {
|
||||
stream.eatWhile(/[\w\d]/);
|
||||
token.name = 'number'
|
||||
token.name = 'number';
|
||||
|
||||
} else if (/[\w_]/.test(aChar)) {
|
||||
stream.eatWhile(/[\w\d_]/);
|
||||
@@ -100,7 +100,7 @@ CodeMirror.defineMode('smalltalk', function(config, modeConfig) {
|
||||
}
|
||||
|
||||
return token;
|
||||
}
|
||||
};
|
||||
|
||||
return {
|
||||
startState: function() {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Smarty mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -5,7 +5,7 @@ CodeMirror.defineMode("smarty", function(config, parserConfig) {
|
||||
operatorChars: /[+\-*&%=<>!?]/,
|
||||
validIdentifier: /[a-zA-Z0-9\_]/,
|
||||
stringChar: /[\'\"]/
|
||||
}
|
||||
};
|
||||
var leftDelim = (typeof config.mode.leftDelimiter != 'undefined') ? config.mode.leftDelimiter : "{";
|
||||
var rightDelim = (typeof config.mode.rightDelimiter != 'undefined') ? config.mode.rightDelimiter : "}";
|
||||
function ret(style, lst) { last = lst; return style; }
|
||||
@@ -142,7 +142,7 @@ CodeMirror.defineMode("smarty", function(config, parserConfig) {
|
||||
return style;
|
||||
},
|
||||
electricChars: ""
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
CodeMirror.defineMIME("text/x-smarty", "smarty");
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: SPARQL mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: sTeX mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
@@ -91,5 +92,7 @@
|
||||
|
||||
<p><strong>MIME types defined:</strong> <code>text/x-stex</code>.</p>
|
||||
|
||||
<p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#stex_*">normal</a>, <a href="../../test/index.html#verbose,stex_*">verbose</a>.</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -54,7 +54,7 @@ CodeMirror.defineMode("stex", function(cmCfg, modeCfg)
|
||||
};
|
||||
this.closeBracket = function(content) {
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
var plugins = new Array();
|
||||
|
||||
@@ -0,0 +1,343 @@
|
||||
var MT = ModeTest;
|
||||
MT.modeName = 'stex';
|
||||
MT.modeOptions = {};
|
||||
|
||||
MT.testMode(
|
||||
'word',
|
||||
'foo',
|
||||
[
|
||||
null, 'foo'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'twoWords',
|
||||
'foo bar',
|
||||
[
|
||||
null, 'foo bar'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'beginEndDocument',
|
||||
'\\begin{document}\n\\end{document}',
|
||||
[
|
||||
'tag', '\\begin',
|
||||
'bracket', '{',
|
||||
'atom', 'document',
|
||||
'bracket', '}',
|
||||
'tag', '\\end',
|
||||
'bracket', '{',
|
||||
'atom', 'document',
|
||||
'bracket', '}'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'beginEndEquation',
|
||||
'\\begin{equation}\n E=mc^2\n\\end{equation}',
|
||||
[
|
||||
'tag', '\\begin',
|
||||
'bracket', '{',
|
||||
'atom', 'equation',
|
||||
'bracket', '}',
|
||||
null, ' E=mc^2',
|
||||
'tag', '\\end',
|
||||
'bracket', '{',
|
||||
'atom', 'equation',
|
||||
'bracket', '}'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'beginModule',
|
||||
'\\begin{module}[]',
|
||||
[
|
||||
'tag', '\\begin',
|
||||
'bracket', '{',
|
||||
'atom', 'module',
|
||||
'bracket', '}[]'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'beginModuleId',
|
||||
'\\begin{module}[id=bbt-size]',
|
||||
[
|
||||
'tag', '\\begin',
|
||||
'bracket', '{',
|
||||
'atom', 'module',
|
||||
'bracket', '}[',
|
||||
null, 'id=bbt-size',
|
||||
'bracket', ']'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'importModule',
|
||||
'\\importmodule[b-b-t]{b-b-t}',
|
||||
[
|
||||
'tag', '\\importmodule',
|
||||
'bracket', '[',
|
||||
'string', 'b-b-t',
|
||||
'bracket', ']{',
|
||||
'builtin', 'b-b-t',
|
||||
'bracket', '}'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'importModulePath',
|
||||
'\\importmodule[\\KWARCslides{dmath/en/cardinality}]{card}',
|
||||
[
|
||||
'tag', '\\importmodule',
|
||||
'bracket', '[',
|
||||
'tag', '\\KWARCslides',
|
||||
'bracket', '{',
|
||||
'string', 'dmath/en/cardinality',
|
||||
'bracket', '}]{',
|
||||
'builtin', 'card',
|
||||
'bracket', '}'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'psForPDF',
|
||||
'\\PSforPDF[1]{#1}', // could treat #1 specially
|
||||
[
|
||||
'tag', '\\PSforPDF',
|
||||
'bracket', '[',
|
||||
'atom', '1',
|
||||
'bracket', ']{',
|
||||
null, '#1',
|
||||
'bracket', '}'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'comment',
|
||||
'% foo',
|
||||
[
|
||||
'comment', '% foo'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagComment',
|
||||
'\\item% bar',
|
||||
[
|
||||
'tag', '\\item',
|
||||
'comment', '% bar'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'commentTag',
|
||||
' % \\item',
|
||||
[
|
||||
null, ' ',
|
||||
'comment', '% \\item'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'commentLineBreak',
|
||||
'%\nfoo',
|
||||
[
|
||||
'comment', '%',
|
||||
null, 'foo'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagErrorCurly',
|
||||
'\\begin}{',
|
||||
[
|
||||
'tag', '\\begin',
|
||||
'error', '}',
|
||||
'bracket', '{'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagErrorSquare',
|
||||
'\\item]{',
|
||||
[
|
||||
'tag', '\\item',
|
||||
'error', ']',
|
||||
'bracket', '{'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'commentCurly',
|
||||
'% }',
|
||||
[
|
||||
'comment', '% }'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagHash',
|
||||
'the \\# key',
|
||||
[
|
||||
null, 'the ',
|
||||
'tag', '\\#',
|
||||
null, ' key'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagNumber',
|
||||
'a \\$5 stetson',
|
||||
[
|
||||
null, 'a ',
|
||||
'tag', '\\$',
|
||||
'atom', 5,
|
||||
null, ' stetson'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagPercent',
|
||||
'100\\% beef',
|
||||
[
|
||||
'atom', '100',
|
||||
'tag', '\\%',
|
||||
null, ' beef'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagAmpersand',
|
||||
'L \\& N',
|
||||
[
|
||||
null, 'L ',
|
||||
'tag', '\\&',
|
||||
null, ' N'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagUnderscore',
|
||||
'foo\\_bar',
|
||||
[
|
||||
null, 'foo',
|
||||
'tag', '\\_',
|
||||
null, 'bar'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagBracketOpen',
|
||||
'\\emph{\\{}',
|
||||
[
|
||||
'tag', '\\emph',
|
||||
'bracket', '{',
|
||||
'tag', '\\{',
|
||||
'bracket', '}'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagBracketClose',
|
||||
'\\emph{\\}}',
|
||||
[
|
||||
'tag', '\\emph',
|
||||
'bracket', '{',
|
||||
'tag', '\\}',
|
||||
'bracket', '}'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagLetterNumber',
|
||||
'section \\S1',
|
||||
[
|
||||
null, 'section ',
|
||||
'tag', '\\S',
|
||||
'atom', '1'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'textTagNumber',
|
||||
'para \\P2',
|
||||
[
|
||||
null, 'para ',
|
||||
'tag', '\\P',
|
||||
'atom', '2'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'thinspace',
|
||||
'x\\,y', // thinspace
|
||||
[
|
||||
null, 'x',
|
||||
'tag', '\\,',
|
||||
null, 'y'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'thickspace',
|
||||
'x\\;y', // thickspace
|
||||
[
|
||||
null, 'x',
|
||||
'tag', '\\;',
|
||||
null, 'y'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'negativeThinspace',
|
||||
'x\\!y', // negative thinspace
|
||||
[
|
||||
null, 'x',
|
||||
'tag', '\\!',
|
||||
null, 'y'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'periodNotSentence',
|
||||
'J.\\ L.\\ is', // period not ending a sentence
|
||||
[
|
||||
null, 'J.\\ L.\\ is'
|
||||
]
|
||||
); // maybe could be better
|
||||
|
||||
MT.testMode(
|
||||
'periodSentence',
|
||||
'X\\@. The', // period ending a sentence
|
||||
[
|
||||
null, 'X',
|
||||
'tag', '\\@',
|
||||
null, '. The'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'italicCorrection',
|
||||
'{\\em If\\/} I', // italic correction
|
||||
[
|
||||
'bracket', '{',
|
||||
'tag', '\\em',
|
||||
null, ' If',
|
||||
'tag', '\\/',
|
||||
'bracket', '}',
|
||||
null, ' I'
|
||||
]
|
||||
);
|
||||
|
||||
MT.testMode(
|
||||
'tagBracket',
|
||||
'\\newcommand{\\pop}',
|
||||
[
|
||||
'tag', '\\newcommand',
|
||||
'bracket', '{',
|
||||
'tag', '\\pop',
|
||||
'bracket', '}'
|
||||
]
|
||||
);
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: TiddlyWiki mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: Tiki wiki mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -18,7 +18,7 @@ CodeMirror.defineMode('tiki', function(config, parserConfig) {
|
||||
function inLine(style, terminator) {
|
||||
return function(stream, state) {
|
||||
while(!stream.eol()) {
|
||||
stream.next()
|
||||
stream.next();
|
||||
}
|
||||
state.tokenize = inText;
|
||||
return style;
|
||||
@@ -37,9 +37,9 @@ CodeMirror.defineMode('tiki', function(config, parserConfig) {
|
||||
//non start of line
|
||||
switch (ch) { //switch is generally much faster than if, so it is used here
|
||||
case "{": //plugin
|
||||
type = stream.eat("/") ? "closeTag" : "openTag";
|
||||
var type = stream.eat("/") ? "closeTag" : "openTag";
|
||||
stream.eatSpace();
|
||||
tagName = "";
|
||||
var tagName = "";
|
||||
var c;
|
||||
while ((c = stream.eat(/[^\s\u00a0=\"\'\/?(}]/))) tagName += c;
|
||||
state.tokenize = inPlugin;
|
||||
@@ -251,7 +251,7 @@ CodeMirror.defineMode('tiki', function(config, parserConfig) {
|
||||
if (err) setStyle = "error";
|
||||
if (type == "endPlugin") return cont();
|
||||
return pass();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function attributes(type) {
|
||||
@@ -301,13 +301,6 @@ CodeMirror.defineMode('tiki', function(config, parserConfig) {
|
||||
if (context) return context.indent + indentUnit;
|
||||
else return 0;
|
||||
},
|
||||
compareStates: function(a, b) {
|
||||
if (a.indented != b.indented || a.pluginName != b.pluginName) return false;
|
||||
for (var ca = a.context, cb = b.context; ; ca = ca.prev, cb = cb.prev) {
|
||||
if (!ca || !cb) return ca == cb;
|
||||
if (ca.pluginName != cb.pluginName) return false;
|
||||
}
|
||||
},
|
||||
electricChars: "/"
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: VB.NET mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
@@ -12,8 +12,8 @@ CodeMirror.defineMode("vb", function(conf, parserConf) {
|
||||
var tripleDelimiters = new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))");
|
||||
var identifiers = new RegExp("^[_A-Za-z][_A-Za-z0-9]*");
|
||||
|
||||
var openingKeywords = ['class','module', 'sub','enum','select','while','if','function', 'get','set','property'];
|
||||
var middleKeywords = ['else','elseif','case'];
|
||||
var openingKeywords = ['class','module', 'sub','enum','select','while','if','function', 'get','set','property', 'try'];
|
||||
var middleKeywords = ['else','elseif','case', 'catch'];
|
||||
var endKeywords = ['next','loop'];
|
||||
|
||||
var wordOperators = wordRegexp(['and', 'or', 'not', 'xor', 'in']);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CodeMirror: VBScript mode</title>
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user