stylesheets/_hack.scss in bem-constructor-0.1.1 vs stylesheets/_hack.scss in bem-constructor-0.2.0
- old
+ new
@@ -3,22 +3,39 @@
// -----------------------------------------------------------------------------
/// Hack namespace prepended to the selector
$hack-namespace: '_' !default;
+/// Find the last simple selector in a selector
+@function _last-simple-selector($selector) {
+ $parsed: selector-parse($selector);
+
+ @if length($parsed) > 1 {
+ @error '`#{$selector}` contains #{length($parsed)} selectors and the `_last-simple-selector()`function accepts only 1.';
+ }
+ $last-simple-selector: nth(nth($parsed, 1), -1);
+
+ @return $last-simple-selector;
+}
+
@function _hack() {
// You may not hack a hack
$recursive-check: should-not-be-called-recursively('hack');
$selector: ();
$namespace: if($bem-use-namespaces, $hack-namespace, '');
- @each $s in & {
- $selector-to-str: inspect(nth($s, 1));
+ // Check if we are hacking an element modified by a block modifier
+ $is-hack-element: not not map-get($_bem-current-context, 'modifies-element');
+ $selectors: if($is-hack-element, map-get(map-get($_bem-current-context, 'modifies-element'), 'selector'), &);
+
+ // @todo refactor the following code to something more readab
+ @each $s in $selectors {
+ $selector-to-str: inspect(if($is-hack-element, _last-simple-selector($s), nth($s, 1)));
$selector-without-dot: str-slice($selector-to-str, 2, -1);
$new-selector: '.' + $namespace + $selector-without-dot;
- $sl: selector-replace($s, nth($s, 1), $new-selector);;
+ $sl: selector-replace($s, if($is-hack-element, $selector-to-str, nth($s, 1)), $new-selector);
$selector: append($selector, $sl, 'comma');
}
$set-current: set-current-context('hack', 'some-hack', $selector);