WEB-15430 Add Emmet support for JSX files/snippets

This commit is contained in:
Alexander Zolotov
2015-02-24 19:43:18 +03:00
parent 9752ef605e
commit bc4e6880b6
4 changed files with 23 additions and 6 deletions

View File

@@ -74,6 +74,7 @@ public class XmlEmmetParser extends EmmetParser {
put("object", "param");
put("map", "area");
}};
private boolean isHtml;
public XmlEmmetParser(List<ZenCodingToken> tokens,
CustomTemplateCallback callback,
@@ -84,6 +85,7 @@ public class XmlEmmetParser extends EmmetParser {
if (surroundWithTemplate && parentTag != null && context.getNode().getElementType() == XmlTokenType.XML_START_TAG_START) {
parentTag = PsiTreeUtil.getParentOfType(parentTag, XmlTag.class);
}
isHtml = generator.isHtml(callback);
if (parentTag != null) {
hasTagContext = true;
tagLevel.push(parentTag.getName());
@@ -210,7 +212,7 @@ public class XmlEmmetParser extends EmmetParser {
@Nullable
private String getDefaultTemplateKey() {
return ZenCodingUtil.isHtml(myCallback) ? suggestTagName() : null;
return isHtml ? suggestTagName() : null;
}
@Nullable

View File

@@ -18,6 +18,7 @@ package com.intellij.codeInsight.template.emmet.generators;
import com.intellij.application.options.emmet.EmmetOptions;
import com.intellij.codeInsight.template.CustomTemplateCallback;
import com.intellij.codeInsight.template.emmet.ZenCodingTemplate;
import com.intellij.codeInsight.template.emmet.ZenCodingUtil;
import com.intellij.codeInsight.template.emmet.tokens.TemplateToken;
import com.intellij.codeInsight.template.impl.TemplateImpl;
import com.intellij.diagnostic.AttachmentFactory;
@@ -124,4 +125,9 @@ public abstract class XmlZenCodingGenerator extends ZenCodingGenerator {
public void disableEmmet() {
EmmetOptions.getInstance().setEmmetEnabled(false);
}
@Override
public boolean isHtml(@NotNull CustomTemplateCallback callback) {
return ZenCodingUtil.isHtml(callback);
}
}

View File

@@ -148,6 +148,10 @@ public abstract class ZenCodingGenerator {
return false;
}
public boolean isHtml(@NotNull CustomTemplateCallback callback) {
return false;
}
public void disableEmmet() {
}
}

View File

@@ -49,6 +49,7 @@ import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.xml.*;
import com.intellij.util.LocalTimeCounter;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.HashMap;
import com.intellij.util.containers.HashSet;
@@ -276,6 +277,8 @@ public class GenerationNode extends UserDataHolderBase {
/*assert generator == null || generator instanceof XmlZenCodingGenerator :
"The generator cannot process TemplateToken because it doesn't inherit XmlZenCodingGenerator";*/
ZenCodingGenerator zenCodingGenerator = ObjectUtils.notNull(generator, XmlZenCodingGeneratorImpl.INSTANCE);
Map<String, String> attributes = token.getAttributes();
TemplateImpl template = token.getTemplate();
assert template != null;
@@ -307,7 +310,7 @@ public class GenerationNode extends UserDataHolderBase {
}
}
XmlTag tag1 = hasChildren ? expandEmptyTagIfNecessary(tag) : tag;
setAttributeValues(tag1, attributes, callback);
setAttributeValues(tag1, attributes, callback, zenCodingGenerator.isHtml(callback));
XmlFile physicalFile = (XmlFile)fileFactory.createFileFromText(HTMLLanguage.INSTANCE, tag1.getContainingFile().getText());
VirtualFile vFile = physicalFile.getVirtualFile();
if (vFile != null) {
@@ -315,7 +318,6 @@ public class GenerationNode extends UserDataHolderBase {
}
token.setFile(physicalFile);
}
ZenCodingGenerator zenCodingGenerator = generator != null ? generator : XmlZenCodingGeneratorImpl.INSTANCE;
template = zenCodingGenerator.generateTemplate(token, hasChildren, callback.getContext());
removeVariablesWhichHasNoSegment(template);
return template;
@@ -445,7 +447,10 @@ public class GenerationNode extends UserDataHolderBase {
return predefinedValues;
}
private void setAttributeValues(@NotNull XmlTag tag, @NotNull final Map<String, String> attributes, CustomTemplateCallback callback) {
private void setAttributeValues(@NotNull XmlTag tag,
@NotNull final Map<String, String> attributes,
@NotNull CustomTemplateCallback callback,
boolean isHtml) {
// default and implied attributes
final String defaultAttributeValue = attributes.get(XmlEmmetParser.DEFAULT_ATTRIBUTE_NAME);
if (defaultAttributeValue != null) {
@@ -495,7 +500,7 @@ public class GenerationNode extends UserDataHolderBase {
myContainsSurroundedTextMarker = true;
}
if (isBooleanAttribute(attributeValue, xmlAttribute, callback)) {
if (isHtml && isBooleanAttribute(attributeValue, xmlAttribute, callback)) {
if (HtmlUtil.isShortNotationOfBooleanAttributePreferred()) {
if (xmlAttributeValueElement != null) {
final PsiElement prevSibling = xmlAttributeValueElement.getPrevSibling();
@@ -536,7 +541,7 @@ public class GenerationNode extends UserDataHolderBase {
if (XmlEmmetParser.BOOLEAN_ATTRIBUTE_VALUE.equals(attributeValue)) {
return true;
}
if (ZenCodingUtil.isHtml(callback) && StringUtil.isEmpty(attributeValue)) {
if (StringUtil.isEmpty(attributeValue)) {
final XmlAttributeDescriptor descriptor = xmlAttribute.getDescriptor();
return descriptor != null && HtmlUtil.isBooleanAttribute(descriptor, callback.getContext());
}