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
-
183src/js/matrix.js
-
38src/js/messaging.js
-
501src/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