Skip to content

Commit

Permalink
tables -> frames
Browse files Browse the repository at this point in the history
  • Loading branch information
prabhanshuguptagit committed Jun 7, 2024
1 parent 150b47f commit 7dbfe81
Show file tree
Hide file tree
Showing 16 changed files with 305 additions and 306 deletions.
16 changes: 8 additions & 8 deletions public/css/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ p {
margin: auto 0 auto calc(var(--sidebar-left-margin) + 6px);
}

.table-icon {
.frame-icon {
height: 0.8rem;
margin: auto 5px auto 0;
}
Expand All @@ -134,7 +134,7 @@ p {
margin: auto 7px auto 2px;
}

.tables-header {
.frames-header {
top: 0;
height: var(--cell-height);
width: 100%;
Expand All @@ -147,7 +147,7 @@ p {
border-bottom: 1px solid var(--code-margin);
}

.tables-list-items {
.frames-list-items {
background-image: linear-gradient(var(--code-lines) 0.7px, transparent 0.7px);
background-position-y: var(--cell-height);
background-size: 100% var(--cell-height);
Expand All @@ -156,12 +156,12 @@ p {
overflow-y: auto;
}

.tables-list-item {
.frames-list-item {
height: var(--cell-height);
display: flex;
}

.tables-list-item a {
.frames-list-item a {
cursor: pointer;
border-bottom: 2px solid #eee;
font-family: SpaceGrotesk, sans-serif;
Expand All @@ -170,16 +170,16 @@ p {
margin: auto 0 auto 0;
}

.make-table-form {
.make-frame-form {
margin: auto 0 auto 0;
}

.make-table-input {
.make-frame-input {
border: 1px solid #e9e9ed;
padding: 4px;
}

.make-table-input:active, .make-table-input:focus {
.make-frame-input:active, .make-frame-input:focus {
outline: none;
/* border: 2px solid #3b5aa3; */
}
Expand Down
File renamed without changes
File renamed without changes
12 changes: 6 additions & 6 deletions src/bean/errors.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@
{:error (str "Undefined reference: \"" name "\"")
:representation (str "Undefined reference: \"" name "\"")})

(defn undefined-table-at [address]
{:error (str "No table found at " address "")
:representation (str "No table found at " address "")})
(defn undefined-frame-at [address]
{:error (str "No frame found at " address "")
:representation (str "No frame found at " address "")})

(defn invalid-table-args [address]
{:error (str "table() needs a cell ref, given \"" address "\"")
:representation (str "table() needs a cell ref, given \"" address "\"")})
(defn invalid-frame-args [address]
{:error (str "frame() needs a cell ref, given \"" address "\"")
:representation (str "frame() needs a cell ref, given \"" address "\"")})

(defn label-not-found [label-name]
{:error (str "label \"" label-name "\" doesn't exist")
Expand Down
122 changes: 61 additions & 61 deletions src/bean/tables.cljs → src/bean/frames.cljs
Original file line number Diff line number Diff line change
@@ -1,72 +1,72 @@
(ns bean.tables
(ns bean.frames
(:require [bean.area :as area]
[bean.util :as util]
[clojure.set :as set]))

(defn make-table [sheet table-name area]
(defn make-frame [sheet frame-name area]
(if (and (not (area/area-empty? area))
(not (some
#(area/overlap? % area)
(vals (:tables sheet)))))
(assoc-in sheet [:tables table-name]
(vals (:frames sheet)))))
(assoc-in sheet [:frames frame-name]
(merge area {:labels {}
:skip-cells #{}}))
sheet))

(defn cell-table [[r c] sheet]
(defn cell-frame [[r c] sheet]
(some
(fn [[table-name {:keys [start end]}]]
(fn [[frame-name {:keys [start end]}]]
(let [[start-r start-c] start
[end-r end-c] end]
(when (and (>= r start-r)
(<= r end-r)
(>= c start-c)
(<= c end-c))
table-name)))
(:tables sheet)))
frame-name)))
(:frames sheet)))

(defn add-label [sheet table-name rc dirn & [color]]
(if (= (cell-table rc sheet) table-name)
(defn add-label [sheet frame-name rc dirn & [color]]
(if (= (cell-frame rc sheet) frame-name)
(assoc-in
sheet
[:tables table-name :labels (util/merged-or-self rc sheet)]
[:frames frame-name :labels (util/merged-or-self rc sheet)]
{:dirn dirn :color color})
sheet))

(defn add-labels [sheet table-name addresses dirn]
(reduce #(add-label %1 table-name %2 dirn (util/random-color-hex)) sheet addresses))
(defn add-labels [sheet frame-name addresses dirn]
(reduce #(add-label %1 frame-name %2 dirn (util/random-color-hex)) sheet addresses))

(defn remove-labels [sheet table-name addresses]
(reduce #(update-in % [:tables table-name :labels] dissoc %2) sheet addresses))
(defn remove-labels [sheet frame-name addresses]
(reduce #(update-in % [:frames frame-name :labels] dissoc %2) sheet addresses))

(defn get-table [sheet table-name]
(get-in sheet [:tables table-name]))
(defn get-frame [sheet frame-name]
(get-in sheet [:frames frame-name]))

(defn- get-label [sheet table-name rc & [dirn]]
(let [label (get-in sheet [:tables table-name :labels rc])]
(defn- get-label [sheet frame-name rc & [dirn]]
(let [label (get-in sheet [:frames frame-name :labels rc])]
(if dirn
(when (= (:dirn label) dirn)
label)
label)))

(defn label? [sheet table-name label-name & [dirn]]
(defn label? [sheet frame-name label-name & [dirn]]
(some
(fn [[label label-data]]
(and (= label-name
(:scalar (util/get-cell (:grid sheet) label)))
(if dirn (= (:dirn label-data) dirn) true)))
(:labels (get-table sheet table-name))))
(:labels (get-frame sheet frame-name))))

(defn merge-labels [sheet start addresses]
(if-let [table-name (cell-table start sheet)]
(let [is-label? (get-label sheet table-name start)
(if-let [frame-name (cell-frame start sheet)]
(let [is-label? (get-label sheet frame-name start)
other-labels? (and (not is-label?)
(some #(get-label sheet table-name %) addresses))
(some #(get-label sheet frame-name %) addresses))
label (or is-label? other-labels?)]
(if label
(-> sheet
(remove-labels table-name addresses)
(add-label table-name start (:dirn label) (:color label)))
(remove-labels frame-name addresses)
(add-label frame-name start (:dirn label) (:color label)))
sheet))
sheet))

Expand Down Expand Up @@ -102,17 +102,17 @@
[r* c*]))
(sort-by (fn [[[r _] _]] r) labels)))

(defn blocking-label [sheet table-name label]
(let [{:keys [labels] :as table} (get-table sheet table-name)
{:keys [dirn]} (get-in table [:labels label])]
(defn blocking-label [sheet frame-name label]
(let [{:keys [labels] :as frame} (get-frame sheet frame-name)
{:keys [dirn]} (get-in frame [:labels label])]
(case dirn
:top (top-blocking-label sheet label labels)
:left (left-blocking-label sheet label labels))))

(defn label->cells [sheet table-name label]
(let [{:keys [end] :as table} (get-table sheet table-name)
[table-end-r table-end-c] end
labels (:labels table)
(defn label->cells [sheet frame-name label]
(let [{:keys [end] :as frame} (get-frame sheet frame-name)
[frame-end-r frame-end-c] end
labels (:labels frame)
merged-with-labels (mapcat
#(get-in (util/get-cell (:grid sheet) %)
[:style :merged-addresses])
Expand All @@ -121,54 +121,54 @@
(as->
(area/area->addresses
{:start label
:end (let [[br bc] (blocking-label sheet table-name label)]
:end (let [[br bc] (blocking-label sheet frame-name label)]
(case dirn
:top [(if br (dec br) table-end-r)
(min (last-col label sheet) table-end-c)]
:left [(min (last-row label sheet) table-end-r)
(if bc (dec bc) table-end-c)]))}) cells
:top [(if br (dec br) frame-end-r)
(min (last-col label sheet) frame-end-c)]
:left [(min (last-row label sheet) frame-end-r)
(if bc (dec bc) frame-end-c)]))}) cells
(apply disj cells (filter #(get labels %) cells))
(apply disj cells merged-with-labels)))))

(defn skipped-cells [sheet table-name]
(let [table (get-table sheet table-name)
labels (:labels table)
skip-labels (filter #(get-in table [:skip-cells %]) (keys labels))]
(defn skipped-cells [sheet frame-name]
(let [frame (get-frame sheet frame-name)
labels (:labels frame)
skip-labels (filter #(get-in frame [:skip-cells %]) (keys labels))]
(set/union
(set (mapcat #(label->cells sheet table-name %) skip-labels))
(:skip-cells table))))
(set (mapcat #(label->cells sheet frame-name %) skip-labels))
(:skip-cells frame))))

(defn label-name->cells [sheet table-name label-name & [dirn]]
(defn label-name->cells [sheet frame-name label-name & [dirn]]
;; Excludes skip labels
(->> (keys (:labels (get-table sheet table-name)))
(filter #(get-label sheet table-name % dirn))
(->> (keys (:labels (get-frame sheet frame-name)))
(filter #(get-label sheet frame-name % dirn))
(filter #(when (= label-name
(:scalar (util/get-cell (:grid sheet) %)))
%))
(map #(label->cells sheet table-name %))
(map #(label->cells sheet frame-name %))
(apply set/union)
(#(apply disj % (skipped-cells sheet table-name)))))
(#(apply disj % (skipped-cells sheet frame-name)))))

(defn mark-skipped [sheet table-name addresses]
(update-in sheet [:tables table-name :skip-cells] #(apply conj % (set addresses))))
(defn mark-skipped [sheet frame-name addresses]
(update-in sheet [:frames frame-name :skip-cells] #(apply conj % (set addresses))))

(defn unmark-skipped [sheet table-name addresses]
(defn unmark-skipped [sheet frame-name addresses]
(let [addresses*
(set/union
(set addresses)
(set (mapcat #(label->cells sheet table-name %) addresses)))]
(update-in sheet [:tables table-name :skip-cells] #(apply disj % addresses*))))
(set (mapcat #(label->cells sheet frame-name %) addresses)))]
(update-in sheet [:frames frame-name :skip-cells] #(apply disj % addresses*))))

(defn resize-table [sheet table-name area]
(update-in sheet [:tables table-name] merge area))
(defn resize-frame [sheet frame-name area]
(update-in sheet [:frames frame-name] merge area))

(defn expand-tables [sheet [updated-r updated-c]]
(if-let [at-end-of-table (some (fn [[table-name {:keys [start end]}]]
(defn expand-frames [sheet [updated-r updated-c]]
(if-let [at-end-of-frame (some (fn [[frame-name {:keys [start end]}]]
(when (and (= updated-r (inc (first end)))
(< updated-c (inc (second end)))
(>= updated-c (second start)))
table-name)) (:tables sheet))]
frame-name)) (:frames sheet))]

(let [[end-r end-c] (:end (get-table sheet at-end-of-table))]
(resize-table sheet at-end-of-table {:end [(inc end-r) end-c]}))
(let [[end-r end-c] (:end (get-frame sheet at-end-of-frame))]
(resize-frame sheet at-end-of-frame {:end [(inc end-r) end-c]}))
sheet))
Loading

0 comments on commit 7dbfe81

Please sign in to comment.