Viewdefs
viewdefs
¶
Make
¶
Set up the definition of all settings and parameters.
This involves
- specifying value types,
- defining default values
- defining validation functions
- value compilation
- exporting setttings data in Javascript to the client
See also {SideSettings}.
Page elements:
- ∈ highlight-published
- ∈ highlight-reset
- ∈ highlight-many
- ∈ highlight-custom
- ∈ highlight-one
- ∈ highlight-off
- ∈ highlight-select-single-color
Source code in modules/viewdefs.py
class Make:
"""Set up the definition of all settings and parameters.
This involves
* specifying value types,
* defining default values
* defining validation functions
* value compilation
* exporting setttings data in Javascript to the client
See also [{SideSettings}][sidesettings].
Page elements:
* [∈ highlight-published][elem-highlight-published]
* [∈ highlight-reset][elem-highlight-reset]
* [∈ highlight-many][elem-highlight-many]
* [∈ highlight-custom][elem-highlight-custom]
* [∈ highlight-one][elem-highlight-one]
* [∈ highlight-off][elem-highlight-off]
* [∈ highlight-select-single-color][elem-highlight-select-single-color]
"""
def __init__(self):
nColorRows = 4
nColorCols = 4
nDefaultClrRows = 3
nDefaultClrCols = 4
colorSpec = dedent(
"""
red,#ff0000,#ff0000,1
salmon,#ff6688,#ee7799,1
orange,#ffcc66,#eebb55,1
yellow,#ffff00,#dddd00,1
green,#00ff00,#00bb00,1
spring,#ddff77,#77dd44,1
tropical,#66ffcc,#55ddbb,1
turquoise,#00ffff,#00eeee,1
blue,#8888ff,#0000ff,1
skye,#66ccff,#55bbff,1
lilac,#cc88ff,#aa22ff,1
magenta,#ff00ff,#ee00ee,1
grey,#eeeeee,#eeeeee,0
gray,#aaaaaa,#aaaaaa,0
black,#000000,#000000,0
white,#ffffff,#ffffff,0
"""
)
colorSpecCls = dedent(
"""
0,z0
1,z1
2,z2
5,z3
10,z4
20,z5
50,z6
51,z7
"""
)
colorProto = [tuple(spec.split(",")) for spec in colorSpec.strip().split()]
colorsDefault = [x[0] for x in colorProto if x[3] == "1"]
colorNames = [x[0] for x in colorProto]
colors = dict((x[0], dict(q=x[1], w=x[2])) for x in colorProto)
if nColorRows * nColorCols != len(colorNames):
debug(
"View settings: mismatch in number of colors: "
f"{nColorRows} * {nColorCols} != {len(colorNames)}"
)
if nDefaultClrRows * nDefaultClrCols != len(colorsDefault):
debug(
"View settings: mismatch in number of default colors: "
f"{nDefaultClrRows} * {nDefaultClrCols} != {len(colorsDefault)}"
)
tabInfo = dict(
txt1="Notes view",
txt2="Syntax view",
txt3="Abstract view",
)
tabLabels = dict(
txtp="text",
txt1="Notes",
txt2="Syntax",
txt3="Abstract",
txtd="data",
)
trInfo = ["hb", "ph"]
trLabels = dict(
hb="hebrew",
ph="phonetic",
)
nTabViews = len(tabInfo)
# nextTp is a mapping from a text type to the next:
# it goes txtp => txt1 => txt2 => ... => txtp
nextTp = dict(
(
"txtp" if i == 0 else f"txt{i}",
f"txt{i + 1}" if i < nTabViews else "txtp",
)
for i in range(nTabViews + 1)
)
# nextTr is a mapping from a script type to the next: it goes hb => ph => hb
nextTr = dict((trInfo[i], trInfo[(i + 1) % 2]) for i in range(len(trInfo)))
noteStatusOrder = "o*+?-!"
noteStatusCls = {
"o": "nt_info",
"+": "nt_good",
"-": "nt_error",
"?": "nt_warning",
"!": "nt_special",
"*": "nt_note",
}
noteStatusSym = {
"o": "circle",
"+": "check-circle",
"-": "times-circle",
"?": "exclamation-circle",
"!": "info-circle",
"*": "star",
}
noteStatusNxt = {}
for (i, x) in enumerate(noteStatusOrder):
noteStatusNxt[x] = noteStatusOrder[(i + 1) % len(noteStatusOrder)]
featureFields = dict(
txtp=[
("word_number", "slot"),
("word_heb", "text"),
("word_ktv", "ktv"),
("word_phono", "phtext"),
("word_phono_sep", "phsep"),
],
txt1=[
("word_number", "slot"),
("word_heb", "text"),
("word_ktv", "ktv"),
("word_phono", "phtext"),
("word_phono_sep", "phsep"),
("phrase_number", "phrase#"),
("phrase_function", "function"),
("clause_txt", "txt"),
("clause_typ", "typ"),
("clause_atom_tab", "tab"),
],
txt2=[
("word_number", "slot"),
("word_heb", "text"),
("word_ktv", "ktv"),
("word_phono", "phtext"),
("word_phono_sep", "phsep"),
("phrase_number", "phrase#"),
("phrase_function", "function"),
("clause_txt", "txt"),
("clause_typ", "typ"),
("clause_atom_tab", "tab"),
("clause_atom_code", "code"),
],
txt3=[
("word_number", "slot"),
("word_heb", "text"),
("word_ktv", "ktv"),
("word_lex", "lexeme-t"),
("word_pos", "part-of-speech"),
("word_gender", "gender"),
("phrase_number", "phrase#"),
("clause_atom_tab", "tab"),
],
)
featureFieldSpec = (
dedent(
"""
ht:ht_ht=word_heb=text-h,ht_hk=word_ktv=ketiv
pt:pt=word_phono=text-p
hl:hl_hlv=word_vlex=lexeme-v,hl_hlc=word_clex=lexeme-c
tt:tt=word_tran=text-t
tl:tl_tlv=word_glex=lexeme-g,tl_tlc=word_lex=lexeme-t
gl:gl=word_gloss=gloss
wd1:wd1_nmtp=word_nmtp=nametype,wd1_subpos=word_subpos=lexical_set,wd1_pos=word_pos=part-of-speech,wd1_pdp=word_pdp=phrase-dependent-part-of-speech,wd1_lang=word_lang=language,wd1_n=word_number=slot
wd2:wd2_gender=word_gender=gender,wd2_gnumber=word_gnumber=number,wd2_person=word_person=person,wd2_state=word_state=state,wd2_tense=word_tense=tense,wd2_stem=word_stem=verbal_stem
wd3:wd3_nme=word_nme=nme,wd3_pfm=word_pfm=pfm,wd3_prs=word_prs=prs,wd3_uvf=word_uvf=uvf,wd3_vbe=word_vbe=vbe,wd3_vbs=word_vbs=vbs
wd4:wd4_statfl=word_freq_lex=freq-lex,wd4_statrl=word_rank_lex=rank-lex,wd4_statfo=word_freq_occ=freq-occ,wd4_statro=word_rank_occ=rank-occ
sp:sp_rela=subphrase_rela=rela,sp_n=subphrase_number=subphrase#
ph:ph_det=phrase_det=determination,ph_fun=phrase_function=function,ph_typ=phrase_typ=type-ph,ph_rela=phrase_rela=rela,ph_arela=phrase_atom_rela=rela_a,ph_an=phrase_atom_number=phrase_a#,ph_n=phrase_number=phrase#
cl:cl_txt=clause_txt=txt,cl_typ=clause_typ=type-cl,cl_rela=clause_rela=rela,cl_tab=clause_atom_tab=tab,cl_par=clause_atom_pargr=par,cl_code=clause_atom_code=code,cl_an=clause_atom_number=clause_a#,cl_n=clause_number=clause#
sn:sn_an=sentence_atom_number=sentence_a#,sn_n=sentence_number=sentence#
"""
)
.strip()
.split()
)
featureLines = []
for item in featureFieldSpec:
(line, fieldSpec) = item.split(":")
fields = [x.split("=") for x in fieldSpec.split(",")]
featureLines.append((line, tuple(fields)))
itemStyle = dict(
q=dict(
prop="background-color",
default="grey",
off="white",
subtract=250,
T="Q",
t="q",
Tag="Query",
tag="query",
Tags="Queries",
tags="queries",
),
w=dict(
prop="color",
default="gray",
off="black",
subtract=250,
T="W",
t="w",
Tag="Word",
tag="word",
Tags="Words",
tags="words",
),
n=dict(
subtract=250,
T="N",
t="n",
Tag="Note",
tag="note",
Tags="Notes",
tags="notes",
),
m=dict(
subtract=250,
T="I",
t="i",
Tag="Item",
tag="item",
Tags="Items",
tags="items",
),
)
txtTbs = ",".join(f"txt{t}" for t in range(1, nTabViews + 1))
trLabs = ",".join(trLabels)
specs = dict(
material=(
"""version book chapter verse iid page mr qw tp tr lang""",
(
"""alnum:10 alnum:30 int:1-150 int:1-200 base64:1024 """
f"""int:1-1000000 enum:m,r enum:q,w,n enum:txtp,{txtTbs},txtd """
f"""enum:{trLabs} enum:{BK_NAMES}"""
),
{"": """2021 Genesis 1 1 None 1 m x txtp hb en"""},
),
hebrewdata=(
dedent(
"""
ht ht_ht ht_hk
pt
hl hl_hlv hl_hlc
tt
tl tl_tlv tl_tlc
gl
wd1 wd1_nmtp wd1_subpos wd1_pos wd1_pdp wd1_lang wd1_n
wd2 wd2_gender wd2_gnumber wd2_person wd2_state wd2_tense wd2_stem
wd3 wd3_nme wd3_pfm wd3_prs wd3_uvf wd3_vbe wd3_vbs
wd4 wd4_statfl wd4_statrl wd4_statfo wd4_statro
sp sp_rela sp_n
ph ph_det ph_fun ph_typ ph_rela ph_arela ph_an ph_n
cl cl_txt cl_typ cl_rela cl_tab cl_par cl_code cl_an cl_n
sn sn_an sn_n
"""
),
dedent(
"""
bool bool bool bool
bool
bool bool bool
bool
bool bool bool
bool
bool bool bool bool bool bool
bool bool bool bool bool bool bool
bool bool bool bool bool bool bool
bool bool bool bool bool
bool bool bool
bool bool bool bool bool bool bool bool
bool bool bool bool bool bool bool bool bool
bool bool bool
"""
),
{
"": dedent(
"""
v v v v
v
v x v
x
x x v
v
v x v x x x
v v v v v v v
x x x v x v x
v v v x x
v v v
v v v x x v v v
v v v v v v v v v
v v v
"""
)
},
),
highlights=(
"""get active sel_one pub""",
"""bool enum:hloff,hlone,hlcustom,hlmany enum:color bool""",
dict(
q="x hlcustom grey x", w="x hlcustom gray x", n="x hlcustom black v"
),
),
colormap=(
"0",
"""enum:color""",
dict(q="white", w="black"),
),
rest=(
"""pref lan letter extra""",
"""alnum:30 enum:hbo,arc int:1-100000 alnum:64""",
{"": """my hbo 1488 None"""},
),
)
self.nColorRows = nColorRows
self.nColorCols = nColorCols
self.nDefaultClrRows = nDefaultClrRows
self.nDefaultClrCols = nDefaultClrCols
self.colorsDefault = colorsDefault
self.colorSpecCls = colorSpecCls
self.colorNames = colorNames
self.colors = colors
self.nTabViews = nTabViews
self.tabInfo = tabInfo
self.tabLabels = tabLabels
self.trInfo = trInfo
self.trLabels = trLabels
self.nextTp = nextTp
self.nextTr = nextTr
self.noteStatusCls = noteStatusCls
self.noteStatusSym = noteStatusSym
self.noteStatusNxt = noteStatusNxt
self.featureFields = featureFields
self.featureLines = featureLines
self.itemStyle = itemStyle
self.specs = specs
self.setupValidation()
def setupValidation(self):
specs = self.specs
settings = collections.defaultdict(lambda: collections.defaultdict(lambda: {}))
validation = collections.defaultdict(
lambda: collections.defaultdict(lambda: {})
)
for group in specs:
(flds, types, init) = specs[group]
flds = flds.strip().split()
types = types.strip().split()
valtype = [self.compileValues(tp) for tp in types]
for qw in init:
initK = init[qw].strip().split()
for (i, f) in enumerate(flds):
thisInitK = initK[i]
if thisInitK == "None":
thisInitK = ""
settings[group][qw][f] = thisInitK
validation[group][qw][f] = valtype[i]
self.settings = settings
self.validation = validation
def compileValues(self, tp):
colors = self.colors
if tp == "bool":
return lambda d, x: x if x in {"x", "v"} else d
(t, v) = tp.split(":")
if t == "alnum":
return (
lambda d, x: x
if x is not None
and len(str(x)) < int(v)
and str(x).replace("_", "").replace(" ", "").isalnum()
else d
)
elif t == "base64":
return (
lambda d, x: d
if x is None
else x
if (type(x) is str or type(x) is str)
and len(x) < int(v)
and x.replace("_", "").isalnum()
else d
)
elif t == "int":
(lowest, highest) = v.split("-")
return (
lambda d, x: int(x)
if x is not None
and str(x).isdigit()
and int(x) >= int(lowest)
and int(x) <= int(highest)
else int(d)
if d is not None
else d
)
elif t == "enum":
vals = set(colors.keys()) if v == "color" else set(v.split(","))
return lambda d, x: x if x is not None and x in vals else d
def export(self):
return {
key: getattr(self, key)
for key in dedent(
"""
nColorRows
nColorCols
nDefaultClrRows
nDefaultClrCols
colorsDefault
colorSpecCls
colorNames
colors
nTabViews
tabInfo
tabLabels
trInfo
trLabels
nextTp
nextTr
noteStatusCls
noteStatusSym
noteStatusNxt
featureFields
featureLines
itemStyle
specs
settings
validation
"""
)
.strip()
.split()
}
__init__(self)
special
¶
Source code in modules/viewdefs.py
def __init__(self):
nColorRows = 4
nColorCols = 4
nDefaultClrRows = 3
nDefaultClrCols = 4
colorSpec = dedent(
"""
red,#ff0000,#ff0000,1
salmon,#ff6688,#ee7799,1
orange,#ffcc66,#eebb55,1
yellow,#ffff00,#dddd00,1
green,#00ff00,#00bb00,1
spring,#ddff77,#77dd44,1
tropical,#66ffcc,#55ddbb,1
turquoise,#00ffff,#00eeee,1
blue,#8888ff,#0000ff,1
skye,#66ccff,#55bbff,1
lilac,#cc88ff,#aa22ff,1
magenta,#ff00ff,#ee00ee,1
grey,#eeeeee,#eeeeee,0
gray,#aaaaaa,#aaaaaa,0
black,#000000,#000000,0
white,#ffffff,#ffffff,0
"""
)
colorSpecCls = dedent(
"""
0,z0
1,z1
2,z2
5,z3
10,z4
20,z5
50,z6
51,z7
"""
)
colorProto = [tuple(spec.split(",")) for spec in colorSpec.strip().split()]
colorsDefault = [x[0] for x in colorProto if x[3] == "1"]
colorNames = [x[0] for x in colorProto]
colors = dict((x[0], dict(q=x[1], w=x[2])) for x in colorProto)
if nColorRows * nColorCols != len(colorNames):
debug(
"View settings: mismatch in number of colors: "
f"{nColorRows} * {nColorCols} != {len(colorNames)}"
)
if nDefaultClrRows * nDefaultClrCols != len(colorsDefault):
debug(
"View settings: mismatch in number of default colors: "
f"{nDefaultClrRows} * {nDefaultClrCols} != {len(colorsDefault)}"
)
tabInfo = dict(
txt1="Notes view",
txt2="Syntax view",
txt3="Abstract view",
)
tabLabels = dict(
txtp="text",
txt1="Notes",
txt2="Syntax",
txt3="Abstract",
txtd="data",
)
trInfo = ["hb", "ph"]
trLabels = dict(
hb="hebrew",
ph="phonetic",
)
nTabViews = len(tabInfo)
# nextTp is a mapping from a text type to the next:
# it goes txtp => txt1 => txt2 => ... => txtp
nextTp = dict(
(
"txtp" if i == 0 else f"txt{i}",
f"txt{i + 1}" if i < nTabViews else "txtp",
)
for i in range(nTabViews + 1)
)
# nextTr is a mapping from a script type to the next: it goes hb => ph => hb
nextTr = dict((trInfo[i], trInfo[(i + 1) % 2]) for i in range(len(trInfo)))
noteStatusOrder = "o*+?-!"
noteStatusCls = {
"o": "nt_info",
"+": "nt_good",
"-": "nt_error",
"?": "nt_warning",
"!": "nt_special",
"*": "nt_note",
}
noteStatusSym = {
"o": "circle",
"+": "check-circle",
"-": "times-circle",
"?": "exclamation-circle",
"!": "info-circle",
"*": "star",
}
noteStatusNxt = {}
for (i, x) in enumerate(noteStatusOrder):
noteStatusNxt[x] = noteStatusOrder[(i + 1) % len(noteStatusOrder)]
featureFields = dict(
txtp=[
("word_number", "slot"),
("word_heb", "text"),
("word_ktv", "ktv"),
("word_phono", "phtext"),
("word_phono_sep", "phsep"),
],
txt1=[
("word_number", "slot"),
("word_heb", "text"),
("word_ktv", "ktv"),
("word_phono", "phtext"),
("word_phono_sep", "phsep"),
("phrase_number", "phrase#"),
("phrase_function", "function"),
("clause_txt", "txt"),
("clause_typ", "typ"),
("clause_atom_tab", "tab"),
],
txt2=[
("word_number", "slot"),
("word_heb", "text"),
("word_ktv", "ktv"),
("word_phono", "phtext"),
("word_phono_sep", "phsep"),
("phrase_number", "phrase#"),
("phrase_function", "function"),
("clause_txt", "txt"),
("clause_typ", "typ"),
("clause_atom_tab", "tab"),
("clause_atom_code", "code"),
],
txt3=[
("word_number", "slot"),
("word_heb", "text"),
("word_ktv", "ktv"),
("word_lex", "lexeme-t"),
("word_pos", "part-of-speech"),
("word_gender", "gender"),
("phrase_number", "phrase#"),
("clause_atom_tab", "tab"),
],
)
featureFieldSpec = (
dedent(
"""
ht:ht_ht=word_heb=text-h,ht_hk=word_ktv=ketiv
pt:pt=word_phono=text-p
hl:hl_hlv=word_vlex=lexeme-v,hl_hlc=word_clex=lexeme-c
tt:tt=word_tran=text-t
tl:tl_tlv=word_glex=lexeme-g,tl_tlc=word_lex=lexeme-t
gl:gl=word_gloss=gloss
wd1:wd1_nmtp=word_nmtp=nametype,wd1_subpos=word_subpos=lexical_set,wd1_pos=word_pos=part-of-speech,wd1_pdp=word_pdp=phrase-dependent-part-of-speech,wd1_lang=word_lang=language,wd1_n=word_number=slot
wd2:wd2_gender=word_gender=gender,wd2_gnumber=word_gnumber=number,wd2_person=word_person=person,wd2_state=word_state=state,wd2_tense=word_tense=tense,wd2_stem=word_stem=verbal_stem
wd3:wd3_nme=word_nme=nme,wd3_pfm=word_pfm=pfm,wd3_prs=word_prs=prs,wd3_uvf=word_uvf=uvf,wd3_vbe=word_vbe=vbe,wd3_vbs=word_vbs=vbs
wd4:wd4_statfl=word_freq_lex=freq-lex,wd4_statrl=word_rank_lex=rank-lex,wd4_statfo=word_freq_occ=freq-occ,wd4_statro=word_rank_occ=rank-occ
sp:sp_rela=subphrase_rela=rela,sp_n=subphrase_number=subphrase#
ph:ph_det=phrase_det=determination,ph_fun=phrase_function=function,ph_typ=phrase_typ=type-ph,ph_rela=phrase_rela=rela,ph_arela=phrase_atom_rela=rela_a,ph_an=phrase_atom_number=phrase_a#,ph_n=phrase_number=phrase#
cl:cl_txt=clause_txt=txt,cl_typ=clause_typ=type-cl,cl_rela=clause_rela=rela,cl_tab=clause_atom_tab=tab,cl_par=clause_atom_pargr=par,cl_code=clause_atom_code=code,cl_an=clause_atom_number=clause_a#,cl_n=clause_number=clause#
sn:sn_an=sentence_atom_number=sentence_a#,sn_n=sentence_number=sentence#
"""
)
.strip()
.split()
)
featureLines = []
for item in featureFieldSpec:
(line, fieldSpec) = item.split(":")
fields = [x.split("=") for x in fieldSpec.split(",")]
featureLines.append((line, tuple(fields)))
itemStyle = dict(
q=dict(
prop="background-color",
default="grey",
off="white",
subtract=250,
T="Q",
t="q",
Tag="Query",
tag="query",
Tags="Queries",
tags="queries",
),
w=dict(
prop="color",
default="gray",
off="black",
subtract=250,
T="W",
t="w",
Tag="Word",
tag="word",
Tags="Words",
tags="words",
),
n=dict(
subtract=250,
T="N",
t="n",
Tag="Note",
tag="note",
Tags="Notes",
tags="notes",
),
m=dict(
subtract=250,
T="I",
t="i",
Tag="Item",
tag="item",
Tags="Items",
tags="items",
),
)
txtTbs = ",".join(f"txt{t}" for t in range(1, nTabViews + 1))
trLabs = ",".join(trLabels)
specs = dict(
material=(
"""version book chapter verse iid page mr qw tp tr lang""",
(
"""alnum:10 alnum:30 int:1-150 int:1-200 base64:1024 """
f"""int:1-1000000 enum:m,r enum:q,w,n enum:txtp,{txtTbs},txtd """
f"""enum:{trLabs} enum:{BK_NAMES}"""
),
{"": """2021 Genesis 1 1 None 1 m x txtp hb en"""},
),
hebrewdata=(
dedent(
"""
ht ht_ht ht_hk
pt
hl hl_hlv hl_hlc
tt
tl tl_tlv tl_tlc
gl
wd1 wd1_nmtp wd1_subpos wd1_pos wd1_pdp wd1_lang wd1_n
wd2 wd2_gender wd2_gnumber wd2_person wd2_state wd2_tense wd2_stem
wd3 wd3_nme wd3_pfm wd3_prs wd3_uvf wd3_vbe wd3_vbs
wd4 wd4_statfl wd4_statrl wd4_statfo wd4_statro
sp sp_rela sp_n
ph ph_det ph_fun ph_typ ph_rela ph_arela ph_an ph_n
cl cl_txt cl_typ cl_rela cl_tab cl_par cl_code cl_an cl_n
sn sn_an sn_n
"""
),
dedent(
"""
bool bool bool bool
bool
bool bool bool
bool
bool bool bool
bool
bool bool bool bool bool bool
bool bool bool bool bool bool bool
bool bool bool bool bool bool bool
bool bool bool bool bool
bool bool bool
bool bool bool bool bool bool bool bool
bool bool bool bool bool bool bool bool bool
bool bool bool
"""
),
{
"": dedent(
"""
v v v v
v
v x v
x
x x v
v
v x v x x x
v v v v v v v
x x x v x v x
v v v x x
v v v
v v v x x v v v
v v v v v v v v v
v v v
"""
)
},
),
highlights=(
"""get active sel_one pub""",
"""bool enum:hloff,hlone,hlcustom,hlmany enum:color bool""",
dict(
q="x hlcustom grey x", w="x hlcustom gray x", n="x hlcustom black v"
),
),
colormap=(
"0",
"""enum:color""",
dict(q="white", w="black"),
),
rest=(
"""pref lan letter extra""",
"""alnum:30 enum:hbo,arc int:1-100000 alnum:64""",
{"": """my hbo 1488 None"""},
),
)
self.nColorRows = nColorRows
self.nColorCols = nColorCols
self.nDefaultClrRows = nDefaultClrRows
self.nDefaultClrCols = nDefaultClrCols
self.colorsDefault = colorsDefault
self.colorSpecCls = colorSpecCls
self.colorNames = colorNames
self.colors = colors
self.nTabViews = nTabViews
self.tabInfo = tabInfo
self.tabLabels = tabLabels
self.trInfo = trInfo
self.trLabels = trLabels
self.nextTp = nextTp
self.nextTr = nextTr
self.noteStatusCls = noteStatusCls
self.noteStatusSym = noteStatusSym
self.noteStatusNxt = noteStatusNxt
self.featureFields = featureFields
self.featureLines = featureLines
self.itemStyle = itemStyle
self.specs = specs
self.setupValidation()
setupValidation(self)
¶
Source code in modules/viewdefs.py
def setupValidation(self):
specs = self.specs
settings = collections.defaultdict(lambda: collections.defaultdict(lambda: {}))
validation = collections.defaultdict(
lambda: collections.defaultdict(lambda: {})
)
for group in specs:
(flds, types, init) = specs[group]
flds = flds.strip().split()
types = types.strip().split()
valtype = [self.compileValues(tp) for tp in types]
for qw in init:
initK = init[qw].strip().split()
for (i, f) in enumerate(flds):
thisInitK = initK[i]
if thisInitK == "None":
thisInitK = ""
settings[group][qw][f] = thisInitK
validation[group][qw][f] = valtype[i]
self.settings = settings
self.validation = validation
compileValues(self, tp)
¶
Source code in modules/viewdefs.py
def compileValues(self, tp):
colors = self.colors
if tp == "bool":
return lambda d, x: x if x in {"x", "v"} else d
(t, v) = tp.split(":")
if t == "alnum":
return (
lambda d, x: x
if x is not None
and len(str(x)) < int(v)
and str(x).replace("_", "").replace(" ", "").isalnum()
else d
)
elif t == "base64":
return (
lambda d, x: d
if x is None
else x
if (type(x) is str or type(x) is str)
and len(x) < int(v)
and x.replace("_", "").isalnum()
else d
)
elif t == "int":
(lowest, highest) = v.split("-")
return (
lambda d, x: int(x)
if x is not None
and str(x).isdigit()
and int(x) >= int(lowest)
and int(x) <= int(highest)
else int(d)
if d is not None
else d
)
elif t == "enum":
vals = set(colors.keys()) if v == "color" else set(v.split(","))
return lambda d, x: x if x is not None and x in vals else d
export(self)
¶
Source code in modules/viewdefs.py
def export(self):
return {
key: getattr(self, key)
for key in dedent(
"""
nColorRows
nColorCols
nDefaultClrRows
nDefaultClrCols
colorsDefault
colorSpecCls
colorNames
colors
nTabViews
tabInfo
tabLabels
trInfo
trLabels
nextTp
nextTr
noteStatusCls
noteStatusSym
noteStatusNxt
featureFields
featureLines
itemStyle
specs
settings
validation
"""
)
.strip()
.split()
}
VIEWDEFS
¶
Source code in modules/viewdefs.py
class VIEWDEFS:
def __init__(self):
Caching = current.Caching
def make():
makeObj = Make()
return makeObj.export()
keyValues = Caching.get("viewsettings_", make, ALWAYS)
for (key, value) in keyValues.items():
setattr(self, key, value)
def colorPicker(self, qw, iid, typ):
return f"{self.selectColor(qw, iid, typ)}{self.colorTable(qw, iid)}\n"
def makeColors(self):
colorSpecCls = self.colorSpecCls
colorProtoCls = [
tuple(spec.split(",")) for spec in colorSpecCls.strip().split()
]
colorsCls = []
lPrev = 0
for (l, z) in colorProtoCls:
lNew = int(l) + 1
for i in range(lPrev, lNew):
colorsCls.append(z)
lPrev = lNew
return colorsCls
def colorTable(self, qw, iid):
nColorRows = self.nColorRows
cs = "\n".join(self.colorRow(qw, iid, r) for r in range(nColorRows))
return f'<table class="picker" id="picker_{qw}{iid}">\n{cs}\n</table>\n'
def colorRow(self, qw, iid, r):
nColorCols = self.nColorCols
cells = "\n".join(
self.colorCell(qw, iid, c)
for c in range(r * nColorCols, (r + 1) * nColorCols)
)
return f"\t<tr>\n{cells}\n\t</tr>"
def colorCell(self, qw, iid, c):
colorNames = self.colorNames
return (
f"""\t\t<td class="c{qw} {qw}{iid}"><a href="#">{colorNames[c]}</a></td>"""
)
def selectColor(self, qw, iid, typ):
content = " " if qw == "q" else "w"
selCtl = (
""
if typ
else f"""<span class="pickedc"
><input type="checkbox" id="select_{qw}{iid}" name="select_{qw}{iid}"
/></span> """
)
sel = f"""<span class="picked colorselect_{qw}" id="sel_{qw}{iid}"
><a href="#">{content}</a></span>"""
return selCtl + sel
__init__(self)
special
¶
Source code in modules/viewdefs.py
def __init__(self):
Caching = current.Caching
def make():
makeObj = Make()
return makeObj.export()
keyValues = Caching.get("viewsettings_", make, ALWAYS)
for (key, value) in keyValues.items():
setattr(self, key, value)
colorPicker(self, qw, iid, typ)
¶
Source code in modules/viewdefs.py
def colorPicker(self, qw, iid, typ):
return f"{self.selectColor(qw, iid, typ)}{self.colorTable(qw, iid)}\n"
makeColors(self)
¶
Source code in modules/viewdefs.py
def makeColors(self):
colorSpecCls = self.colorSpecCls
colorProtoCls = [
tuple(spec.split(",")) for spec in colorSpecCls.strip().split()
]
colorsCls = []
lPrev = 0
for (l, z) in colorProtoCls:
lNew = int(l) + 1
for i in range(lPrev, lNew):
colorsCls.append(z)
lPrev = lNew
return colorsCls
colorTable(self, qw, iid)
¶
Source code in modules/viewdefs.py
def colorTable(self, qw, iid):
nColorRows = self.nColorRows
cs = "\n".join(self.colorRow(qw, iid, r) for r in range(nColorRows))
return f'<table class="picker" id="picker_{qw}{iid}">\n{cs}\n</table>\n'
colorRow(self, qw, iid, r)
¶
Source code in modules/viewdefs.py
def colorRow(self, qw, iid, r):
nColorCols = self.nColorCols
cells = "\n".join(
self.colorCell(qw, iid, c)
for c in range(r * nColorCols, (r + 1) * nColorCols)
)
return f"\t<tr>\n{cells}\n\t</tr>"
colorCell(self, qw, iid, c)
¶
Source code in modules/viewdefs.py
def colorCell(self, qw, iid, c):
colorNames = self.colorNames
return (
f"""\t\t<td class="c{qw} {qw}{iid}"><a href="#">{colorNames[c]}</a></td>"""
)
selectColor(self, qw, iid, typ)
¶
Source code in modules/viewdefs.py
def selectColor(self, qw, iid, typ):
content = " " if qw == "q" else "w"
selCtl = (
""
if typ
else f"""<span class="pickedc"
><input type="checkbox" id="select_{qw}{iid}" name="select_{qw}{iid}"
/></span> """
)
sel = f"""<span class="picked colorselect_{qw}" id="sel_{qw}{iid}"
><a href="#">{content}</a></span>"""
return selCtl + sel