From a1c4a6f8830823be78508c586a2608ab857891e5 Mon Sep 17 00:00:00 2001 From: reverend Date: Thu, 7 Jan 2021 00:15:19 +0100 Subject: [PATCH] Advanced BEM generator with overridung --- components/00_Global/_bemGenerator.styl | 86 +++++++++++++++++-------- 1 file changed, 59 insertions(+), 27 deletions(-) diff --git a/components/00_Global/_bemGenerator.styl b/components/00_Global/_bemGenerator.styl index 40a1f6f..fd9f4ed 100644 --- a/components/00_Global/_bemGenerator.styl +++ b/components/00_Global/_bemGenerator.styl @@ -7,6 +7,7 @@ _css-prefix = 'RV' _element-modifier = () +_additional-element-modifier-blocks = () /* * Gets the selector of the parent class @@ -20,6 +21,11 @@ _get_parent_selector() _get_block_selector() return unquote(split('__', _get_parent_selector())[0]) +_get_element_selector() + p(_get_parent_selector()) + element--modifier = split('__', _get_parent_selector())[1] + return unquote(split('--', element--modifier)[0]) + /* * Generates a CSS class for an * Block according to BEM @@ -27,40 +33,52 @@ _get_block_selector() RV-Block(name) .{_css-prefix}-{name} {block} - + /* * Generates a CSS class for an block modifier * according to BEM. */ RV-Block__Modifier(name) - &{_get_block_selector()}--{name} + if 'RV-Block__Modifier' in called-from {block} + else + &{_get_block_selector()}--{name} + {block} + +_create_element(name, block) + {block} + // Checking for modifiers + l = length(_element-modifier) - 1 + for i in range(0, l) + modifier = pop(_element-modifier) + callback = modifier['callback'] + // Calling the modifiers block, + // passing the name of the element + callback( + element: name, + name: modifier['name'], + block_list: modifier['block_list'] + ) + /* * Generates an CSS class for an element * according to BEM. Also minds the element modifiers * For more see RV-Element___Modifier */ -RV-Element(name) +RV-Element(name) block-selector = _get_block_selector() // Are we in a block? if block-selector != '&' //Create Selector and output the CSS for the element - {block-selector}__{name} - {block} - - // Checking for modifiers - l = length(_element-modifier) - 1 - for i in range(0, l) - modifier = pop(_element-modifier) - callback = modifier['callback'] - // Calling the modifiers block, - // passing the name of the element - callback( - element: name, - name: modifier['name'], - modifier_block: modifier['block'] - ) + + //Detect if the selector will be generated + //by an earlier call of RV-Element + if 'RV-Element' in called-from + _create_element(name, block) + else + {block-selector}__{name} + _create_element(name, block) else warn('No block found. Creating One instead') +RV-Block(name) @@ -75,13 +93,27 @@ RV-Element(name) * from RV-Element */ RV-Element__Modifier(name) - callback = @(element, name, modifier_block){ - &{_get_block_selector()}__{element}--{name}{ - {modifier_block} + if 'RV-Element__Modifier' in called-from + //What the actual fuch this language is to utterly buggy + push(_additional-element-modifier-blocks, @block{block}) + else + callback = @(element, name, block_list){ + &{_get_block_selector()}__{element}--{name}{ + for current_block in block_list{ + + {current_block} + } + } } - } - push(_element-modifier, { - callback: callback - name: name - block: block, - }) \ No newline at end of file + block_list = () + push(block_list, @block{block}) + l = length(_additional-element-modifier-blocks) + for i in range(0, l) + b = pop(_additional-element-modifier-blocks) + push(block_list, b) + + push(_element-modifier, { + callback: callback + name: name + block_list: block_list, + })