diff options
author | AnotherTest <ali.mpfard@gmail.com> | 2020-08-23 08:25:16 +0430 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-08-24 18:21:33 +0200 |
commit | a6ebd29aa5c95712c964ff0301398f004d6d2011 (patch) | |
tree | 8885364324807f6551a88d4d40a5ac1cfc04a0c5 /Base/res | |
parent | 5b5ba91335b4a3263580295ec36a43bf70d00d8a (diff) | |
download | serenity-a6ebd29aa5c95712c964ff0301398f004d6d2011.zip |
Spreadsheet: Start making a spreadsheet application
Diffstat (limited to 'Base/res')
-rw-r--r-- | Base/res/js/Spreadsheet/runtime.js | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/Base/res/js/Spreadsheet/runtime.js b/Base/res/js/Spreadsheet/runtime.js new file mode 100644 index 0000000000..082ab027b0 --- /dev/null +++ b/Base/res/js/Spreadsheet/runtime.js @@ -0,0 +1,93 @@ +const sheet = this + +function range(start, end, column_step, row_step) { + column_step = integer(column_step ?? 1) + row_step = integer(row_step ?? 1) + start = sheet.parse_cell_name(start) ?? {column: 'A', row: 0} + end = sheet.parse_cell_name(end) ?? start + + if (end.column.length > 1 || start.column.length > 1) + throw new TypeError("Only single-letter column names are allowed (TODO)"); + + const cells = [] + + for (let col = Math.min(start.column.charCodeAt(0), end.column.charCodeAt(0)); + col <= Math.max(start.column.charCodeAt(0), end.column.charCodeAt(0)); + ++col) { + for (let row = Math.min(start.row, end.row); + row <= Math.max(start.row, end.row); + ++row) { + + cells.push(String.fromCharCode(col) + row) + } + } + + return cells +} + +// FIXME: Remove this and use String.split() eventually +function split(str, sep) { + const parts = [] + let split_index = -1 + for(;;) { + split_index = str.indexOf(sep) + if (split_index == -1) { + if (str.length) + parts.push(str) + return parts + } + parts.push(str.substring(0, split_index)) + str = str.slice(split_index + sep.length) + } +} + +function R(fmt, ...args) { + if (args.length !== 0) + throw new TypeError("R`` format must be literal") + + fmt = fmt[0] + return range(...split(fmt, ':')) +} + +function select(criteria, t, f) { + if (criteria) + return t; + return f; +} + +function sumif(condition, cells) { + let sum = null + for (let name of cells) { + let cell = sheet[name] + if (condition(cell)) + sum = sum === null ? cell : sum + cell + } + return sum +} + +function countif(condition, cells) { + let count = 0 + for (let name of cells) { + let cell = sheet[name] + if (condition(cell)) + count++ + } + return count +} + +function now() { + return new Date() +} + +function repeat(count, str) { + return Array(count + 1).join(str) +} + +function randrange(min, max) { + return Math.random() * (max - min) + min +} + +function integer(value) { + return value | 0 +} + |