Chromium Code Reviews| Index: third_party/WebKit/Source/devtools/front_end/changes/ChangesHighlighter.js |
| diff --git a/third_party/WebKit/Source/devtools/front_end/changes/ChangesHighlighter.js b/third_party/WebKit/Source/devtools/front_end/changes/ChangesHighlighter.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..7779755236060b146774846fdc86845dc9879cb5 |
| --- /dev/null |
| +++ b/third_party/WebKit/Source/devtools/front_end/changes/ChangesHighlighter.js |
| @@ -0,0 +1,160 @@ |
| +// Copyright 2017 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +/** |
| + * @param {!Object} config |
| + * @param {{rows: !Array<!Changes.ChangesView.Row>, baselineLines: !Array<string>, currentLines: !Array<string>, mimeType: string}} parserConfig |
| + * @return {{ |
| + * startState: function():!Changes.ChangesHighlighter.DiffState, |
| + * token: function({next: function()}, !Changes.ChangesHighlighter.DiffState):string, |
| + * blankLine: function(!Changes.ChangesHighlighter.DiffState):string, |
| + * copyState: function(!Changes.ChangesHighlighter.DiffState):Changes.ChangesHighlighter.DiffState |
| + * }} |
| + */ |
| +Changes.ChangesHighlighter = function(config, parserConfig) { |
|
lushnikov
2017/03/24 04:02:33
Now I believe that you can write it.
Let's start
|
| + var rows = parserConfig.rows; |
| + var baselineLines = parserConfig.baselineLines; |
| + var currentLines = parserConfig.currentLines; |
| + var innerMode = CodeMirror.getMode({}, parserConfig.mimeType); |
| + |
| + /** |
| + * @param {!Changes.ChangesHighlighter.DiffState} state |
| + * @param {number} baselineLineNumber |
| + * @param {number} currentLineNumber |
| + */ |
| + function fastForward(state, baselineLineNumber, currentLineNumber) { |
| + if (baselineLineNumber > state.baselineLineNumber) { |
| + fastForwardState(state.baselineState, state.baselineLineNumber, baselineLineNumber, baselineLines); |
| + state.baselineLineNumber = baselineLineNumber; |
| + } |
| + if (currentLineNumber > state.currentLineNumber) { |
| + fastForwardState(state.currentState, state.currentLineNumber, currentLineNumber, currentLines); |
| + state.currentLineNumber = currentLineNumber; |
| + } |
| + } |
| + |
| + /** |
| + * @param {!Object} state |
| + * @param {number} from |
| + * @param {number} to |
| + * @param {!Array<string>} lines |
| + */ |
| + function fastForwardState(state, from, to, lines) { |
| + var lineNumber = from; |
| + while (lineNumber < to && lineNumber < lines.length) { |
| + var stream = new CodeMirror.StringStream(lines[lineNumber]); |
| + while (!stream.eol()) { |
| + innerMode.token(stream, state); |
| + stream.start = stream.pos; |
| + } |
| + lineNumber++; |
| + } |
| + } |
| + |
| + return { |
| + /** |
| + * @return {!Changes.ChangesHighlighter.DiffState} |
| + */ |
| + startState: function() { |
| + return { |
| + lineNumber: 0, |
| + index: 0, |
| + currentLineNumber: 0, |
| + baselineLineNumber: 0, |
| + currentState: CodeMirror.startState(innerMode), |
| + baselineState: CodeMirror.startState(innerMode), |
| + mismatch: 0 |
| + }; |
| + }, |
| + |
| + /** |
| + * @param {!{next: function()}} stream |
| + * @param {!Changes.ChangesHighlighter.DiffState} state |
| + * @return {string} |
| + */ |
| + token: function(stream, state) { |
| + var row = rows[state.lineNumber]; |
| + if (!row) { |
| + stream.next(); |
| + return ''; |
| + } |
| + fastForward(state, row.base - 1, row.current - 1); |
| + var classes = ''; |
| + if (state.index === 0) |
| + classes += ' line-background-' + row.className + ' line-' + row.className; |
| + var chars = row.content[state.index].text.length; |
| + if (state.mismatch > 0) |
| + chars = state.mismatch; |
| + var pos = stream.pos; |
| + var innerStyle = state.lastInnerStyle; |
| + var innerPos = pos - state.mismatch; |
| + if (state.mismatch >= 0) { |
| + if (row.className === 'deletion' || row.className === 'addition' || row.className === 'equal') { |
| + innerStyle = innerMode.token(stream, row.className === 'deletion' ? state.baselineState : state.currentState); |
| + innerPos = stream.pos; |
| + } else { |
| + innerStyle = ''; |
| + innerPos = pos + chars; |
| + } |
| + } |
| + stream.pos = Math.min(innerPos, pos + chars); |
| + if (innerStyle) |
| + classes += ' ' + innerStyle; |
| + classes += ' ' + row.content[state.index].className; |
| + state.mismatch = pos + chars - innerPos; |
| + if (state.mismatch <= 0) { |
| + state.index++; |
| + state.lastInnerStyle = innerStyle; |
| + } |
| + if (state.index >= row.content.length) { |
| + state.lineNumber++; |
| + if (row.className === 'deletion') |
| + state.baselineLineNumber++; |
| + else |
| + state.currentLineNumber++; |
| + state.index = 0; |
| + } |
| + return classes; |
| + }, |
| + |
| + /** |
| + * @param {!Changes.ChangesHighlighter.DiffState} state |
| + * @return {string} |
| + */ |
| + blankLine: function(state) { |
| + var row = rows[state.lineNumber]; |
| + state.lineNumber++; |
| + state.mismatch = 0; |
| + state.index = 0; |
| + if (!row) |
| + return ''; |
| + if (row.className === 'deletion') |
| + state.baselineLineNumber++; |
| + else |
| + state.currentLineNumber++; |
| + var style = ''; |
| + if (innerMode.blankLine) |
| + style = innerMode.blankLine(row.className === 'deletion' ? state.baselineState : state.currentState); |
| + return style + ' line-background-' + row.className + ' line-' + row.className; |
| + }, |
| + |
| + /** |
| + * @param {!Changes.ChangesHighlighter.DiffState} state |
| + * @return {!Changes.ChangesHighlighter.DiffState} |
| + */ |
| + copyState: function(state) { |
| + var newState = /** @type {!Changes.ChangesHighlighter.DiffState} */ ({}); |
| + for (var i in state) |
| + newState[i] = state[i]; |
| + newState.currentState = CodeMirror.copyState(innerMode, state.currentState); |
| + newState.baselineState = CodeMirror.copyState(innerMode, state.baselineState); |
| + return newState; |
| + } |
| + }; |
| +}; |
| + |
| +/** @typedef {!{lineNumber: number, index: number}} */ |
| +Changes.ChangesHighlighter.DiffState; |
| + |
| +CodeMirror.defineMode('devtools-diff', Changes.ChangesHighlighter); |