Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/changes/ChangesHighlighter.js

Issue 2772643002: DevTools: Changes View (Closed)
Patch Set: Rename Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 /**
6 * @param {!Object} config
7 * @param {{rows: !Array<!Changes.ChangesView.Row>, baselineLines: !Array<string >, currentLines: !Array<string>, mimeType: string}} parserConfig
8 * @return {{
9 * startState: function():!Changes.ChangesHighlighter.DiffState,
10 * token: function({next: function()}, !Changes.ChangesHighlighter.DiffState):s tring,
11 * blankLine: function(!Changes.ChangesHighlighter.DiffState):string,
12 * copyState: function(!Changes.ChangesHighlighter.DiffState):Changes.ChangesHi ghlighter.DiffState
13 * }}
14 */
15 Changes.ChangesHighlighter = function(config, parserConfig) {
lushnikov 2017/03/24 04:02:33 Now I believe that you can write it. Let's start
16 var rows = parserConfig.rows;
17 var baselineLines = parserConfig.baselineLines;
18 var currentLines = parserConfig.currentLines;
19 var innerMode = CodeMirror.getMode({}, parserConfig.mimeType);
20
21 /**
22 * @param {!Changes.ChangesHighlighter.DiffState} state
23 * @param {number} baselineLineNumber
24 * @param {number} currentLineNumber
25 */
26 function fastForward(state, baselineLineNumber, currentLineNumber) {
27 if (baselineLineNumber > state.baselineLineNumber) {
28 fastForwardState(state.baselineState, state.baselineLineNumber, baselineLi neNumber, baselineLines);
29 state.baselineLineNumber = baselineLineNumber;
30 }
31 if (currentLineNumber > state.currentLineNumber) {
32 fastForwardState(state.currentState, state.currentLineNumber, currentLineN umber, currentLines);
33 state.currentLineNumber = currentLineNumber;
34 }
35 }
36
37 /**
38 * @param {!Object} state
39 * @param {number} from
40 * @param {number} to
41 * @param {!Array<string>} lines
42 */
43 function fastForwardState(state, from, to, lines) {
44 var lineNumber = from;
45 while (lineNumber < to && lineNumber < lines.length) {
46 var stream = new CodeMirror.StringStream(lines[lineNumber]);
47 while (!stream.eol()) {
48 innerMode.token(stream, state);
49 stream.start = stream.pos;
50 }
51 lineNumber++;
52 }
53 }
54
55 return {
56 /**
57 * @return {!Changes.ChangesHighlighter.DiffState}
58 */
59 startState: function() {
60 return {
61 lineNumber: 0,
62 index: 0,
63 currentLineNumber: 0,
64 baselineLineNumber: 0,
65 currentState: CodeMirror.startState(innerMode),
66 baselineState: CodeMirror.startState(innerMode),
67 mismatch: 0
68 };
69 },
70
71 /**
72 * @param {!{next: function()}} stream
73 * @param {!Changes.ChangesHighlighter.DiffState} state
74 * @return {string}
75 */
76 token: function(stream, state) {
77 var row = rows[state.lineNumber];
78 if (!row) {
79 stream.next();
80 return '';
81 }
82 fastForward(state, row.base - 1, row.current - 1);
83 var classes = '';
84 if (state.index === 0)
85 classes += ' line-background-' + row.className + ' line-' + row.classNam e;
86 var chars = row.content[state.index].text.length;
87 if (state.mismatch > 0)
88 chars = state.mismatch;
89 var pos = stream.pos;
90 var innerStyle = state.lastInnerStyle;
91 var innerPos = pos - state.mismatch;
92 if (state.mismatch >= 0) {
93 if (row.className === 'deletion' || row.className === 'addition' || row. className === 'equal') {
94 innerStyle = innerMode.token(stream, row.className === 'deletion' ? st ate.baselineState : state.currentState);
95 innerPos = stream.pos;
96 } else {
97 innerStyle = '';
98 innerPos = pos + chars;
99 }
100 }
101 stream.pos = Math.min(innerPos, pos + chars);
102 if (innerStyle)
103 classes += ' ' + innerStyle;
104 classes += ' ' + row.content[state.index].className;
105 state.mismatch = pos + chars - innerPos;
106 if (state.mismatch <= 0) {
107 state.index++;
108 state.lastInnerStyle = innerStyle;
109 }
110 if (state.index >= row.content.length) {
111 state.lineNumber++;
112 if (row.className === 'deletion')
113 state.baselineLineNumber++;
114 else
115 state.currentLineNumber++;
116 state.index = 0;
117 }
118 return classes;
119 },
120
121 /**
122 * @param {!Changes.ChangesHighlighter.DiffState} state
123 * @return {string}
124 */
125 blankLine: function(state) {
126 var row = rows[state.lineNumber];
127 state.lineNumber++;
128 state.mismatch = 0;
129 state.index = 0;
130 if (!row)
131 return '';
132 if (row.className === 'deletion')
133 state.baselineLineNumber++;
134 else
135 state.currentLineNumber++;
136 var style = '';
137 if (innerMode.blankLine)
138 style = innerMode.blankLine(row.className === 'deletion' ? state.baselin eState : state.currentState);
139 return style + ' line-background-' + row.className + ' line-' + row.classN ame;
140 },
141
142 /**
143 * @param {!Changes.ChangesHighlighter.DiffState} state
144 * @return {!Changes.ChangesHighlighter.DiffState}
145 */
146 copyState: function(state) {
147 var newState = /** @type {!Changes.ChangesHighlighter.DiffState} */ ({});
148 for (var i in state)
149 newState[i] = state[i];
150 newState.currentState = CodeMirror.copyState(innerMode, state.currentState );
151 newState.baselineState = CodeMirror.copyState(innerMode, state.baselineSta te);
152 return newState;
153 }
154 };
155 };
156
157 /** @typedef {!{lineNumber: number, index: number}} */
158 Changes.ChangesHighlighter.DiffState;
159
160 CodeMirror.defineMode('devtools-diff', Changes.ChangesHighlighter);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698