* Parse data from all grid-template(-areas) declarations * @param {Root} css css root * @return {Object} parsed data
(css)
| 388 | * @return {Object} parsed data |
| 389 | */ |
| 390 | function 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) { |
no test coverage detected
searching dependent graphs…