grid-template-parser
Advanced tools
Comparing version 0.2.1 to 0.3.0
@@ -10,36 +10,45 @@ 'use strict'; | ||
var separator = /['"]\s*['"]?/g; | ||
var sep = /['"]\s*['"]?/g; | ||
var ws = /\s+/g; | ||
var reduceRow = function reduceRow(acc, row) { | ||
var str = row.replace(/\s+/g, ' ').trim(); | ||
var cleanTpl = function cleanTpl(t) { | ||
return t.trim().slice(1, -1); | ||
}; | ||
var cleanLine = function cleanLine(l) { | ||
return l.replace(ws, ' ').trim(); | ||
}; | ||
if (str !== '') { | ||
acc.push(str.split(' ')); | ||
} | ||
return acc; | ||
var getTpl = function getTpl(t) { | ||
return cleanTpl(t).split(sep); | ||
}; | ||
var getRow = function getRow(l) { | ||
return cleanLine(l).split(' '); | ||
}; | ||
var reduceGrid = function reduceGrid(acc, row, r) { | ||
row.forEach(function (cell, c) { | ||
if (cell !== '.') { | ||
if (typeof acc[cell] === 'undefined') { | ||
var x = c; | ||
var y = r; | ||
var width = 1; | ||
var height = 1; | ||
var reduceLines = function reduceLines(acc, line, r) { | ||
if (line.trim() !== '') { | ||
getRow(line).forEach(function (area, c) { | ||
if (area !== '.') { | ||
if (typeof acc[area] === 'undefined') { | ||
acc[area] = { | ||
column: (0, _primitives.track)(c + 1, c + 2), | ||
row: (0, _primitives.track)(r + 1, r + 2) | ||
}; | ||
} else { | ||
var _acc$area = acc[area], | ||
column = _acc$area.column, | ||
row = _acc$area.row; | ||
acc[cell] = (0, _primitives.area)({ x: x, y: y, width: width, height: height }); | ||
} else { | ||
var box = (0, _primitives.rect)(acc[cell]); | ||
var _x = Math.min(box.x, c); | ||
var _y = Math.min(box.y, r); | ||
var _width = Math.max(box.x + box.width, c + 1) - _x; | ||
var _height = Math.max(box.y + box.height, r + 1) - _y; | ||
column.start = Math.min(column.start, c + 1); | ||
column.end = Math.max(column.end, c + 2); | ||
column.span = column.end - column.start; | ||
acc[cell] = (0, _primitives.area)({ x: _x, y: _y, width: _width, height: _height }); | ||
row.start = Math.min(row.start, r + 1); | ||
row.end = Math.max(row.end, r + 2); | ||
row.span = row.end - row.start; | ||
} | ||
} | ||
} | ||
}); | ||
}); | ||
} | ||
@@ -49,10 +58,9 @@ return acc; | ||
var grid = exports.grid = function grid(template) { | ||
var rows = template.split(separator).reduce(reduceRow, []); | ||
var grid = exports.grid = function grid(tpl) { | ||
var lines = getTpl(tpl); | ||
var width = getRow(lines[0]).length; | ||
var height = lines.length; | ||
var areas = lines.reduce(reduceLines, {}); | ||
var width = rows[0].length; | ||
var height = rows.length; | ||
var areas = rows.reduce(reduceGrid, {}); | ||
return { width: width, height: height, areas: areas }; | ||
}; |
@@ -6,2 +6,8 @@ 'use strict'; | ||
}); | ||
var track = exports.track = function track() { | ||
var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; | ||
var end = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; | ||
return { start: start, end: end, span: end - start }; | ||
}; | ||
var area = exports.area = function area() { | ||
@@ -19,12 +25,4 @@ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, | ||
return { | ||
column: { | ||
start: x + 1, | ||
end: x + width + 1, | ||
span: width | ||
}, | ||
row: { | ||
start: y + 1, | ||
end: y + height + 1, | ||
span: height | ||
} | ||
column: track(x + 1, x + width + 1), | ||
row: track(y + 1, y + height + 1) | ||
}; | ||
@@ -31,0 +29,0 @@ }; |
@@ -8,31 +8,38 @@ 'use strict'; | ||
var defaultTemplate = function defaultTemplate(width, height) { | ||
return Array.from({ length: height }, function () { | ||
return Array.from({ length: width }, function () { | ||
return '.'; | ||
}); | ||
}); | ||
var matchingArea = function matchingArea(areas, row, column) { | ||
return function (area) { | ||
return areas[area].row.start <= row + 1 && areas[area].row.end > row + 1 && areas[area].column.start <= column + 1 && areas[area].column.end > column + 1; | ||
}; | ||
}; | ||
var matchingArea = function matchingArea(areas, r, c) { | ||
return function (cell) { | ||
return areas[cell].row.start <= r + 1 && areas[cell].row.end > r + 1 && areas[cell].column.start <= c + 1 && areas[cell].column.end > c + 1; | ||
}; | ||
var getColumns = function getColumns(areas, grid, row) { | ||
var current = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; | ||
var cols = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ''; | ||
var area = areas.find(matchingArea(grid.areas, row, current)); | ||
cols += typeof area === 'string' ? area : '.'; | ||
if (current < grid.width - 1) { | ||
return getColumns(areas, grid, row, current + 1, cols + ' '); | ||
} | ||
return cols; | ||
}; | ||
var template = exports.template = function template(_ref) { | ||
var width = _ref.width, | ||
height = _ref.height, | ||
areas = _ref.areas; | ||
return defaultTemplate(width, height).reduce(function (acc, row, r, rows) { | ||
var separator = r < rows.length - 1 ? '\n' : ''; | ||
var line = row.reduce(function (acc, cell, c, cells) { | ||
var separator = c < cells.length - 1 ? ' ' : ''; | ||
var area = Object.keys(areas).find(matchingArea(areas, r, c)); | ||
var getRows = function getRows(areas, grid) { | ||
var current = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; | ||
var rows = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; | ||
return '' + acc + (typeof area === 'string' ? area : cell) + separator; | ||
}, ''); | ||
rows += '"' + getColumns(areas, grid, current) + '"'; | ||
return acc + '"' + line + '"' + separator; | ||
}, ''); | ||
if (current < grid.height - 1) { | ||
return getRows(areas, grid, current + 1, rows + '\n'); | ||
} | ||
return rows; | ||
}; | ||
var template = exports.template = function template(grid) { | ||
return getRows(Object.keys(grid.areas), grid); | ||
}; |
{ | ||
"name": "grid-template-parser", | ||
"version": "0.2.1", | ||
"version": "0.3.0", | ||
"description": "A simple CSS Grid template parser", | ||
@@ -5,0 +5,0 @@ "main": "lib/index.js", |
17832
230