summaryrefslogtreecommitdiff
path: root/Base/res
diff options
context:
space:
mode:
authorAnotherTest <ali.mpfard@gmail.com>2020-08-23 08:25:16 +0430
committerAndreas Kling <kling@serenityos.org>2020-08-24 18:21:33 +0200
commita6ebd29aa5c95712c964ff0301398f004d6d2011 (patch)
tree8885364324807f6551a88d4d40a5ac1cfc04a0c5 /Base/res
parent5b5ba91335b4a3263580295ec36a43bf70d00d8a (diff)
downloadserenity-a6ebd29aa5c95712c964ff0301398f004d6d2011.zip
Spreadsheet: Start making a spreadsheet application
Diffstat (limited to 'Base/res')
-rw-r--r--Base/res/js/Spreadsheet/runtime.js93
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
+}
+