Lint picking and small format change

Better calculate the layout hight.  The formatting is still not correct
but fragment hights are more correct.
This commit is contained in:
Christopher T. Johnson
2024-04-02 11:01:18 -04:00
parent d97d1e1342
commit 07ac20d940

View File

@@ -1,7 +1,7 @@
import copy import copy
import json import json
import re import re
from typing import Any, Optional, cast from typing import Any, Dict, Optional, cast
from PyQt6.QtCore import ( from PyQt6.QtCore import (
QByteArray, QByteArray,
@@ -29,15 +29,12 @@ from PyQt6.QtGui import (
QTextOption, QTextOption,
QTransform, QTransform,
) )
from PyQt6.QtNetwork import ( from PyQt6.QtNetwork import QNetworkAccessManager, QNetworkRequest
QNetworkAccessManager,
QNetworkReply,
QNetworkRequest,
)
from PyQt6.QtSql import QSqlQuery from PyQt6.QtSql import QSqlQuery
from PyQt6.QtWidgets import QScrollArea, QWidget from PyQt6.QtWidgets import QScrollArea, QWidget
from lib import query_error from lib import query_error
from lib.sounds import SoundOff
class Fragment: class Fragment:
@@ -71,13 +68,14 @@ class Fragment:
self._color = QColor() self._color = QColor()
self._asis = asis self._asis = asis
self._left = 0 self._left = 0
self._target = "word"
return return
def __str__(self) -> str: def __str__(self) -> str:
return self.__repr__() return self.__repr__()
def size(self, width: int) -> QSize: def size(self, width: int) -> QSize:
rect = QRect(self._position, QSize(width, 2000)) rect = QRect(self._position, QSize(width - self._position.x(), 2000))
flags = ( flags = (
Qt.AlignmentFlag.AlignLeft Qt.AlignmentFlag.AlignLeft
| Qt.AlignmentFlag.AlignBaseline | Qt.AlignmentFlag.AlignBaseline
@@ -144,6 +142,10 @@ class Fragment:
self._text = text self._text = text
return return
def setTarget(self, target: str) -> None:
self._target = target
return
def setFont(self, font: QFont) -> None: def setFont(self, font: QFont) -> None:
self._font = font self._font = font
return return
@@ -361,6 +363,8 @@ class Word:
return [frag] return [frag]
# #
# Needed Fonts # Needed Fonts
# We can't use _resources because that might not be the font
# for this piece of text
# #
bold = QFont(frag.font()) bold = QFont(frag.font())
bold.setWeight(QFont.Weight.Bold) bold.setWeight(QFont.Weight.Bold)
@@ -370,6 +374,8 @@ class Word:
smallCaps.setCapitalization(QFont.Capitalization.SmallCaps) smallCaps.setCapitalization(QFont.Capitalization.SmallCaps)
script = QFont(frag.font()) script = QFont(frag.font())
script.setPixelSize(int(script.pixelSize() / 4)) script.setPixelSize(int(script.pixelSize() / 4))
caps = QFont(frag.font())
caps.setCapitalization(QFont.Capitalization.AllUppercase)
results: list[Fragment] = [] results: list[Fragment] = []
while True: while True:
@@ -470,7 +476,7 @@ class Word:
fields = token.split("|") fields = token.split("|")
token = fields[0] token = fields[0]
if token in [ if token in [
"a_line", "a_link",
"d_link", "d_link",
"dxt", "dxt",
"et_link", "et_link",
@@ -481,6 +487,7 @@ class Word:
wref = "" wref = ""
htext = fields[1] htext = fields[1]
oldFont = QFont(frag.font()) oldFont = QFont(frag.font())
target = "word"
if token == "a_link": if token == "a_link":
wref = fields[1] wref = fields[1]
elif token in ["d_link", "et_link", "mat", "sx", "i_link"]: elif token in ["d_link", "et_link", "mat", "sx", "i_link"]:
@@ -490,16 +497,30 @@ class Word:
wref = fields[2] wref = fields[2]
if token == "i_link": if token == "i_link":
frag.setFont(italic) frag.setFont(italic)
elif token == "i_link": elif token == "sx":
if fields[2] == "": frag.setFont(caps)
wref = fields[1] elif token == "dxt":
else: if fields[3] == "illustration":
wref = fields[2] wref = fields[2]
target = "article"
elif fields[3] == "table":
wref = fields[2]
target = "table"
elif fields[3] != "":
wref = fields[3]
target = "sense"
else:
wref = fields[1]
target = "word"
elif token == "a_link":
target = "word"
wref = fields[1]
else: else:
raise Exception(f"Unknown code: {token} in {org}") raise Exception(f"Unknown code: {token} in {org}")
newFrag = copy.copy(frag) newFrag = copy.copy(frag)
newFrag.setText(htext) newFrag.setText(htext)
newFrag.setWRef(wref) newFrag.setWRef(wref)
newFrag.setTarget(target)
results.append(newFrag) results.append(newFrag)
frag.setFont(oldFont) frag.setFont(oldFont)
text = frag.text() text = frag.text()
@@ -594,9 +615,10 @@ class Word:
return self._leading + self._maxHeight return self._leading + self._maxHeight
_lines: list[Line] = [] _lines: list[Line] = []
_resources: Dict[str, Any] = {}
def __init__(self, word: str) -> None: def __init__(self, word: str) -> None:
self.resources = {} self._resources = {}
# #
# Have we already retrieved this word? # Have we already retrieved this word?
# #
@@ -653,8 +675,24 @@ class Word:
query_error(query) query_error(query)
return return
@pyqtSlot()
def playPRS(self) -> None:
try:
prs = self.current[0]["hwi"]["prs"]
audio = QUrl(self.mw_sound_url(prs))
snd = SoundOff()
snd.playSound(audio)
except KeyError:
pass
return
@pyqtSlot()
def finished(self) -> None:
print("finished")
return
def getWord(self) -> str: def getWord(self) -> str:
return self.current["word"] return cast(str, self.current["word"])
def get_html(self) -> str | None: def get_html(self) -> str | None:
if self.current["source"] == "mw": if self.current["source"] == "mw":
@@ -667,7 +705,7 @@ class Word:
def get_def(self) -> list[Line] | None: def get_def(self) -> list[Line] | None:
if len(self._lines) > 0: if len(self._lines) > 0:
return self._lines return self._lines
if len(self.resources.keys()) < 1: if len(self._resources.keys()) < 1:
# #
# Colors we used # Colors we used
# #
@@ -679,15 +717,19 @@ class Word:
boldFont.setPixelSize(20) boldFont.setPixelSize(20)
textFont = QFont(boldFont) textFont = QFont(boldFont)
italicFont = QFont(boldFont) italicFont = QFont(boldFont)
capsFont = QFont(boldFont)
smallCapsFont = QFont(boldFont)
headerFont.setWeight(QFont.Weight.Bold) headerFont.setWeight(QFont.Weight.Bold)
boldFont.setBold(True) boldFont.setBold(True)
italicFont.setItalic(True) italicFont.setItalic(True)
capsFont.setCapitalization(QFont.Capitalization.AllUppercase)
smallCapsFont.setCapitalization(QFont.Capitalization.SmallCaps)
phonicFont = QFontDatabase.font("Gentium", None, 10) phonicFont = QFontDatabase.font("Gentium", None, 10)
phonicFont.setPixelSize(20) phonicFont.setPixelSize(20)
self.resources = { self._resources = {
"colors": { "colors": {
"base": QColor(Qt.GlobalColor.white), "base": QColor(Qt.GlobalColor.white),
"blue": QColor("#4a7d95"), "blue": QColor("#4a7d95"),
@@ -699,6 +741,8 @@ class Word:
"bold": boldFont, "bold": boldFont,
"italic": italicFont, "italic": italicFont,
"text": textFont, "text": textFont,
"caps": capsFont,
"smallCaps": smallCapsFont,
}, },
} }
if self.current["source"] == "mw": if self.current["source"] == "mw":
@@ -710,6 +754,7 @@ class Word:
def mw_def(self) -> list[Line]: def mw_def(self) -> list[Line]:
lines: list[Word.Line] = [] lines: list[Word.Line] = []
# print(json.dumps(self.current,indent=2))
for entry in self.current["definition"]: for entry in self.current["definition"]:
lines += self.mw_def_entry(entry) lines += self.mw_def_entry(entry)
self._lines = lines self._lines = lines
@@ -720,6 +765,10 @@ class Word:
outer = " " outer = " "
inner = " " inner = " "
for value in seq: for value in seq:
if value[0] == 'pseq':
continue
print(value[0])
print(value[1])
sense = value[1] sense = value[1]
# #
# The optional 'sn' field tells us what sort of labeling to do # The optional 'sn' field tells us what sort of labeling to do
@@ -734,22 +783,41 @@ class Word:
outer = sns[0] outer = sns[0]
else: else:
inner = sns[0] inner = sns[0]
try:
text = ", ".join(sense["sls"])
line = Word.Line()
frag = Fragment(
f"{outer} {inner} ",
self._resources["fonts"]["bold"],
color=self._resources["colors"]["base"],
)
outer = " "
line.addFragment(frag)
frag = Fragment(
text,
self._resources["fonts"]["italic"],
color=self._resources["colors"]["base"],
)
frag.setLeft(30)
line.addFragment(frag)
except KeyError:
pass
try:
for dt in sense["dt"]: for dt in sense["dt"]:
if dt[0] == "text": if dt[0] == "text":
line = Word.Line() line = Word.Line()
frag = Fragment( frag = Fragment(
f"{outer} {inner} ", f"{outer} {inner} ",
self.resources["fonts"]["bold"], self._resources["fonts"]["bold"],
color=self.resources["colors"]["base"], color=self._resources["colors"]["base"],
) )
outer = " " outer = " "
frag.setLeft(10) frag.setLeft(10)
line.addFragment(frag) line.addFragment(frag)
frag = Fragment( frag = Fragment(
dt[1], dt[1],
self.resources["fonts"]["text"], self._resources["fonts"]["text"],
color=self.resources["colors"]["base"], color=self._resources["colors"]["base"],
) )
frag.setLeft(30) frag.setLeft(30)
line.addFragment(frag) line.addFragment(frag)
@@ -759,34 +827,55 @@ class Word:
line = Word.Line() line = Word.Line()
frag = Fragment( frag = Fragment(
f" ", f" ",
self.resources["fonts"]["bold"], self._resources["fonts"]["bold"],
) )
frag.setLeft(45) frag.setLeft(45)
line.addFragment(frag) line.addFragment(frag)
line.addFragment( line.addFragment(
Fragment( Fragment(
vis["t"], vis["t"],
self.resources["fonts"]["text"], self._resources["fonts"]["text"],
color=QColor("#aaa"), color=QColor("#aaa"),
) )
) )
lines.append(line) lines.append(line)
elif dt[0] == "uns":
for uns in dt[1]:
for seg in uns:
if seg[0] == "text":
try:
line = lines.pop()
except IndexError:
line = Word.Line()
frag = Fragment(
"\u27F6 " + seg[1],
self._resources["fonts"]["text"],
color=self._resources["colors"]["base"],
)
frag.setLeft(30)
line.addFragment(frag)
lines.append(line)
else:
raise Exception(f"Unknown key {dt[0]} in {sense['dt']}")
except KeyError:
pass
return lines return lines
def mw_def_entry(self, entry) -> list[Line]: def mw_def_entry(self, entry: dict[str, Any]) -> list[Line]:
# #
# Easy reference to colors # Easy reference to colors
# #
base = self.resources["colors"]["base"] base = self._resources["colors"]["base"]
blue = self.resources["colors"]["blue"] blue = self._resources["colors"]["blue"]
lines: list[Word.Line] = [] lines: list[Word.Line] = []
line = Word.Line() line = Word.Line()
hw = re.sub(r"\*", "", entry["hwi"]["hw"]) hw = re.sub(r"\*", "", entry["hwi"]["hw"])
frag = Fragment(hw, self.resources["fonts"]["header"], color=base) frag = Fragment(hw, self._resources["fonts"]["header"], color=base)
line.addFragment(frag) line.addFragment(frag)
frag = Fragment( frag = Fragment(
" " + entry["fl"], self.resources["fonts"]["label"], color=blue " " + entry["fl"], self._resources["fonts"]["label"], color=blue
) )
line.addFragment(frag) line.addFragment(frag)
lines.append(line) lines.append(line)
@@ -797,7 +886,7 @@ class Word:
for vrs in entry["vrs"]: for vrs in entry["vrs"]:
frag = Fragment( frag = Fragment(
space + vrs["va"], space + vrs["va"],
self.resources["fonts"]["label"], self._resources["fonts"]["label"],
color=base, color=base,
) )
space = " " space = " "
@@ -807,7 +896,7 @@ class Word:
line = self.Line() line = self.Line()
frag = Fragment( frag = Fragment(
entry["hwi"]["hw"] + " ", entry["hwi"]["hw"] + " ",
self.resources["fonts"]["phonic"], self._resources["fonts"]["phonic"],
color=base, color=base,
) )
line.addFragment(frag) line.addFragment(frag)
@@ -816,7 +905,7 @@ class Word:
if audio is None: if audio is None:
audio = "" audio = ""
frag = Fragment( frag = Fragment(
prs["mw"], self.resources["fonts"]["phonic"], color=blue prs["mw"], self._resources["fonts"]["phonic"], color=blue
) )
frag.setAudio(audio) frag.setAudio(audio)
line.addFragment(frag) line.addFragment(frag)
@@ -827,7 +916,7 @@ class Word:
for ins in entry["ins"]: for ins in entry["ins"]:
try: try:
frag = Fragment( frag = Fragment(
ins["il"], self.resources["fonts"]["text"], color=base ins["il"], self._resources["fonts"]["text"], color=base
) )
line.addFragment(frag) line.addFragment(frag)
space = " " space = " "
@@ -835,7 +924,7 @@ class Word:
pass pass
frag = Fragment( frag = Fragment(
space + ins["if"], space + ins["if"],
self.resources["fonts"]["bold"], self._resources["fonts"]["bold"],
color=base, color=base,
) )
line.addFragment(frag) line.addFragment(frag)
@@ -845,7 +934,7 @@ class Word:
line = self.Line() line = self.Line()
frag = Fragment( frag = Fragment(
"; ".join(entry["lbs"]), "; ".join(entry["lbs"]),
self.resources["fonts"]["bold"], self._resources["fonts"]["bold"],
color=base, color=base,
) )
line.addFragment(frag) line.addFragment(frag)
@@ -860,7 +949,7 @@ class Word:
line = self.Line() line = self.Line()
line.addFragment( line.addFragment(
Fragment( Fragment(
v, self.resources["fonts"]["italic"], color=blue v, self._resources["fonts"]["italic"], color=blue
) )
) )
lines.append(line) lines.append(line)
@@ -961,10 +1050,18 @@ class Word:
class Definition(QWidget): class Definition(QWidget):
pronounce = pyqtSignal(str) pronounce = pyqtSignal(str)
def __init__(self, w: Word, *args: Any, **kwargs: Any) -> None: def __init__(
self, word: Optional[Word] = None, *args: Any, **kwargs: Any
) -> None:
super(Definition, self).__init__(*args, **kwargs) super(Definition, self).__init__(*args, **kwargs)
self._word: str = w.getWord() self._word = word
lines = w.get_def() if word is not None:
self.setWord(word)
return
def setWord(self, word: Word) -> None:
self._word = word
lines = word.get_def()
assert lines is not None assert lines is not None
self._lines = lines self._lines = lines
self._buttons: list[Fragment] = [] self._buttons: list[Fragment] = []
@@ -982,7 +1079,7 @@ class Definition(QWidget):
self.setFixedHeight(base) self.setFixedHeight(base)
return return
def resizeEvent(self, event: QResizeEvent) -> None: def resizeEvent(self, event: Optional[QResizeEvent] = None) -> None:
base = 0 base = 0
for line in self._lines: for line in self._lines:
line.finalizeLine(self.width(), base) line.finalizeLine(self.width(), base)