#! /usr/local/bin/apl --script
⍝ ********************************************************************
⍝ wp2.apl Workspace to print reports
⍝ Copyright (C) 2019 Bill Daly
⍝ This program is free software: you can redistribute it and/or modify
⍝ it under the terms of the GNU General Public License as published by
⍝ the Free Software Foundation, either version 3 of the License, or
⍝ (at your option) any later version.
⍝ This program is distributed in the hope that it will be useful,
⍝ but WITHOUT ANY WARRANTY; without even the implied warranty of
⍝ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
⍝ GNU General Public License for more details.
⍝ You should have received a copy of the GNU General Public License
⍝ along with this program. If not, see .
⍝ ********************************************************************
)copy_once 5 DALY/utl
)copy_once 3 DALY/lex
)copy_once 5 DALY/utf8
)copy_once 1 html
)copy_once 3 DALY/fmt
⍝ ********************************************************************
⍝ Report methods
⍝ ********************************************************************
∇rpt←wp∆init id
⍝ Function returns a blank report
rpt←lex∆init
rpt←rpt lex∆assign 'Id' id
rpt←rpt lex∆assign (⊂'Data'),⊂ 1 1 ⍴0
rpt←rpt lex∆assign 'Head_ln01' 'Uknown'
rpt←rpt lex∆assign 'Head_ln02' 'Empty'
rpt←rpt lex∆assign 'Head_ln03' 'mm/dd/yyyy'
rpt←rpt lex∆assign (⊂'Author' ),⊂2⊃,⎕env 'USER'
rpt←rpt lex∆assign 'Initials' 1
rpt←rpt lex∆assign 'Function' ''
rpt←rpt lex∆assign (⊂'Stylesheet'),⊂wp∆defaultSS
rpt←rpt lex∆assign (⊂'Attributes'),⊂1 1 ⍴⊂wp∆attr∆init
rpt←rpt lex∆assign (⊂'DefaultFormat'),⊂(lex∆init)lex∆assign 'Format' 'CF14.2'
∇
∇b←wp∆is rpt;keys;ix;lb;test_keys
⍝ Predicate tests whether rpt is a workpaper.
→(~b←lex∆is rpt)/0
keys←lex∆keys wp∆init 'test'
test_keys←lex∆keys rpt
lb←((⍴test_keys)⍴st),ed
ix←1
st:
→(~b←keys utl∆member ix⊃test_keys)/0
→lb[ix←ix+1]
ed:
∇
∇Id←wp∆getId rpt
⍝ Function returns the report Id.
Id←rpt lex∆lookup 'Id'
∇
∇rpt←old wp∆setId Id
⍝ Function sets the report Id.
rpt←old lex∆assign 'Id' Id
∇
∇data←wp∆getData rpt
⍝ Function returns the report's data
data←rpt lex∆lookup 'Data'
∇
∇ rpt←old wp∆setData data;attr;shape;ix
⍝ Function adds data to the report and conforms the attribute array
⍝ to that data
rpt←old lex∆assign 'Data' data
attr←,(shape←⍴data)↑wp∆getAttributes old
→(∨/ix←0=∊{⍴⍴⍵}¨attr)/save_attr
attr[ix/⍳⍴attr]←⊂wp∆attr∆init
attr←shape⍴attr
save_attr:
rpt←rpt lex∆assign 'Attributes' attr
∇
∇ attr←wp∆getAttributes rpt
⍝ Function returns the data attributes
attr←rpt lex∆lookup 'Attributes'
∇
∇ rpt←old wp∆setAttributes attr;data
⍝ Function stores data attributes
data←old lex∆lookup 'Data'
utl∆es (~∧/(⍴data)=⍴attr)/'ATTRIBUTES MUST BE THE SAME SIZE AND SHAPE AS TH DATA'
rpt←old lex∆assign 'Attributes' attr
∇
∇attr←wp∆getStylesheet rpt
⍝ Function returns the reports's stylesheet
attr←rpt lex∆lookup 'Stylesheet'
∇
∇rpt←old wp∆setStylesheet sheet
⍝ Function sets the stylesheet for the report
rpt←old lex∆assign 'Stylesheet' sheet
∇
∇author←wp∆getAuthor rpt
⍝ Function returns the author of the report
author←rpt lex∆lookup 'Author'
∇
∇rpt←old wp∆setAuthor author
⍝ Function sets the author of the report. wp∆init uses the username
⍝ from the environment.
rpt←old lex∆assign 'Author' author
∇
∇fmt←wp∆getDefaultFormat rpt
⍝ Function returns the default format string for the report
fmt←rpt lex∆lookup 'DefaultFormat'
∇
∇rpt←old wp∆setDefaultFormat fmt
⍝ Function sets the optional default format
rpt←old lex∆assign 'DefaultFormat' fmt
∇
∇hd←wp∆getHeading rpt;lines
⍝ Function returns a list of the heading lines
lines←((⊂rpt) lex∆haskey ¨lines)/lines←{'Head_ln','00'⍕⍵}¨⍳6
hd←(⊂rpt) lex∆lookup ¨ lines
∇
∇rpt←old wp∆setHeading hd;ln;lb
⍝ Function sets a list of lines
⍎(2=⍴⍴hd)/'hd←⊂[2]hd'
ln←1
lb←((⍴hd)⍴st),ed
st: old←old lex∆assign (⊂'Head_ln','00'⍕ln),hd[ln]
→lb[ln←ln+1]
ed:rpt←old
∇
∇initials←wp∆getInitialFlag wp
⍝ Function returns the boolean initial flag
initials←wp lex∆lookup 'Initials'
∇
∇rpt←old wp∆setInitialFlag initials
⍝ Function sets the boolean initial flag
utl∆es (~utl∆numberp initials)/'INITIAL FLAG MUST BE BOOLEAN'
initials←~~initials
rpt←old lex∆assign 'Initials' initials
∇
⍝ ∇rpt←wp∆newSchema old
⍝ ⍝ Function adds header lines from an old schema report.
⍝ rpt←old
⍝ ⍎(rpt lex∆haskey 'Entity')/'rpt←rpt lex∆assign (⊂''Head_ln01''),⊂rpt lex∆lookup ''Entity'''
⍝ ⍎(rpt lex∆haskey 'Title')/'rpt←rpt lex∆assign (⊂''Head_ln02''),⊂rpt lex∆lookup ''Title'''
⍝ ⍎(rpt lex∆haskey 'Period')/'rpt←rpt lex∆assign (⊂''Head_ln03''),⊂rpt lex∆lookup ''Period'''
⍝ ∇
⍝ Function replaced with wp∆convert. wld 20220501
∇txt←attr wp∆∆txtCell val;fs
⍝ Funcion returns a numberic cell as text
→(attr lex∆haskey 'format')/hf
txt←⍕val
→0
hf:
→(fmt∆STSC fs ← attr lex∆lookup 'format')/stsc
txt←fs⍕val
→0
stsc:
txt←fs fmt val
→0
∇
⍝ ********************************************************************
⍝ Functions to assemble an html report
⍝ ********************************************************************
∇html←wp∆html∆assemble wp;dat;size;hattr;ibattr;thead;tbody;hhead;attrs;colgrp
⍝ Function to assemble an html page from a workpaper
wp←wp∆convert wp
size←⍴dat←wp lex∆lookup 'Data'
⍝ Asemble table heading
→(wp lex∆lookup 'Initials')/IBlock
NoIBlock:
thead←size wp∆html∆headWithoutInitals wp
→body
IBlock:
thead←size wp∆html∆assemble∆head wp
→body
body:
⍝ Assemble body
tbody←wp∆html∆assemble∆body wp
⍝ Assemble html head
hhead←(html∆title wp lex∆lookup 'Head_ln02'),html∆style wp∆assemble∆css wp lex∆lookup 'Stylesheet'
hhead←hhead, html∆meta (lex∆init) lex∆assign 'charset' 'UTF8'
hhead←html∆head hhead
⍝ Assemble documetn
→(wp lex∆haskey 'Footer')/withFoot
html←html∆html hhead, html∆body html∆table thead, tbody
→0
withFoot:
html←html∆html hhead, html∆body (html∆table thead,tbody),wp∆html∆assemble∆footer wp
→0
∇
∇thead← size wp∆html∆assemble∆head wp;hattr;ibattr;lrattr
⍝ Function to asemble the report heading for wp∆html∆assemble
hattr←(lex∆init) lex∆assign 'class' 'page-head'
hattr←hattr lex∆assign (⊂'colspan'),⊂ ⍕size[2]-1
ibattr←(lex∆init) lex∆assign 'class' 'initial-block'
lrattr←((lex∆init) lex∆assign 'class' 'last-head')lex∆assign (⊂'colspan'),⊂⍕size[2]
thead←⎕av[11],html∆tr (hattr wp∆html∆∆td wp lex∆lookup 'Head_ln01'),ibattr wp∆html∆∆td wp lex∆lookup 'Id'
thead←thead,⎕av[11],html∆tr (hattr wp∆html∆∆td wp lex∆lookup 'Head_ln02'),ibattr wp∆html∆∆td wp lex∆lookup 'Author'
thead←thead,⎕av[11],html∆tr (hattr wp∆html∆∆td wp lex∆lookup 'Head_ln03'),ibattr wp∆html∆∆td utl∆today
thead←thead,⎕av[11],html∆tr lrattr wp∆html∆∆td ' '
thead←html∆thead thead
∇
∇thead←size wp∆html∆headWithoutInitals wp;hattr;lrattr
⍝ Function returns heading lines with an initial block
hattr←(lex∆init) lex∆assign 'class' 'page-head'
hattr←hattr lex∆assign (⊂'colspan'),⊂ ⍕size[2]-1
lrattr←((lex∆init) lex∆assign 'class' 'last-head')lex∆assign (⊂'colspan'),⊂⍕size[2]
thead←⎕av[11],html∆tr (hattr wp∆html∆∆td wp lex∆lookup 'Head_ln01')
thead←thead,⎕av[11],html∆tr (hattr wp∆html∆∆td wp lex∆lookup 'Head_ln02')
thead←thead,⎕av[11],html∆tr (hattr wp∆html∆∆td wp lex∆lookup 'Head_ln03')
thead←thead,⎕av[11],html∆tr lrattr wp∆html∆∆td ' '
thead←html∆thead thead
∇
∇ln←w wp∆text∆center txt;indent
⍝ Function returns txt centered on width w. If w is not supplied,
⍝ centered on ⎕pw
→(2=⎕nc 'w')/w_defined
w←⎕pw
w_defined:
indent←(⌊(w-⍴txt←,txt)÷2)⍴' '
ln←indent,txt,indent
∇
∇tbody←wp∆html∆assemble∆body wp;a;f;d
⍝ Function to assemble the report body for wp∆html∆assemble
shape←⍴d ←wp lex∆lookup 'Data'
a←wp lex∆lookup 'Attributes'
→(0=⍴f←wp lex∆lookup 'Function')/pr01
d←⍎'a ',f,' d'
pr01:
d←,d
a←,a
tbody←∊⎕av[11],¨html∆tr ¨ ∊¨ ⊂[2] size⍴ a wp∆html∆∆td ¨ ,d
∇
∇tfoot←wp∆html∆assemble∆footer wp
⍝ Function to assemble the footer
tfoot←html∆footer wp lex∆lookup 'Footer'
∇
∇txt←attr wp∆html∆∆td val;fs
⍝ Function to format numeric data and return an html td element.
txt←(attr lex∆drop 'format')html∆td attr wp∆∆txtCell val
∇
∇sheet←wp∆assemble∆css ss;lb;ix;classes;props;cur
⍝ Function assembles a cascading style sheet
lb←((⍴classes←lex∆keys ss)⍴st),ed
ix←1
st:
→('body' utl∆stringEquals cur←ix⊃classes)/s1
props←ss lex∆lookup cur
ss←ss lex∆drop cur
ss←ss lex∆assign (⊂'.',cur),⊂props
s1:→lb[ix←ix+1]
ed:
sheet← xml∆mkSheet ss
∇
⍝ ********************************************************************
⍝ Methods to assemble a text report
⍝ ********************************************************************
∇txt←wp∆txt∆assemble wp;shape;head
⍝ function returns a workpaper formated as text
wp←wp∆convert wp
→(wp lex∆lookup 'Initials')/IBlock
NoIBlock:
head←wp∆txt∆headWithoutInitials wp
→body
IBlock:
head←wp∆txt∆assemble∆head wp
→body
body:
txt←head,wp∆txt∆assemble∆body wp
→(~wp lex∆haskey 'Footer')/0
txt←txt,wp∆txt∆assemble∆footer wp
∇
∇thead←wp∆txt∆assemble∆head wp;author;today;id
⍝ Function to assemble the text report heading
id←wp lex∆lookup 'Id'
today←utl∆today
author←wp lex∆lookup 'Author'
thead←((-⍴id)↓wp∆text∆center wp lex∆lookup 'Head_ln01'),id,⎕tc[3]
thead←thead,((-⍴author)↓wp∆text∆center wp lex∆lookup 'Head_ln02'),author,⎕tc[3]
thead←thead,((-⍴today)↓wp∆text∆center wp lex∆lookup 'Head_ln03'),today,2⍴⎕tc[3]
∇
∇thead←wp∆txt∆headWithoutInitials wp
⍝ Functions assembles a text report heading with the initial block
thead←(wp∆text∆center wp lex∆lookup 'Head_ln01'),⎕tc[3]
thead←thead,(wp∆text∆center wp lex∆lookup 'Head_ln02'),⎕tc[3]
thead←thead,(wp∆text∆center wp lex∆lookup 'Head_ln03'),⎕tc[3]
∇
∇tbody←wp∆txt∆assemble∆body wp;dat;a;ix;f;shape
⍝ Function to assemble the body of a text reppr
shape←⍴dat ←wp lex∆lookup 'Data'
a←wp lex∆lookup 'Attributes'
→(0=⍴f←wp lex∆lookup 'Function')/pr01
dat←⍎'a ',f,' dat'
pr01:
a←,a
dat←,dat
ix←(utl∆numberp ¨ dat)/⍳×/shape
dat[ix]←a[ix] wp∆∆txtCell ¨ dat[ix]
tbody←1⌽,⎕tc[3],utl∆concatColumns shape⍴dat
∇
∇tfoot←wp∆txt∆assemble∆footer wp
⍝ Function to assemble the footer for a text rendering
tfoot ← (wp∆text∆center wp lex∆lookup 'Footer'),⎕tc[3]
∇
⍝ ********************************************************************
⍝ Data array methods
⍝ ********************************************************************
∇ val←rpt wp∆dt∆getCellValue ix;row;col;data;shape
⍝ Function returns the value of cell in the data array
→(1 ≠ ⍴⍴ix)/error
→(2 ≠ ⍴ix)/error
shape←⍴data←rpt lex∆lookup 'Data'
→(shape[1]0),(la[2]>0),la[3 4]≤⍴attr
utl∆es stest/'SHAPE OF ATTRIBUTES IS LESS THAN THE RECTAGLE ',⍕la[⍳4]
utl∆es(~∧/(∊⍴¨ix)=⍴new)/'SHAPE OF NEW DATA IS NOT DESCRIBED BY ',⍕ix
→assignment
assignment:
attr[1⊃ix;2⊃ix]←new
rpt←old lex∆assign 'Attributes' attr
∇
⍝ ********************************************************************
⍝ Stylesheet methods
⍝ ********************************************************************
∇ss←wp∆ss∆default old
⍝ Method assigns the default stylesheet to a workpaper
ss←old lex∆assign 'Stylesheet' wp∆defaultSS
∇
∇ss←wp∆ss∆init
⍝ Function sets up a new, empty stylesheet
ss←lex∆init
∇
∇ss←old wp∆ss∆assignClass class
⍝ Function assigns a class to the stylesheet
ss←old lex∆assign class
∇
∇txt←wp∆ss∆css ss;selectors;classes;values
selectors←lex∆keys ss
values← (⊂ss) lex∆lookup ¨ selectors
classes←⊂[2] selectors,((⍴selectors),1)⍴values
txt←⎕av[11] utl∆join wp∆ssc∆cssRule ¨ classes
∇
⍝ ********************************************************************
⍝ Stylesheet class methods. A class is a selector and a lexicon of
⍝ stylesheet properties.
⍝ ********************************************************************
∇class←wp∆ssc∆init name
⍝ Function creates a class
class← name lex∆init
∇
∇class←old wp∆ssc∆assignProp property;good
⍝ Function adds or replaces a property
→(~good←2 = ⍴ property)/bad
→(~good←wp∆ssp∆propertyp 1⊃property)/bad
→(~good←utl∆stringp 2⊃property)/bad
class←old[1],⊂(2⊃old) lex∆assign property
→0
bad: utl∆es '"',property,'" is not valid.'
→0
∇
∇txt←wp∆ssc∆cssClass class;name;lx;keys
⍝ Function renders a class for a css style sheet
name←1⊃class ◊ lx ← 2⊃class
keys←lex∆keys lx
txt←⎕av[11] utl∆join {(⎕av[10],⍵,':'⎕av[10]),(lx lex∆lookup ⍵),';'}¨lex∆keys lx
txt←name,' {',⎕av[11],txt,'}'
∇
⍝ ********************************************************************
⍝ Stylesheet property methods. A property is a name--value pair
⍝ ********************************************************************
∇b←wp∆ssp∆propertyp property
⍝ Function confirms that property is valid
→(~b←utl∆stringp property)/0
b←(⍴wp∆ssp∆propertyList)≥wp∆ssp∆propertyList utl∆listSearch property
∇
∇txt←wp∆ssp∆cssProperty property
⍝ Function renders a property for a style tag or style sheet.
txt←⎕av[10],(1⊃property),':',⎕av[10],(2⊃property),';',⎕av[11]
∇
⍝ ********************************************************************
⍝ Conversion from old data model
⍝ ********************************************************************
⍝ ∇ wp←wp∆convert old
⍝ ⍝ Function converts from the old attribute list to the new
⍝ wp←wp∆init wp∆getId old
⍝ wp←wp wp∆setHeading (⊂old lex∆lookup 'Entity'),(⊂old lex∆lookup 'Title'),⊂old lex∆lookup 'Period'
⍝ wp←wp wp∆setAuthor old lex∆lookup 'Author'
⍝ wp←wp wp∆setData wp∆getData old
⍝ wp←wp wp∆setAttributes wp∆getAttributes old
⍝ wp←wp wp∆setStylesheet wp∆getStylesheet old
⍝ ∇
∇ wp←wp∆convert old
⍝ Function converts from the old attribute list to the new
wp←old
→(~wp lex∆haskey 'Entity')/h2
wp←wp lex∆assign (⊂'Head_ln01'),⊂wp lex∆lookup 'Entity'
h2:
→(~wp lex∆haskey 'Title')/h3
wp←wp lex∆assign (⊂'Head_ln02'),⊂wp lex∆lookup 'Title'
h3:
→(~wp lex∆haskey 'Period')/0
wp←lex∆assign (⊂'Head_ln02'),⊂wp lex∆lookup 'Period'
∇
⍝ ********************************************************************
⍝ Other matters
⍝ ********************************************************************
∇ss←wp∆defaultSS;r1;r2;r3;r4;r5;r6;r7;r8
⍝ Function returns the default stylesheet
ss←wp∆ss∆init
r1←wp∆ssc∆init 'body'
r1←r1 wp∆ssc∆assignProp 'font' '12pt sans-serif'
r1←r1 wp∆ssc∆assignProp 'text-align' 'left'
r1←r1 wp∆ssc∆assignProp 'border' 'none 2pt black'
ss←ss wp∆ss∆assignClass r1
⍝ ********************************************************************
r2←wp∆ssc∆init 'colhead'
r2←r2 wp∆ssc∆assignProp 'text-align' 'center'
r2←r2 wp∆ssc∆assignProp 'font-size' '8pt'
ss←ss wp∆ss∆assignClass r2
⍝ ********************************************************************
r3←wp∆ssc∆init 'number'
r3←r3 wp∆ssc∆assignProp 'text-align' 'right'
ss←ss wp∆ss∆assignClass r3
⍝ ********************************************************************
r4←wp∆ssc∆init 'page-head'
r4←r4 wp∆ssc∆assignProp 'font-size' 'large'
r4←r4 wp∆ssc∆assignProp 'font-weight' 'bold'
r4←r4 wp∆ssc∆assignProp 'text-align' 'center'
r4←r4 wp∆ssc∆assignProp 'width' '90%'
ss←ss wp∆ss∆assignClass r4
⍝ ********************************************************************
r5←wp∆ssc∆init 'initial-block'
r5←r5 wp∆ssc∆assignProp 'font-size' 'small'
r5←r5 wp∆ssc∆assignProp 'border' 'solid 1pt black'
r5←r5 wp∆ssc∆assignProp 'text-align' 'right'
r5←r5 wp∆ssc∆assignProp 'width' '10%'
ss←ss wp∆ss∆assignClass r5
⍝ ********************************************************************
r6←wp∆ssc∆init 'last-head'
r6←r6 wp∆ssc∆assignProp 'font-size' 'large'
r6←r6 wp∆ssc∆assignProp 'font-weight' 'bold'
r6←r6 wp∆ssc∆assignProp 'height' '36pt'
r6←r6 wp∆ssc∆assignProp 'vertical-align' 'top'
ss←ss wp∆ss∆assignClass r6
⍝ ********************************************************************
r7←wp∆ssc∆init 'subtotal'
r7←r7 wp∆ssc∆assignProp 'text-align' 'right'
r7←r7 wp∆ssc∆assignProp 'border-top' 'solid 1px black'
r7←r7 wp∆ssc∆assignProp 'padding-bottom' '2em'
ss←ss wp∆ss∆assignClass r7
⍝ ********************************************************************
r8←wp∆ssc∆init 'grandtotal'
r8←r8 wp∆ssc∆assignProp 'text-align' 'right'
r8←r8 wp∆ssc∆assignProp 'border-bottom' 'double 1px black'
r8←r8 wp∆ssc∆assignProp 'border-top' 'solid 1px black'
ss←ss wp∆ss∆assignClass r8
∇
∇Z←wp⍙metadata
Z←0 2⍴⍬
Z←Z⍪'Author' 'Bill Daly'
Z←Z⍪'BugEmail' 'bugs@dalywebandedit.com'
Z←Z⍪'Documentation' 'doc/apl-library.info'
Z←Z⍪'Download' 'https://sourceforge.net/p/apl-library'
Z←Z⍪'License' 'GPL v3.0'
Z←Z⍪'Portability' 'L5'
Z←Z⍪'Provides' ''
Z←Z⍪'Requires' 'utl, lex, utf8, html, fmt'
Z←Z⍪'Version' '0 2 3'
Z←Z⍪'Last update' '2022-02-07'
∇
wp∆ssp∆propertyList←111⍴0 ⍝ prolog ≡1
(wp∆ssp∆propertyList)[⍳17]←00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
(wp∆ssp∆propertyList)[17+⍳16]←00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
(wp∆ssp∆propertyList)[33+⍳16]←00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
(wp∆ssp∆propertyList)[49+⍳16]←00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
(wp∆ssp∆propertyList)[65+⍳16]←00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
(wp∆ssp∆propertyList)[81+⍳16]←00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
(wp∆ssp∆propertyList)[97+⍳14]←00 00 00 00 00 00 00 00 00 00 00 00 00 00
((⎕IO+0)⊃wp∆ssp∆propertyList)←'background'
((⎕IO+1)⊃wp∆ssp∆propertyList)←'background-attachment'
((⎕IO+2)⊃wp∆ssp∆propertyList)←'background-color'
((⎕IO+3)⊃wp∆ssp∆propertyList)←'background-image'
((⎕IO+4)⊃wp∆ssp∆propertyList)←'background-position'
((⎕IO+5)⊃wp∆ssp∆propertyList)←'background-position-x'
((⎕IO+6)⊃wp∆ssp∆propertyList)←'background-position-y'
((⎕IO+7)⊃wp∆ssp∆propertyList)←'background-repeat'
((⎕IO+8)⊃wp∆ssp∆propertyList)←'border'
((⎕IO+9)⊃wp∆ssp∆propertyList)←'border-bottom'
((⎕IO+10)⊃wp∆ssp∆propertyList)←'border-bottom-color'
((⎕IO+11)⊃wp∆ssp∆propertyList)←'border-bottom-style'
((⎕IO+12)⊃wp∆ssp∆propertyList)←'border-bottom-width'
((⎕IO+13)⊃wp∆ssp∆propertyList)←'border-collapse'
((⎕IO+14)⊃wp∆ssp∆propertyList)←'border-color'
((⎕IO+15)⊃wp∆ssp∆propertyList)←'border-left'
((⎕IO+16)⊃wp∆ssp∆propertyList)←'border-left-color'
((⎕IO+17)⊃wp∆ssp∆propertyList)←'border-left-style'
((⎕IO+18)⊃wp∆ssp∆propertyList)←'border-left-width'
((⎕IO+19)⊃wp∆ssp∆propertyList)←'border-right'
((⎕IO+20)⊃wp∆ssp∆propertyList)←'border-right-color'
((⎕IO+21)⊃wp∆ssp∆propertyList)←'border-right-style'
((⎕IO+22)⊃wp∆ssp∆propertyList)←'border-right-width'
((⎕IO+23)⊃wp∆ssp∆propertyList)←'border-spacing'
((⎕IO+24)⊃wp∆ssp∆propertyList)←'border-style'
((⎕IO+25)⊃wp∆ssp∆propertyList)←'border-top'
((⎕IO+26)⊃wp∆ssp∆propertyList)←'border-top-color'
((⎕IO+27)⊃wp∆ssp∆propertyList)←'border-top-style'
((⎕IO+28)⊃wp∆ssp∆propertyList)←'border-top-width'
((⎕IO+29)⊃wp∆ssp∆propertyList)←'border-width'
((⎕IO+30)⊃wp∆ssp∆propertyList)←'caption-side'
((⎕IO+31)⊃wp∆ssp∆propertyList)←'clear'
((⎕IO+32)⊃wp∆ssp∆propertyList)←'color'
((⎕IO+33)⊃wp∆ssp∆propertyList)←'direction'
((⎕IO+34)⊃wp∆ssp∆propertyList)←'display'
((⎕IO+35)⊃wp∆ssp∆propertyList)←'empty-cells'
((⎕IO+36)⊃wp∆ssp∆propertyList)←'float'
((⎕IO+37)⊃wp∆ssp∆propertyList)←'font'
((⎕IO+38)⊃wp∆ssp∆propertyList)←'font-family'
((⎕IO+39)⊃wp∆ssp∆propertyList)←'font-size'
((⎕IO+40)⊃wp∆ssp∆propertyList)←'font-size-adjust'
((⎕IO+41)⊃wp∆ssp∆propertyList)←'font-stretch'
((⎕IO+42)⊃wp∆ssp∆propertyList)←'font-style'
((⎕IO+43)⊃wp∆ssp∆propertyList)←'font-variant'
((⎕IO+44)⊃wp∆ssp∆propertyList)←'font-weight'
((⎕IO+45)⊃wp∆ssp∆propertyList)←'height'
((⎕IO+46)⊃wp∆ssp∆propertyList)←'left'
((⎕IO+47)⊃wp∆ssp∆propertyList)←'letter-spacing'
((⎕IO+48)⊃wp∆ssp∆propertyList)←'line-break'
((⎕IO+49)⊃wp∆ssp∆propertyList)←'line-height'
((⎕IO+50)⊃wp∆ssp∆propertyList)←'list-style'
((⎕IO+51)⊃wp∆ssp∆propertyList)←'list-style-image'
((⎕IO+52)⊃wp∆ssp∆propertyList)←'list-style-position'
((⎕IO+53)⊃wp∆ssp∆propertyList)←'list-style-type'
((⎕IO+54)⊃wp∆ssp∆propertyList)←'margin'
((⎕IO+55)⊃wp∆ssp∆propertyList)←'margin-bottom'
((⎕IO+56)⊃wp∆ssp∆propertyList)←'margin-left'
((⎕IO+57)⊃wp∆ssp∆propertyList)←'margin-right'
((⎕IO+58)⊃wp∆ssp∆propertyList)←'margin-top'
((⎕IO+59)⊃wp∆ssp∆propertyList)←'marker-offset'
((⎕IO+60)⊃wp∆ssp∆propertyList)←'max-height'
((⎕IO+61)⊃wp∆ssp∆propertyList)←'max-width'
((⎕IO+62)⊃wp∆ssp∆propertyList)←'min-height'
((⎕IO+63)⊃wp∆ssp∆propertyList)←'min-width'
((⎕IO+64)⊃wp∆ssp∆propertyList)←'orphans'
((⎕IO+65)⊃wp∆ssp∆propertyList)←'outline'
((⎕IO+66)⊃wp∆ssp∆propertyList)←'outline-color'
((⎕IO+67)⊃wp∆ssp∆propertyList)←'outline-style'
((⎕IO+68)⊃wp∆ssp∆propertyList)←'outline-width'
((⎕IO+69)⊃wp∆ssp∆propertyList)←'overflow'
((⎕IO+70)⊃wp∆ssp∆propertyList)←'overflow-X'
((⎕IO+71)⊃wp∆ssp∆propertyList)←'overflow-Y'
((⎕IO+72)⊃wp∆ssp∆propertyList)←'padding'
((⎕IO+73)⊃wp∆ssp∆propertyList)←'padding-bottom'
((⎕IO+74)⊃wp∆ssp∆propertyList)←'padding-left'
((⎕IO+75)⊃wp∆ssp∆propertyList)←'padding-right'
((⎕IO+76)⊃wp∆ssp∆propertyList)←'padding-top'
((⎕IO+77)⊃wp∆ssp∆propertyList)←'page'
((⎕IO+78)⊃wp∆ssp∆propertyList)←'page-break-after'
((⎕IO+79)⊃wp∆ssp∆propertyList)←'page-break-before'
((⎕IO+80)⊃wp∆ssp∆propertyList)←'page-break-inside'
((⎕IO+81)⊃wp∆ssp∆propertyList)←'position'
((⎕IO+82)⊃wp∆ssp∆propertyList)←'quotes'
((⎕IO+83)⊃wp∆ssp∆propertyList)←'right'
((⎕IO+84)⊃wp∆ssp∆propertyList)←'size'
((⎕IO+85)⊃wp∆ssp∆propertyList)←'stress'
((⎕IO+86)⊃wp∆ssp∆propertyList)←'table-layout'
((⎕IO+87)⊃wp∆ssp∆propertyList)←'text-align'
((⎕IO+88)⊃wp∆ssp∆propertyList)←'text-align-last'
((⎕IO+89)⊃wp∆ssp∆propertyList)←'text-decoration'
((⎕IO+90)⊃wp∆ssp∆propertyList)←'text-indent'
((⎕IO+91)⊃wp∆ssp∆propertyList)←'text-justify'
((⎕IO+92)⊃wp∆ssp∆propertyList)←'text-overflow'
((⎕IO+93)⊃wp∆ssp∆propertyList)←'text-shadow'
((⎕IO+94)⊃wp∆ssp∆propertyList)←'text-transform'
((⎕IO+95)⊃wp∆ssp∆propertyList)←'text-autospace'
((⎕IO+96)⊃wp∆ssp∆propertyList)←'text-kashida-space'
((⎕IO+97)⊃wp∆ssp∆propertyList)←'text-underline-position'
((⎕IO+98)⊃wp∆ssp∆propertyList)←'top'
((⎕IO+99)⊃wp∆ssp∆propertyList)←'vertical-align'
((⎕IO+100)⊃wp∆ssp∆propertyList)←'visibility'
((⎕IO+101)⊃wp∆ssp∆propertyList)←'white-space'
((⎕IO+102)⊃wp∆ssp∆propertyList)←'widows'
((⎕IO+103)⊃wp∆ssp∆propertyList)←'width'
((⎕IO+104)⊃wp∆ssp∆propertyList)←'word-break'
((⎕IO+105)⊃wp∆ssp∆propertyList)←'word-spacing'
((⎕IO+106)⊃wp∆ssp∆propertyList)←'word-wrap'
((⎕IO+107)⊃wp∆ssp∆propertyList)←'writing-mode'
((⎕IO+108)⊃wp∆ssp∆propertyList)←'z-index'
((⎕IO+109)⊃wp∆ssp∆propertyList)←'zoom'
((⎕IO+110)⊃wp∆ssp∆propertyList)←' ' ⍝ proto 1
((⎕IO+110)⊃wp∆ssp∆propertyList)←0⍴((⎕IO+110)⊃wp∆ssp∆propertyList) ⍝ proto 2