diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/BemEmmetFilter.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/BemEmmetFilter.java index 69b1adf67d8f..de39319a1726 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/BemEmmetFilter.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/BemEmmetFilter.java @@ -29,6 +29,8 @@ import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collection; +import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.regex.Pattern; @@ -36,6 +38,7 @@ import java.util.regex.Pattern; import static com.google.common.base.Strings.isNullOrEmpty; import static com.google.common.base.Strings.nullToEmpty; import static com.google.common.collect.Iterables.*; +import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Lists.newLinkedList; /** @@ -53,15 +56,17 @@ public class BemEmmetFilter extends ZenCodingFilter { private static final String MODIFIER_SEPARATOR = "_"; private static final String SHORT_ELEMENT_PREFIX = "-"; + private static final Joiner ELEMENTS_JOINER = Joiner.on(ELEMENT_SEPARATOR).skipNulls(); private static final Splitter ELEMENTS_SPLITTER = Splitter.on(ELEMENT_SEPARATOR); private static final Splitter MODIFIERS_SPLITTER = Splitter.on(MODIFIER_SEPARATOR).limit(2); private static final Splitter CLASS_NAME_SPLITTER = Splitter.on(' ').trimResults().omitEmptyStrings(); private static final Joiner CLASS_NAME_JOINER = Joiner.on(' '); private static final Function CLASS_NAME_NORMALIZER = new Function() { + @NotNull @Override public String apply(@NotNull String input) { - if(!input.startsWith(SHORT_ELEMENT_PREFIX)) { + if (!input.startsWith(SHORT_ELEMENT_PREFIX)) { return input; } @@ -122,7 +127,7 @@ public class BemEmmetFilter extends ZenCodingFilter { return node; } - private static Iterable processClassName(String className, GenerationNode node) { + private static Iterable processClassName(String className, @NotNull GenerationNode node) { className = fillWithBemElements(className, node); className = fillWithBemModifiers(className, node); @@ -155,20 +160,29 @@ public class BemEmmetFilter extends ZenCodingFilter { @NotNull private static BemState extractBemStateFromClassName(@NotNull String className) { - BemState result = new BemState(); + final BemState result = new BemState(); if (className.contains(ELEMENT_SEPARATOR)) { - List blockElements = newLinkedList(ELEMENTS_SPLITTER.split(className)); - result.setBlock(getFirst(blockElements, "")); - if (blockElements.size() > 1) { - List elementModifiers = newLinkedList(MODIFIERS_SPLITTER.split(blockElements.get(1))); - result.setElement(getFirst(elementModifiers, "")); - if (elementModifiers.size() > 1) { - result.setModifier(getLast(elementModifiers, "")); + final Iterator elementsIterator = ELEMENTS_SPLITTER.split(className).iterator(); + result.setBlock(elementsIterator.next()); + + final Collection elementParts = newLinkedList(); + while (elementsIterator.hasNext()) { + final String elementPart = elementsIterator.next(); + if (!elementsIterator.hasNext()) { + final List elementModifiers = newArrayList(MODIFIERS_SPLITTER.split(elementPart)); + elementParts.add(getFirst(elementModifiers, null)); + if (elementModifiers.size() > 1) { + result.setModifier(getLast(elementModifiers, "")); + } + } + else { + elementParts.add(elementPart); } } + result.setElement(ELEMENTS_JOINER.join(elementParts)); } else if (className.contains(MODIFIER_SEPARATOR)) { - Iterable blockModifiers = MODIFIERS_SPLITTER.split(className); + final Iterable blockModifiers = MODIFIERS_SPLITTER.split(className); result.setBlock(getFirst(blockModifiers, "")); result.setModifier(getLast(blockModifiers, "")); } @@ -322,6 +336,7 @@ public class BemEmmetFilter extends ZenCodingFilter { return isNullOrEmpty(block) && isNullOrEmpty(element) && isNullOrEmpty(modifier); } + @Nullable public BemState copy() { return new BemState(block, element, modifier); }