Raymond Hill
7 years ago
No known key found for this signature in database
GPG Key ID: 25E1490B761470C2
17 changed files with 12057 additions and 399 deletions
-
4src/about.html
-
29src/css/codemirror.css
-
3src/css/dashboard-common.css
-
161src/css/user-rules.css
-
179src/js/matrix.js
-
38src/js/messaging.js
-
507src/js/user-rules.js
-
21src/lib/codemirror/LICENSE
-
35src/lib/codemirror/README.md
-
119src/lib/codemirror/addon/merge/merge.css
-
1002src/lib/codemirror/addon/merge/merge.js
-
72src/lib/codemirror/addon/selection/active-line.js
-
346src/lib/codemirror/lib/codemirror.css
-
9660src/lib/codemirror/lib/codemirror.js
-
34src/lib/diff/README.md
-
207src/lib/diff/swatinem_diff.js
-
41src/user-rules.html
@ -0,0 +1,29 @@ |
|||||
|
.codeMirrorContainer { |
||||
|
font-size: 12px; |
||||
|
line-height: 1.25; |
||||
|
overflow: hidden; |
||||
|
position: relative; |
||||
|
} |
||||
|
.CodeMirror { |
||||
|
border: 1px solid #ddd; |
||||
|
box-sizing: border-box; |
||||
|
flex-grow: 1; |
||||
|
height: 100%; |
||||
|
width: 100%; |
||||
|
} |
||||
|
|
||||
|
/* For when panels are used */ |
||||
|
.codeMirrorContainer > div:not([class^="CodeMirror"]) { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
height: 100%; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-merge-l-deleted { |
||||
|
background-image: none; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
.CodeMirror-merge-l-inserted { |
||||
|
background-image: none; |
||||
|
font-weight: bold; |
||||
|
} |
@ -0,0 +1,21 @@ |
|||||
|
MIT License |
||||
|
|
||||
|
Copyright (C) 2017 by Marijn Haverbeke <marijnh@gmail.com> and others |
||||
|
|
||||
|
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. |
@ -0,0 +1,35 @@ |
|||||
|
# CodeMirror |
||||
|
[![Build Status](https://travis-ci.org/codemirror/CodeMirror.svg)](https://travis-ci.org/codemirror/CodeMirror) |
||||
|
[![NPM version](https://img.shields.io/npm/v/codemirror.svg)](https://www.npmjs.org/package/codemirror) |
||||
|
[![Join the chat at https://gitter.im/codemirror/CodeMirror](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/codemirror/CodeMirror) |
||||
|
[Funding status: ![maintainer happiness](https://marijnhaverbeke.nl/fund/status_s.png?again)](https://marijnhaverbeke.nl/fund/) |
||||
|
|
||||
|
CodeMirror is a versatile text editor implemented in JavaScript for |
||||
|
the browser. It is specialized for editing code, and comes with over |
||||
|
100 language modes and various addons that implement more advanced |
||||
|
editing functionality. Every language comes with fully-featured code |
||||
|
and syntax highlighting to help with reading and editing complex code. |
||||
|
|
||||
|
A rich programming API and a CSS theming system are available for |
||||
|
customizing CodeMirror to fit your application, and extending it with |
||||
|
new functionality. |
||||
|
|
||||
|
You can find more information (and the |
||||
|
[manual](http://codemirror.net/doc/manual.html)) on the [project |
||||
|
page](http://codemirror.net). For questions and discussion, use the |
||||
|
[discussion forum](https://discuss.codemirror.net/). |
||||
|
|
||||
|
See |
||||
|
[CONTRIBUTING.md](https://github.com/codemirror/CodeMirror/blob/master/CONTRIBUTING.md) |
||||
|
for contributing guidelines. |
||||
|
|
||||
|
The CodeMirror community aims to be welcoming to everybody. We use the |
||||
|
[Contributor Covenant |
||||
|
(1.1)](http://contributor-covenant.org/version/1/1/0/) as our code of |
||||
|
conduct. |
||||
|
|
||||
|
### Quickstart |
||||
|
|
||||
|
To build the project, make sure you have Node.js installed (at least version 6) |
||||
|
and then `npm install`. To run, just open `index.html` in your |
||||
|
browser (you don't need to run a webserver). Run the tests with `npm test`. |
@ -0,0 +1,119 @@ |
|||||
|
.CodeMirror-merge { |
||||
|
position: relative; |
||||
|
border: 1px solid #ddd; |
||||
|
white-space: pre; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-merge, .CodeMirror-merge .CodeMirror { |
||||
|
height: 350px; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 47%; } |
||||
|
.CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 6%; } |
||||
|
.CodeMirror-merge-3pane .CodeMirror-merge-pane { width: 31%; } |
||||
|
.CodeMirror-merge-3pane .CodeMirror-merge-gap { width: 3.5%; } |
||||
|
|
||||
|
.CodeMirror-merge-pane { |
||||
|
display: inline-block; |
||||
|
white-space: normal; |
||||
|
vertical-align: top; |
||||
|
} |
||||
|
.CodeMirror-merge-pane-rightmost { |
||||
|
position: absolute; |
||||
|
right: 0px; |
||||
|
z-index: 1; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-merge-gap { |
||||
|
z-index: 2; |
||||
|
display: inline-block; |
||||
|
height: 100%; |
||||
|
-moz-box-sizing: border-box; |
||||
|
box-sizing: border-box; |
||||
|
overflow: hidden; |
||||
|
border-left: 1px solid #ddd; |
||||
|
border-right: 1px solid #ddd; |
||||
|
position: relative; |
||||
|
background: #f8f8f8; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-merge-scrolllock-wrap { |
||||
|
position: absolute; |
||||
|
bottom: 0; left: 50%; |
||||
|
} |
||||
|
.CodeMirror-merge-scrolllock { |
||||
|
position: relative; |
||||
|
left: -50%; |
||||
|
cursor: pointer; |
||||
|
color: #555; |
||||
|
line-height: 1; |
||||
|
} |
||||
|
.CodeMirror-merge-scrolllock:after { |
||||
|
content: "\21db\00a0\00a0\21da"; |
||||
|
} |
||||
|
.CodeMirror-merge-scrolllock.CodeMirror-merge-scrolllock-enabled:after { |
||||
|
content: "\21db\21da"; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right { |
||||
|
position: absolute; |
||||
|
left: 0; top: 0; |
||||
|
right: 0; bottom: 0; |
||||
|
line-height: 1; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-merge-copy { |
||||
|
position: absolute; |
||||
|
cursor: pointer; |
||||
|
color: #44c; |
||||
|
z-index: 3; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-merge-copy-reverse { |
||||
|
position: absolute; |
||||
|
cursor: pointer; |
||||
|
color: #44c; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; } |
||||
|
.CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; } |
||||
|
|
||||
|
.CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted { |
||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==); |
||||
|
background-position: bottom left; |
||||
|
background-repeat: repeat-x; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted { |
||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==); |
||||
|
background-position: bottom left; |
||||
|
background-repeat: repeat-x; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-merge-r-chunk { background: #ffffe0; } |
||||
|
.CodeMirror-merge-r-chunk-start { border-top: 1px solid #ee8; } |
||||
|
.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #ee8; } |
||||
|
.CodeMirror-merge-r-connect { fill: #ffffe0; stroke: #ee8; stroke-width: 1px; } |
||||
|
|
||||
|
.CodeMirror-merge-l-chunk { background: #eef; } |
||||
|
.CodeMirror-merge-l-chunk-start { border-top: 1px solid #88e; } |
||||
|
.CodeMirror-merge-l-chunk-end { border-bottom: 1px solid #88e; } |
||||
|
.CodeMirror-merge-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; } |
||||
|
|
||||
|
.CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk { background: #dfd; } |
||||
|
.CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start { border-top: 1px solid #4e4; } |
||||
|
.CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #4e4; } |
||||
|
|
||||
|
.CodeMirror-merge-collapsed-widget:before { |
||||
|
content: "(...)"; |
||||
|
} |
||||
|
.CodeMirror-merge-collapsed-widget { |
||||
|
cursor: pointer; |
||||
|
color: #88b; |
||||
|
background: #eef; |
||||
|
border: 1px solid #ddf; |
||||
|
font-size: 90%; |
||||
|
padding: 0 3px; |
||||
|
border-radius: 4px; |
||||
|
} |
||||
|
.CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt { display: none; } |
1002
src/lib/codemirror/addon/merge/merge.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,72 @@ |
|||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||
|
|
||||
|
(function(mod) { |
||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||
|
mod(require("../../lib/codemirror")); |
||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||
|
define(["../../lib/codemirror"], mod); |
||||
|
else // Plain browser env
|
||||
|
mod(CodeMirror); |
||||
|
})(function(CodeMirror) { |
||||
|
"use strict"; |
||||
|
var WRAP_CLASS = "CodeMirror-activeline"; |
||||
|
var BACK_CLASS = "CodeMirror-activeline-background"; |
||||
|
var GUTT_CLASS = "CodeMirror-activeline-gutter"; |
||||
|
|
||||
|
CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) { |
||||
|
var prev = old == CodeMirror.Init ? false : old; |
||||
|
if (val == prev) return |
||||
|
if (prev) { |
||||
|
cm.off("beforeSelectionChange", selectionChange); |
||||
|
clearActiveLines(cm); |
||||
|
delete cm.state.activeLines; |
||||
|
} |
||||
|
if (val) { |
||||
|
cm.state.activeLines = []; |
||||
|
updateActiveLines(cm, cm.listSelections()); |
||||
|
cm.on("beforeSelectionChange", selectionChange); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
function clearActiveLines(cm) { |
||||
|
for (var i = 0; i < cm.state.activeLines.length; i++) { |
||||
|
cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS); |
||||
|
cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS); |
||||
|
cm.removeLineClass(cm.state.activeLines[i], "gutter", GUTT_CLASS); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function sameArray(a, b) { |
||||
|
if (a.length != b.length) return false; |
||||
|
for (var i = 0; i < a.length; i++) |
||||
|
if (a[i] != b[i]) return false; |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
function updateActiveLines(cm, ranges) { |
||||
|
var active = []; |
||||
|
for (var i = 0; i < ranges.length; i++) { |
||||
|
var range = ranges[i]; |
||||
|
var option = cm.getOption("styleActiveLine"); |
||||
|
if (typeof option == "object" && option.nonEmpty ? range.anchor.line != range.head.line : !range.empty()) |
||||
|
continue |
||||
|
var line = cm.getLineHandleVisualStart(range.head.line); |
||||
|
if (active[active.length - 1] != line) active.push(line); |
||||
|
} |
||||
|
if (sameArray(cm.state.activeLines, active)) return; |
||||
|
cm.operation(function() { |
||||
|
clearActiveLines(cm); |
||||
|
for (var i = 0; i < active.length; i++) { |
||||
|
cm.addLineClass(active[i], "wrap", WRAP_CLASS); |
||||
|
cm.addLineClass(active[i], "background", BACK_CLASS); |
||||
|
cm.addLineClass(active[i], "gutter", GUTT_CLASS); |
||||
|
} |
||||
|
cm.state.activeLines = active; |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
function selectionChange(cm, sel) { |
||||
|
updateActiveLines(cm, sel.ranges); |
||||
|
} |
||||
|
}); |
@ -0,0 +1,346 @@ |
|||||
|
/* BASICS */ |
||||
|
|
||||
|
.CodeMirror { |
||||
|
/* Set height, width, borders, and global font properties here */ |
||||
|
font-family: monospace; |
||||
|
height: 300px; |
||||
|
color: black; |
||||
|
direction: ltr; |
||||
|
} |
||||
|
|
||||
|
/* PADDING */ |
||||
|
|
||||
|
.CodeMirror-lines { |
||||
|
padding: 4px 0; /* Vertical padding around content */ |
||||
|
} |
||||
|
.CodeMirror pre { |
||||
|
padding: 0 4px; /* Horizontal padding of content */ |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { |
||||
|
background-color: white; /* The little square between H and V scrollbars */ |
||||
|
} |
||||
|
|
||||
|
/* GUTTER */ |
||||
|
|
||||
|
.CodeMirror-gutters { |
||||
|
border-right: 1px solid #ddd; |
||||
|
background-color: #f7f7f7; |
||||
|
white-space: nowrap; |
||||
|
} |
||||
|
.CodeMirror-linenumbers {} |
||||
|
.CodeMirror-linenumber { |
||||
|
padding: 0 3px 0 5px; |
||||
|
min-width: 20px; |
||||
|
text-align: right; |
||||
|
color: #999; |
||||
|
white-space: nowrap; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-guttermarker { color: black; } |
||||
|
.CodeMirror-guttermarker-subtle { color: #999; } |
||||
|
|
||||
|
/* CURSOR */ |
||||
|
|
||||
|
.CodeMirror-cursor { |
||||
|
border-left: 1px solid black; |
||||
|
border-right: none; |
||||
|
width: 0; |
||||
|
} |
||||
|
/* Shown when moving in bi-directional text */ |
||||
|
.CodeMirror div.CodeMirror-secondarycursor { |
||||
|
border-left: 1px solid silver; |
||||
|
} |
||||
|
.cm-fat-cursor .CodeMirror-cursor { |
||||
|
width: auto; |
||||
|
border: 0 !important; |
||||
|
background: #7e7; |
||||
|
} |
||||
|
.cm-fat-cursor div.CodeMirror-cursors { |
||||
|
z-index: 1; |
||||
|
} |
||||
|
.cm-fat-cursor-mark { |
||||
|
background-color: rgba(20, 255, 20, 0.5); |
||||
|
-webkit-animation: blink 1.06s steps(1) infinite; |
||||
|
-moz-animation: blink 1.06s steps(1) infinite; |
||||
|
animation: blink 1.06s steps(1) infinite; |
||||
|
} |
||||
|
.cm-animate-fat-cursor { |
||||
|
width: auto; |
||||
|
border: 0; |
||||
|
-webkit-animation: blink 1.06s steps(1) infinite; |
||||
|
-moz-animation: blink 1.06s steps(1) infinite; |
||||
|
animation: blink 1.06s steps(1) infinite; |
||||
|
background-color: #7e7; |
||||
|
} |
||||
|
@-moz-keyframes blink { |
||||
|
0% {} |
||||
|
50% { background-color: transparent; } |
||||
|
100% {} |
||||
|
} |
||||
|
@-webkit-keyframes blink { |
||||
|
0% {} |
||||
|
50% { background-color: transparent; } |
||||
|
100% {} |
||||
|
} |
||||
|
@keyframes blink { |
||||
|
0% {} |
||||
|
50% { background-color: transparent; } |
||||
|
100% {} |
||||
|
} |
||||
|
|
||||
|
/* Can style cursor different in overwrite (non-insert) mode */ |
||||
|
.CodeMirror-overwrite .CodeMirror-cursor {} |
||||
|
|
||||
|
.cm-tab { display: inline-block; text-decoration: inherit; } |
||||
|
|
||||
|
.CodeMirror-rulers { |
||||
|
position: absolute; |
||||
|
left: 0; right: 0; top: -50px; bottom: -20px; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
.CodeMirror-ruler { |
||||
|
border-left: 1px solid #ccc; |
||||
|
top: 0; bottom: 0; |
||||
|
position: absolute; |
||||
|
} |
||||
|
|
||||
|
/* DEFAULT THEME */ |
||||
|
|
||||
|
.cm-s-default .cm-header {color: blue;} |
||||
|
.cm-s-default .cm-quote {color: #090;} |
||||
|
.cm-negative {color: #d44;} |
||||
|
.cm-positive {color: #292;} |
||||
|
.cm-header, .cm-strong {font-weight: bold;} |
||||
|
.cm-em {font-style: italic;} |
||||
|
.cm-link {text-decoration: underline;} |
||||
|
.cm-strikethrough {text-decoration: line-through;} |
||||
|
|
||||
|
.cm-s-default .cm-keyword {color: #708;} |
||||
|
.cm-s-default .cm-atom {color: #219;} |
||||
|
.cm-s-default .cm-number {color: #164;} |
||||
|
.cm-s-default .cm-def {color: #00f;} |
||||
|
.cm-s-default .cm-variable, |
||||
|
.cm-s-default .cm-punctuation, |
||||
|
.cm-s-default .cm-property, |
||||
|
.cm-s-default .cm-operator {} |
||||
|
.cm-s-default .cm-variable-2 {color: #05a;} |
||||
|
.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;} |
||||
|
.cm-s-default .cm-comment {color: #a50;} |
||||
|
.cm-s-default .cm-string {color: #a11;} |
||||
|
.cm-s-default .cm-string-2 {color: #f50;} |
||||
|
.cm-s-default .cm-meta {color: #555;} |
||||
|
.cm-s-default .cm-qualifier {color: #555;} |
||||
|
.cm-s-default .cm-builtin {color: #30a;} |
||||
|
.cm-s-default .cm-bracket {color: #997;} |
||||
|
.cm-s-default .cm-tag {color: #170;} |
||||
|
.cm-s-default .cm-attribute {color: #00c;} |
||||
|
.cm-s-default .cm-hr {color: #999;} |
||||
|
.cm-s-default .cm-link {color: #00c;} |
||||
|
|
||||
|
.cm-s-default .cm-error {color: #f00;} |
||||
|
.cm-invalidchar {color: #f00;} |
||||
|
|
||||
|
.CodeMirror-composing { border-bottom: 2px solid; } |
||||
|
|
||||
|
/* Default styles for common addons */ |
||||
|
|
||||
|
div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;} |
||||
|
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;} |
||||
|
.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } |
||||
|
.CodeMirror-activeline-background {background: #e8f2ff;} |
||||
|
|
||||
|
/* STOP */ |
||||
|
|
||||
|
/* The rest of this file contains styles related to the mechanics of |
||||
|
the editor. You probably shouldn't touch them. */ |
||||
|
|
||||
|
.CodeMirror { |
||||
|
position: relative; |
||||
|
overflow: hidden; |
||||
|
background: white; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-scroll { |
||||
|
overflow: scroll !important; /* Things will break if this is overridden */ |
||||
|
/* 30px is the magic margin used to hide the element's real scrollbars */ |
||||
|
/* See overflow: hidden in .CodeMirror */ |
||||
|
margin-bottom: -30px; margin-right: -30px; |
||||
|
padding-bottom: 30px; |
||||
|
height: 100%; |
||||
|
outline: none; /* Prevent dragging from highlighting the element */ |
||||
|
position: relative; |
||||
|
} |
||||
|
.CodeMirror-sizer { |
||||
|
position: relative; |
||||
|
border-right: 30px solid transparent; |
||||
|
} |
||||
|
|
||||
|
/* The fake, visible scrollbars. Used to force redraw during scrolling |
||||
|
before actual scrolling happens, thus preventing shaking and |
||||
|
flickering artifacts. */ |
||||
|
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { |
||||
|
position: absolute; |
||||
|
z-index: 6; |
||||
|
display: none; |
||||
|
} |
||||
|
.CodeMirror-vscrollbar { |
||||
|
right: 0; top: 0; |
||||
|
overflow-x: hidden; |
||||
|
overflow-y: scroll; |
||||
|
} |
||||
|
.CodeMirror-hscrollbar { |
||||
|
bottom: 0; left: 0; |
||||
|
overflow-y: hidden; |
||||
|
overflow-x: scroll; |
||||
|
} |
||||
|
.CodeMirror-scrollbar-filler { |
||||
|
right: 0; bottom: 0; |
||||
|
} |
||||
|
.CodeMirror-gutter-filler { |
||||
|
left: 0; bottom: 0; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-gutters { |
||||
|
position: absolute; left: 0; top: 0; |
||||
|
min-height: 100%; |
||||
|
z-index: 3; |
||||
|
} |
||||
|
.CodeMirror-gutter { |
||||
|
white-space: normal; |
||||
|
height: 100%; |
||||
|
display: inline-block; |
||||
|
vertical-align: top; |
||||
|
margin-bottom: -30px; |
||||
|
} |
||||
|
.CodeMirror-gutter-wrapper { |
||||
|
position: absolute; |
||||
|
z-index: 4; |
||||
|
background: none !important; |
||||
|
border: none !important; |
||||
|
} |
||||
|
.CodeMirror-gutter-background { |
||||
|
position: absolute; |
||||
|
top: 0; bottom: 0; |
||||
|
z-index: 4; |
||||
|
} |
||||
|
.CodeMirror-gutter-elt { |
||||
|
position: absolute; |
||||
|
cursor: default; |
||||
|
z-index: 4; |
||||
|
} |
||||
|
.CodeMirror-gutter-wrapper ::selection { background-color: transparent } |
||||
|
.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent } |
||||
|
|
||||
|
.CodeMirror-lines { |
||||
|
cursor: text; |
||||
|
min-height: 1px; /* prevents collapsing before first draw */ |
||||
|
} |
||||
|
.CodeMirror pre { |
||||
|
/* Reset some styles that the rest of the page might have set */ |
||||
|
-moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; |
||||
|
border-width: 0; |
||||
|
background: transparent; |
||||
|
font-family: inherit; |
||||
|
font-size: inherit; |
||||
|
margin: 0; |
||||
|
white-space: pre; |
||||
|
word-wrap: normal; |
||||
|
line-height: inherit; |
||||
|
color: inherit; |
||||
|
z-index: 2; |
||||
|
position: relative; |
||||
|
overflow: visible; |
||||
|
-webkit-tap-highlight-color: transparent; |
||||
|
-webkit-font-variant-ligatures: contextual; |
||||
|
font-variant-ligatures: contextual; |
||||
|
} |
||||
|
.CodeMirror-wrap pre { |
||||
|
word-wrap: break-word; |
||||
|
white-space: pre-wrap; |
||||
|
word-break: normal; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-linebackground { |
||||
|
position: absolute; |
||||
|
left: 0; right: 0; top: 0; bottom: 0; |
||||
|
z-index: 0; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-linewidget { |
||||
|
position: relative; |
||||
|
z-index: 2; |
||||
|
padding: 0.1px; /* Force widget margins to stay inside of the container */ |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-widget {} |
||||
|
|
||||
|
.CodeMirror-rtl pre { direction: rtl; } |
||||
|
|
||||
|
.CodeMirror-code { |
||||
|
outline: none; |
||||
|
} |
||||
|
|
||||
|
/* Force content-box sizing for the elements where we expect it */ |
||||
|
.CodeMirror-scroll, |
||||
|
.CodeMirror-sizer, |
||||
|
.CodeMirror-gutter, |
||||
|
.CodeMirror-gutters, |
||||
|
.CodeMirror-linenumber { |
||||
|
-moz-box-sizing: content-box; |
||||
|
box-sizing: content-box; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-measure { |
||||
|
position: absolute; |
||||
|
width: 100%; |
||||
|
height: 0; |
||||
|
overflow: hidden; |
||||
|
visibility: hidden; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-cursor { |
||||
|
position: absolute; |
||||
|
pointer-events: none; |
||||
|
} |
||||
|
.CodeMirror-measure pre { position: static; } |
||||
|
|
||||
|
div.CodeMirror-cursors { |
||||
|
visibility: hidden; |
||||
|
position: relative; |
||||
|
z-index: 3; |
||||
|
} |
||||
|
div.CodeMirror-dragcursors { |
||||
|
visibility: visible; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-focused div.CodeMirror-cursors { |
||||
|
visibility: visible; |
||||
|
} |
||||
|
|
||||
|
.CodeMirror-selected { background: #d9d9d9; } |
||||
|
.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } |
||||
|
.CodeMirror-crosshair { cursor: crosshair; } |
||||
|
.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } |
||||
|
.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } |
||||
|
|
||||
|
.cm-searching { |
||||
|
background-color: #ffa; |
||||
|
background-color: rgba(255, 255, 0, .4); |
||||
|
} |
||||
|
|
||||
|
/* Used to force a border model for a node */ |
||||
|
.cm-force-border { padding-right: .1px; } |
||||
|
|
||||
|
@media print { |
||||
|
/* Hide the cursor when printing */ |
||||
|
.CodeMirror div.CodeMirror-cursors { |
||||
|
visibility: hidden; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* See issue #2901 */ |
||||
|
.cm-tab-wrap-hack:after { content: ''; } |
||||
|
|
||||
|
/* Help users use markselection to safely style text background */ |
||||
|
span.CodeMirror-selectedtext { background: none; } |
9660
src/lib/codemirror/lib/codemirror.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,34 @@ |
|||||
|
# diff |
||||
|
|
||||
|
implementation of myers diff algorithm |
||||
|
|
||||
|
[![Build Status](https://travis-ci.org/Swatinem/diff.png?branch=master)](https://travis-ci.org/Swatinem/diff) |
||||
|
[![Coverage Status](https://coveralls.io/repos/Swatinem/diff/badge.png?branch=master)](https://coveralls.io/r/Swatinem/diff) |
||||
|
[![Dependency Status](https://gemnasium.com/Swatinem/diff.png)](https://gemnasium.com/Swatinem/diff) |
||||
|
|
||||
|
|
||||
|
This uses the [*An O(ND) Difference Algorithm and Its Variations*](http://www.xmailserver.org/diff2.pdf) |
||||
|
Also see http://simplygenius.net/Article/DiffTutorial2 and |
||||
|
http://www.mathertel.de/Diff/ViewSrc.aspx for more inspiration |
||||
|
|
||||
|
## Installation |
||||
|
|
||||
|
$ npm install diff |
||||
|
$ component install Swatinem/diff |
||||
|
|
||||
|
## Usage |
||||
|
|
||||
|
### diff(a, b, [eql(a, b)]) |
||||
|
|
||||
|
Given two arrays (or array-likes, such as strings) `a` and `b` and an optional |
||||
|
equal function `eql`, this will return an array with the following operations: |
||||
|
* *nop* the element is in both arrays |
||||
|
* *ins* the element is only in array `b` and will be inserted |
||||
|
* *del* the element in only in array `a` and will be removed |
||||
|
* *rep* the element from `a` will be replaced by the element from `b`. |
||||
|
This is essentially the same as a del+ins |
||||
|
|
||||
|
## License |
||||
|
|
||||
|
LGPLv3 |
||||
|
|
@ -0,0 +1,207 @@ |
|||||
|
/******************************************************************************* |
||||
|
|
||||
|
Key portions of code below was borrowed from: |
||||
|
https://github.com/Swatinem/diff
|
||||
|
|
||||
|
License is LGPL3 (thanks!) as per: |
||||
|
https://github.com/Swatinem/diff/blob/b58391504759/README.md
|
||||
|
|
||||
|
I chose to pick this implementation over |
||||
|
https://github.com/google/diff-match-patch as suggested by CodeMirror
|
||||
|
because: |
||||
|
|
||||
|
- Code is clean and simple to read -- useful when unfamiliar with the diff |
||||
|
algorithm, this makes changing the code easier if/when needed. |
||||
|
|
||||
|
- Smaller -- diff_match_patch comes with an extended API most of which is |
||||
|
of no use to the current project. |
||||
|
- diff_match_patch uncompressed: 74.7 KB |
||||
|
- Swatinem's diff uncompressed: 3.66 KB |
||||
|
|
||||
|
- I can easily adapt Swatinem's diff to deal with arrays of strings, which |
||||
|
is best suited for the current project -- it natively work with arrays. |
||||
|
|
||||
|
I removed portions of code which are of no use for the current project. |
||||
|
|
||||
|
I modified the diff script generator (Diff.prototype.editscript) since I |
||||
|
need to generate a script which is compatible with the output of the |
||||
|
diff_match_patch, as expected by CodeMirror. |
||||
|
|
||||
|
**/ |
||||
|
|
||||
|
'use strict'; |
||||
|
|
||||
|
(function(context) { |
||||
|
|
||||
|
// CodeMirror expect these globals:
|
||||
|
context.DIFF_INSERT = 1; |
||||
|
context.DIFF_DELETE = -1; |
||||
|
context.DIFF_EQUAL = 0; |
||||
|
context.diff_match_patch = function(){}; |
||||
|
|
||||
|
context.diff_match_patch.prototype.diff_main = function(a, b) { |
||||
|
if ( a === b ) { return [ [ 0, a ] ]; } |
||||
|
var aa = a.match(/\n|[^\n]+\n?/g) || []; |
||||
|
var bb = b.match(/\n|[^\n]+\n?/g) || []; |
||||
|
var d = new Diff(aa, bb, eqlDefault); |
||||
|
return d.editscript(); |
||||
|
}; |
||||
|
|
||||
|
function eqlDefault(a, b) { return a === b; } |
||||
|
|
||||
|
function Diff(a, b, eql) { |
||||
|
this.a = a; |
||||
|
this.b = b; |
||||
|
this.eql = eql; |
||||
|
|
||||
|
this.moda = Array.apply(null, new Array(a.length)).map(true.valueOf, false); |
||||
|
this.modb = Array.apply(null, new Array(b.length)).map(true.valueOf, false); |
||||
|
|
||||
|
// just to save some allocations:
|
||||
|
this.down = {}; |
||||
|
this.up = {}; |
||||
|
|
||||
|
this.lcs(0, a.length, 0, b.length); |
||||
|
} |
||||
|
|
||||
|
Diff.prototype.editscript = function Diff_editscript() { |
||||
|
var moda = this.moda, modb = this.modb; |
||||
|
var astart = 0, aend = moda.length; |
||||
|
var bstart = 0, bend = modb.length; |
||||
|
var result = []; |
||||
|
while (astart < aend || bstart < bend) { |
||||
|
if (astart < aend && bstart < bend) { |
||||
|
if (!moda[astart] && !modb[bstart]) { |
||||
|
result.push([ 0, this.a[astart] ]); |
||||
|
astart++; bstart++; |
||||
|
continue; |
||||
|
} else if (moda[astart] && modb[bstart]) { |
||||
|
result.push([ -1, this.a[astart] ]); |
||||
|
result.push([ 1, this.b[bstart] ]); |
||||
|
astart++; bstart++; |
||||
|
continue; |
||||
|
} |
||||
|
} |
||||
|
if (astart < aend && (bstart >= bend || moda[astart])) { |
||||
|
result.push([ -1, this.a[astart] ]); |
||||
|
astart++; |
||||
|
} |
||||
|
if (bstart < bend && (astart >= aend || modb[bstart])) { |
||||
|
result.push([ 1, this.b[bstart] ]); |
||||
|
bstart++; |
||||
|
} |
||||
|
} |
||||
|
return result; |
||||
|
}; |
||||
|
|
||||
|
Diff.prototype.lcs = function Diff_lcs(astart, aend, bstart, bend) { |
||||
|
var a = this.a, b = this.b, eql = this.eql; |
||||
|
// separate common head
|
||||
|
while (astart < aend && bstart < bend && eql(a[astart], b[bstart])) { |
||||
|
astart++; bstart++; |
||||
|
} |
||||
|
// separate common tail
|
||||
|
while (astart < aend && bstart < bend && eql(a[aend - 1], b[bend - 1])) { |
||||
|
aend--; bend--; |
||||
|
} |
||||
|
|
||||
|
if (astart === aend) { |
||||
|
// only insertions
|
||||
|
while (bstart < bend) { |
||||
|
this.modb[bstart] = true; |
||||
|
bstart++; |
||||
|
} |
||||
|
} else if (bend === bstart) { |
||||
|
// only deletions
|
||||
|
while (astart < aend) { |
||||
|
this.moda[astart] = true; |
||||
|
astart++; |
||||
|
} |
||||
|
} else { |
||||
|
var snake = this.snake(astart, aend, bstart, bend); |
||||
|
|
||||
|
this.lcs(astart, snake.x, bstart, snake.y); |
||||
|
this.lcs(snake.u, aend, snake.v, bend); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
Diff.prototype.snake = function Diff_snake(astart, aend, bstart, bend) { |
||||
|
var a = this.a, b = this.b, eql = this.eql; |
||||
|
|
||||
|
var N = aend - astart, |
||||
|
M = bend - bstart; |
||||
|
|
||||
|
var kdown = astart - bstart; |
||||
|
var kup = aend - bend; |
||||
|
|
||||
|
var delta = N - M; |
||||
|
var deltaOdd = delta & 1; |
||||
|
|
||||
|
var down = this.down; |
||||
|
down[kdown + 1] = astart; |
||||
|
var up = this.up; |
||||
|
up[kup - 1] = aend; |
||||
|
|
||||
|
var Dmax = (N + M + 1) / 2; |
||||
|
for (var D = 0; D <= Dmax; D++) { |
||||
|
var k, x, y; |
||||
|
// forward path
|
||||
|
for (k = kdown - D; k <= kdown + D; k += 2) { |
||||
|
if (k === kdown - D) { |
||||
|
x = down[k + 1]; // down
|
||||
|
} else { |
||||
|
x = down[k - 1] + 1; // right
|
||||
|
if ((k < kdown + D) && (down[k + 1] >= x)) { |
||||
|
x = down[k + 1]; // down
|
||||
|
} |
||||
|
} |
||||
|
y = x - k; |
||||
|
|
||||
|
while (x < aend && y < bend && eql(a[x], b[y])) { |
||||
|
x++; y++; // diagonal
|
||||
|
} |
||||
|
down[k] = x; |
||||
|
|
||||
|
if (deltaOdd && (kup - D < k) && (k < kup + D) && |
||||
|
up[k] <= down[k]) { |
||||
|
return { |
||||
|
x: down[k], |
||||
|
y: down[k] - k, |
||||
|
u: up[k], |
||||
|
v: up[k] - k, |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// reverse path
|
||||
|
for (k = kup - D; k <= kup + D; k += 2) { |
||||
|
if (k === kup + D) { |
||||
|
x = up[k - 1]; // up
|
||||
|
} else { |
||||
|
x = up[k + 1] - 1; // left
|
||||
|
if ((k > kup - D) && (up[k - 1] < x)) { |
||||
|
x = up[k - 1]; // up
|
||||
|
} |
||||
|
} |
||||
|
y = x - k; |
||||
|
|
||||
|
while (x > astart && y > bstart && eql(a[x - 1], b[y - 1])) { |
||||
|
x--; y--; // diagonal
|
||||
|
} |
||||
|
up[k] = x; |
||||
|
|
||||
|
if (!deltaOdd && (kdown - D <= k) && (k <= kdown + D) && |
||||
|
up[k] <= down[k]) { |
||||
|
return { |
||||
|
x: down[k], |
||||
|
y: down[k] - k, |
||||
|
u: up[k], |
||||
|
v: up[k] - k, |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
return Diff; |
||||
|
})(self); |
Write
Preview
Loading…
Cancel
Save
Reference in new issue