@@ -16,6 +16,7 @@ var headersOrder = ['H1','H2','H3','H4','H5','H6'];
16
16
var headersList = [ ] ;
17
17
var isWHolePage = false ;
18
18
var hasBemWarning = false ;
19
+ var bodyClass = '' ;
19
20
20
21
var wholePageMarkers = [ 'META' , 'TITLE' , 'LINK' ] ;
21
22
var skippedTags = [ 'SCRIPT' , 'META' , 'TITLE' , 'LINK' , 'NOSCRIPT' , 'BR' , 'svg' ] ;
@@ -72,6 +73,12 @@ function createTreeFromHTML ( code ) {
72
73
return ;
73
74
}
74
75
76
+ bodyClass = getBodyClass ( code ) ;
77
+ if ( bodyClass ) {
78
+ bodyClass . forEach ( function ( item ) {
79
+ item && codeOutput . classList . add ( item ) ;
80
+ } ) ;
81
+ }
75
82
codeOutput . innerHTML = code ;
76
83
77
84
var items = makeList ( codeOutput , 1 ) ;
@@ -101,6 +108,8 @@ function makeList ( elem, level ) {
101
108
item . classList . add ( 'gnr-level__item' ) ;
102
109
var tagName = elem . tagName ;
103
110
var className = elem . className ;
111
+ elem . classList . forEach = [ ] . forEach ;
112
+ elem . children . forEach = [ ] . forEach ;
104
113
105
114
if ( ! elem . customDataSet ) {
106
115
elem . customDataSet = {
@@ -111,7 +120,6 @@ function makeList ( elem, level ) {
111
120
112
121
if ( level === 1 ) {
113
122
tagName = 'BODY' ;
114
- className = '' ;
115
123
}
116
124
117
125
var liContent = doc . createElement ( 'div' ) ;
@@ -139,7 +147,7 @@ function makeList ( elem, level ) {
139
147
var classSpan = doc . createElement ( 'span' ) ;
140
148
classSpan . classList . add ( 'gnr-elem__class' , 'gnr-class' ) ;
141
149
142
- Array . prototype . forEach . call ( elem . classList , function ( classItem , i ) {
150
+ elem . classList . forEach ( function ( classItem , i ) {
143
151
var classItemSpan = doc . createElement ( 'span' ) ;
144
152
classItemSpan . classList . add ( 'gnr-class__item' ) ;
145
153
classItemSpan . innerHTML += classItem ;
@@ -176,7 +184,7 @@ function makeList ( elem, level ) {
176
184
177
185
level ++ ;
178
186
179
- Array . prototype . forEach . call ( elem . children , function ( child ) {
187
+ elem . children . forEach ( function ( child ) {
180
188
checkIsWholePage ( child ) ;
181
189
182
190
if ( ! checkIsSkippedTag ( child ) ) {
@@ -228,16 +236,16 @@ function addClassesActions () {
228
236
//------------------------------
229
237
230
238
function checkBemForElem ( elem ) {
239
+ elem . classList . forEach = [ ] . forEach ;
231
240
232
241
if ( elem . className . indexOf ( '__' ) < 0 &&
233
242
elem . className . indexOf ( '--' ) < 0 ) {
234
243
return ;
235
244
}
236
245
237
- elem . classList [ ' validBem' ] = { } ;
246
+ elem . classList . validBem = { } ;
238
247
var parentPrefixes = findPrefixInParentNode ( elem ) ;
239
-
240
- Array . prototype . forEach . call ( elem . classList , function ( classItem ) {
248
+ elem . classList . forEach ( function ( classItem ) {
241
249
242
250
// Check first part of class with __ (block name)
243
251
if ( classItem . split ( '__' ) . length > 1 ) {
@@ -248,7 +256,7 @@ function checkBemForElem ( elem ) {
248
256
prefixCorrect = true ;
249
257
}
250
258
251
- elem . classList [ ' validBem' ] [ classItem ] = prefixCorrect ;
259
+ elem . classList . validBem [ classItem ] = prefixCorrect ;
252
260
253
261
if ( ! prefixCorrect ) {
254
262
hasBemWarning = true ;
@@ -264,7 +272,7 @@ function checkBemForElem ( elem ) {
264
272
modifPrefixCorrect = true ;
265
273
}
266
274
267
- elem . classList [ ' validBem' ] [ classItem ] = modifPrefixCorrect ;
275
+ elem . classList . validBem [ classItem ] = modifPrefixCorrect ;
268
276
269
277
if ( ! modifPrefixCorrect ) {
270
278
hasBemWarning = true ;
@@ -276,10 +284,17 @@ function checkBemForElem ( elem ) {
276
284
//------------------------------
277
285
278
286
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 ;
280
295
var prefixes = { } ;
281
296
282
- Array . prototype . forEach . call ( classList , function ( classItem ) {
297
+ classList . forEach ( function ( classItem ) {
283
298
if ( classItem . split ( '__' ) . length > 1 ) {
284
299
var prefix = classItem . split ( '__' ) [ 0 ] ;
285
300
prefixes [ prefix ] = prefix ;
@@ -293,12 +308,11 @@ function findPrefixInParentNode ( elem ) {
293
308
294
309
function addClassesAsPrefixes ( elem ) {
295
310
var classList = elem . classList ;
311
+ classList . forEach = [ ] . forEach ;
296
312
297
- if ( elem . customDataSet . level > 2 ) {
298
- copyPrefixes ( elem ) ;
299
- }
313
+ copyPrefixes ( elem ) ;
300
314
301
- Array . prototype . forEach . call ( classList , function ( classItem ) {
315
+ classList . forEach ( function ( classItem ) {
302
316
// Copy only block names
303
317
if ( classItem . split ( '__' ) . length === 1 &&
304
318
classItem . split ( '--' ) . length === 1 ) {
@@ -311,6 +325,11 @@ function addClassesAsPrefixes ( elem ) {
311
325
312
326
function copyPrefixes ( elem ) {
313
327
var parent = elem . parentNode ;
328
+
329
+ if ( ! parent ) {
330
+ return ;
331
+ }
332
+
314
333
for ( var prefix in parent . customDataSet . prefixes ) {
315
334
elem . customDataSet . prefixes [ prefix ] = prefix ;
316
335
}
@@ -331,7 +350,7 @@ rangeDeep.oninput = function () {
331
350
var styles = '.gnr-level--' + level + '{ display: none }' ;
332
351
styleElem . innerHTML = styles ;
333
352
valDeep . innerHTML = this . value ;
334
- }
353
+ } ;
335
354
336
355
//------------------------------
337
356
@@ -453,6 +472,18 @@ function printCurrentElem( elem ) {
453
472
454
473
//------------------------------
455
474
475
+ function getBodyClass ( code ) {
476
+ var result = code . match ( / < b o d y [ ^ > ] * c l a s s = " ( .* ) " / ) ;
477
+
478
+ if ( result ) {
479
+ return result [ 1 ] . split ( ' ' ) ;
480
+ }
481
+
482
+ return '' ;
483
+ }
484
+
485
+ //------------------------------
486
+
456
487
function runDev ( ) {
457
488
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>' ;
458
489
codeInput . value = testMarkup ;
0 commit comments