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:
175
lib/words.py
175
lib/words.py
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user