MCPcopy
hub / github.com/postcss/autoprefixer / parseGridTemplatesData

Function parseGridTemplatesData

lib/hacks/grid-utils.js:390–489  ·  view source on GitHub ↗

* Parse data from all grid-template(-areas) declarations * @param {Root} css css root * @return {Object} parsed data

(css)

Source from the content-addressed store, hash-verified

388 * @return {Object} parsed data
389 */
390function parseGridTemplatesData(css) {
391 let parsed = []
392
393 // we walk through every grid-template(-areas) declaration and store
394 // data with the same area names inside the item
395 css.walkDecls(/grid-template(-areas)?$/, d => {
396 let rule = d.parent
397 let media = getParentMedia(rule)
398 let gap = getGridGap(d)
399 let inheritedGap = inheritGridGap(d, gap)
400 let { areas } = parseTemplate({ decl: d, gap: inheritedGap || gap })
401 let areaNames = Object.keys(areas)
402
403 // skip node if it doesn't have areas
404 if (areaNames.length === 0) {
405 return true
406 }
407
408 // check parsed array for item that include the same area names
409 // return index of that item
410 let index = parsed.reduce((acc, { allAreas }, idx) => {
411 let hasAreas = allAreas && areaNames.some(area => allAreas.includes(area))
412 return hasAreas ? idx : acc
413 }, null)
414
415 if (index !== null) {
416 // index is found, add the grid-template data to that item
417 let { allAreas, rules } = parsed[index]
418
419 // check if rule has no duplicate area names
420 let hasNoDuplicates = rules.some(r => {
421 return r.hasDuplicates === false && selectorsEqual(r, rule)
422 })
423
424 let duplicatesFound = false
425
426 // check need to gather all duplicate area names
427 let duplicateAreaNames = rules.reduce((acc, r) => {
428 if (!r.params && selectorsEqual(r, rule)) {
429 duplicatesFound = true
430 return r.duplicateAreaNames
431 }
432 if (!duplicatesFound) {
433 areaNames.forEach(name => {
434 if (r.areas[name]) {
435 acc.push(name)
436 }
437 })
438 }
439 return uniq(acc)
440 }, [])
441
442 // update grid-row/column-span values for areas with duplicate
443 // area names. @see #1084 and #1146
444 rules.forEach(r => {
445 areaNames.forEach(name => {
446 let area = r.areas[name]
447 if (area && area.row.span !== areas[name].row.span) {

Callers 1

insertAreasFunction · 0.85

Calls 5

getParentMediaFunction · 0.85
getGridGapFunction · 0.85
inheritGridGapFunction · 0.85
parseTemplateFunction · 0.85
selectorsEqualFunction · 0.85

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…