Skip to content

Commit 47e0218

Browse files
authored
Merge pull request yoksel#4 from yoksel/body-class
Body class
2 parents 4c3b5d2 + e4adc80 commit 47e0218

File tree

1 file changed

+46
-15
lines changed

1 file changed

+46
-15
lines changed

assets/js/script.js

Lines changed: 46 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ var headersOrder = ['H1','H2','H3','H4','H5','H6'];
1616
var headersList = [];
1717
var isWHolePage = false;
1818
var hasBemWarning = false;
19+
var bodyClass = '';
1920

2021
var wholePageMarkers = ['META', 'TITLE', 'LINK'];
2122
var skippedTags = ['SCRIPT', 'META', 'TITLE', 'LINK', 'NOSCRIPT', 'BR', 'svg'];
@@ -72,6 +73,12 @@ function createTreeFromHTML ( code ) {
7273
return;
7374
}
7475

76+
bodyClass = getBodyClass( code );
77+
if (bodyClass) {
78+
bodyClass.forEach( function( item ) {
79+
item && codeOutput.classList.add( item );
80+
});
81+
}
7582
codeOutput.innerHTML = code;
7683

7784
var items = makeList( codeOutput, 1 );
@@ -101,6 +108,8 @@ function makeList ( elem, level ) {
101108
item.classList.add('gnr-level__item');
102109
var tagName = elem.tagName;
103110
var className = elem.className;
111+
elem.classList.forEach = [].forEach;
112+
elem.children.forEach = [].forEach;
104113

105114
if ( !elem.customDataSet ) {
106115
elem.customDataSet = {
@@ -111,7 +120,6 @@ function makeList ( elem, level ) {
111120

112121
if ( level === 1 ) {
113122
tagName = 'BODY';
114-
className = '';
115123
}
116124

117125
var liContent = doc.createElement('div');
@@ -139,7 +147,7 @@ function makeList ( elem, level ) {
139147
var classSpan = doc.createElement('span');
140148
classSpan.classList.add('gnr-elem__class', 'gnr-class');
141149

142-
Array.prototype.forEach.call( elem.classList, function ( classItem, i ) {
150+
elem.classList.forEach(function ( classItem, i ) {
143151
var classItemSpan = doc.createElement('span');
144152
classItemSpan.classList.add('gnr-class__item');
145153
classItemSpan.innerHTML += classItem;
@@ -176,7 +184,7 @@ function makeList ( elem, level ) {
176184

177185
level++;
178186

179-
Array.prototype.forEach.call( elem.children, function ( child ) {
187+
elem.children.forEach( function ( child ) {
180188
checkIsWholePage( child );
181189

182190
if ( !checkIsSkippedTag( child )) {
@@ -228,16 +236,16 @@ function addClassesActions () {
228236
//------------------------------
229237

230238
function checkBemForElem ( elem ) {
239+
elem.classList.forEach = [].forEach;
231240

232241
if ( elem.className.indexOf('__') < 0 &&
233242
elem.className.indexOf('--') < 0 ) {
234243
return;
235244
}
236245

237-
elem.classList['validBem'] = {};
246+
elem.classList.validBem = {};
238247
var parentPrefixes = findPrefixInParentNode( elem );
239-
240-
Array.prototype.forEach.call( elem.classList, function ( classItem ) {
248+
elem.classList.forEach( function ( classItem ) {
241249

242250
// Check first part of class with __ (block name)
243251
if ( classItem.split('__').length > 1 ) {
@@ -248,7 +256,7 @@ function checkBemForElem ( elem ) {
248256
prefixCorrect = true;
249257
}
250258

251-
elem.classList['validBem'][ classItem ] = prefixCorrect;
259+
elem.classList.validBem[ classItem ] = prefixCorrect;
252260

253261
if ( !prefixCorrect ) {
254262
hasBemWarning = true;
@@ -264,7 +272,7 @@ function checkBemForElem ( elem ) {
264272
modifPrefixCorrect = true;
265273
}
266274

267-
elem.classList['validBem'][ classItem ] = modifPrefixCorrect;
275+
elem.classList.validBem[ classItem ] = modifPrefixCorrect;
268276

269277
if ( !modifPrefixCorrect ) {
270278
hasBemWarning = true;
@@ -276,10 +284,17 @@ function checkBemForElem ( elem ) {
276284
//------------------------------
277285

278286
function findPrefixInParentNode ( elem ) {
279-
var classList = elem.parentNode.classList;
287+
var parent = elem.parentNode;
288+
289+
if (!parent) {
290+
return {};
291+
}
292+
293+
var classList = parent.classList;
294+
classList.forEach = [].forEach;
280295
var prefixes = {};
281296

282-
Array.prototype.forEach.call( classList, function ( classItem ) {
297+
classList.forEach(function ( classItem ) {
283298
if ( classItem.split('__').length > 1 ) {
284299
var prefix = classItem.split('__')[0];
285300
prefixes[ prefix ] = prefix;
@@ -293,12 +308,11 @@ function findPrefixInParentNode ( elem ) {
293308

294309
function addClassesAsPrefixes ( elem ) {
295310
var classList = elem.classList;
311+
classList.forEach = [].forEach;
296312

297-
if ( elem.customDataSet.level > 2 ) {
298-
copyPrefixes( elem );
299-
}
313+
copyPrefixes( elem );
300314

301-
Array.prototype.forEach.call( classList, function ( classItem ) {
315+
classList.forEach(function ( classItem ) {
302316
// Copy only block names
303317
if ( classItem.split('__').length === 1 &&
304318
classItem.split('--').length === 1 ) {
@@ -311,6 +325,11 @@ function addClassesAsPrefixes ( elem ) {
311325

312326
function copyPrefixes ( elem ) {
313327
var parent = elem.parentNode;
328+
329+
if (!parent) {
330+
return;
331+
}
332+
314333
for ( var prefix in parent.customDataSet.prefixes ) {
315334
elem.customDataSet.prefixes[ prefix ] = prefix;
316335
}
@@ -331,7 +350,7 @@ rangeDeep.oninput = function () {
331350
var styles = '.gnr-level--' + level + '{ display: none }';
332351
styleElem.innerHTML = styles;
333352
valDeep.innerHTML = this.value;
334-
}
353+
};
335354

336355
//------------------------------
337356

@@ -453,6 +472,18 @@ function printCurrentElem( elem ) {
453472

454473
//------------------------------
455474

475+
function getBodyClass(code) {
476+
var result = code.match(/<body[^>]*class="(.*)"/);
477+
478+
if (result) {
479+
return result[1].split(' ');
480+
}
481+
482+
return '';
483+
}
484+
485+
//------------------------------
486+
456487
function runDev () {
457488
var testMarkup = '<h1 class="page__title">Title</h1><div class="wrapper"><section class="prices1"><div><h2 class="prices__title">Title</h2><div class="prices__content prices__content--disabled">Content</div></div></section><section class="reviews"><div><h2 class="reviews__title">Title</h2><div class="reviews__content">Content</div></div></section><footer class="footer"><div><h2 class="footer__title">Footer Title</h2><div class="footer__content"><h4 class="footer__subtitle">Footer SubTitle</h4>Footer Content</div></div></footer></div></div>';
458489
codeInput.value = testMarkup;

0 commit comments

Comments
 (0)