Skip to content

Commit 76392ae

Browse files
committed
Emmet Reflect CSS Value in html files
1 parent 5db74cd commit 76392ae

3 files changed

Lines changed: 58 additions & 15 deletions

File tree

extensions/emmet/src/reflectCssValue.ts

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { Range, window, TextEditor } from 'vscode';
7-
import { isStyleSheet } from 'vscode-emmet-helper';
8-
import { parse, getNode, getCssProperty } from './util';
7+
import { getCssProperty, getCssPropertyNode } from './util';
98
import { Property, Rule } from 'EmmetNode';
109

1110
const vendorPrefixes = ['-webkit-', '-moz-', '-ms-', '-o-', ''];
@@ -17,18 +16,12 @@ export function reflectCssValue() {
1716
return;
1817
}
1918

20-
if (!isStyleSheet(editor.document.languageId)) {
19+
let node = getCssPropertyNode(editor, editor.selection.active);
20+
if (!node) {
2121
return;
2222
}
2323

24-
const rootNode = parse(editor.document);
25-
const node = getNode(rootNode, editor.selection.active, true);
26-
if (!node || node.type !== 'property') {
27-
return;
28-
}
29-
30-
return updateCSSNode(editor, <Property>node);
31-
24+
return updateCSSNode(editor, node);
3225
}
3326

3427
function updateCSSNode(editor: TextEditor, property: Property) {

extensions/emmet/src/test/reflectCssValue.test.ts

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { withRandomFileEditor, closeAllEditors } from './testUtils';
1010
suite('Tests for Emmet: Reflect CSS Value command', () => {
1111
teardown(closeAllEditors);
1212

13-
const contents = `
13+
const cssContents = `
1414
.header {
1515
margin: 10px;
1616
padding: 10px;
@@ -22,16 +22,40 @@ suite('Tests for Emmet: Reflect CSS Value command', () => {
2222
}
2323
`;
2424

25-
test('reflectCssValue', function (): any {
25+
const htmlContents = `
26+
<html>
27+
<style>
28+
.header {
29+
margin: 10px;
30+
padding: 10px;
31+
transform: rotate(50deg);
32+
-moz-transform: rotate(20deg);
33+
-o-transform: rotate(50deg);
34+
-webkit-transform: rotate(50deg);
35+
-ms-transform: rotate(50deg);
36+
}
37+
</style>
38+
</html>
39+
`;
2640

27-
return withRandomFileEditor(contents, '.css', (editor, doc) => {
41+
test('Reflect Css Value in css file', function (): any {
42+
return withRandomFileEditor(cssContents, '.css', (editor, doc) => {
2843
editor.selections = [new Selection(5, 10, 5, 10)];
2944
return commands.executeCommand('emmet.reflectCssValue').then(() => {
30-
assert.equal(doc.getText(), contents.replace(/\(50deg\)/g, '(20deg)'));
45+
assert.equal(doc.getText(), cssContents.replace(/\(50deg\)/g, '(20deg)'));
3146
return Promise.resolve();
3247
});
3348
});
3449
});
3550

51+
test('Reflect Css Value in html file', function (): any {
52+
return withRandomFileEditor(htmlContents, '.html', (editor, doc) => {
53+
editor.selections = [new Selection(7, 20, 7, 20)];
54+
return commands.executeCommand('emmet.reflectCssValue').then(() => {
55+
assert.equal(doc.getText(), htmlContents.replace(/\(50deg\)/g, '(20deg)'));
56+
return Promise.resolve();
57+
});
58+
});
59+
});
3660

3761
});

extensions/emmet/src/util.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,3 +286,29 @@ export function iterateCSSToken(token: CssToken, fn) {
286286
export function getCssProperty(rule, name): Property {
287287
return rule.children.find(node => node.type === 'property' && node.name === name);
288288
}
289+
290+
/**
291+
* Returns css property under caret in given editor or `null` if such node cannot
292+
* be found
293+
* @param {TextEditor} editor
294+
* @return {Property}
295+
*/
296+
export function getCssPropertyNode(editor: vscode.TextEditor, position: vscode.Position): Property {
297+
const rootNode = this.parse(editor.document);
298+
const node = getNode(rootNode, position);
299+
300+
if (isStyleSheet(editor.document.languageId)) {
301+
return node && node.type === 'property' ? <Property>node : null;
302+
}
303+
304+
let htmlNode = <HtmlNode>node;
305+
if (htmlNode
306+
&& htmlNode.name === 'style'
307+
&& htmlNode.open.end.isBefore(position)
308+
&& htmlNode.close.start.isAfter(position)) {
309+
let buffer = new DocumentStreamReader(editor.document, htmlNode.start, new vscode.Range(htmlNode.start, htmlNode.end));
310+
let rootNode = parseStylesheet(buffer);
311+
const node = getNode(rootNode, position);
312+
return (node && node.type === 'property') ? <Property>node : null;
313+
}
314+
}

0 commit comments

Comments
 (0)