Make ODT margins scale to em units

This commit is contained in:
Veronica Berglyd Olsen
2024-11-13 20:04:52 +01:00
parent e514b1be4f
commit d8c14f6712
+51 -116
View File
@@ -173,44 +173,10 @@ class ToOdt(Tokenizer):
self._fontStyle = "normal"
self._fontPitch = "variable"
self._fontBold = "bold"
self._fSizeTitle = "30pt"
self._fSizeHead1 = "24pt"
self._fSizeHead2 = "20pt"
self._fSizeHead3 = "16pt"
self._fSizeHead4 = "14pt"
self._fSizeHead = "14pt"
self._fSizeText = "12pt"
self._fSizeFoot = "10pt"
self._fLineHeight = "115%"
self._fBlockIndent = "1.693cm"
self._fTextIndent = "0.499cm"
self._dLanguage = "en"
self._dCountry = "GB"
# Text Margins
self._mTopTitle = "0.423cm"
self._mTopHead1 = "0.423cm"
self._mTopHead2 = "0.353cm"
self._mTopHead3 = "0.247cm"
self._mTopHead4 = "0.247cm"
self._mTopHead = "0.423cm"
self._mTopText = "0.000cm"
self._mTopMeta = "0.000cm"
self._mTopSep = "0.247cm"
self._mBotTitle = "0.212cm"
self._mBotHead1 = "0.212cm"
self._mBotHead2 = "0.212cm"
self._mBotHead3 = "0.212cm"
self._mBotHead4 = "0.212cm"
self._mBotHead = "0.212cm"
self._mBotText = "0.247cm"
self._mBotMeta = "0.106cm"
self._mBotSep = "0.247cm"
self._mBotFoot = "0.106cm"
self._mLeftFoot = "0.600cm"
# Document Size and Margins
self._mDocWidth = "21.0cm"
self._mDocHeight = "29.7cm"
@@ -262,52 +228,14 @@ class ToOdt(Tokenizer):
self._dLanguage = lang or self._dLanguage
self._dCountry = country or self._dCountry
self._fontFamily = self._textFont.family()
self._fontSize = self._textFont.pointSize()
self._fontWeight = FONT_WEIGHT_MAP.get(fontWeight, fontWeight)
self._fontStyle = FONT_STYLE.get(self._textFont.style(), "normal")
self._fontPitch = "fixed" if self._textFont.fixedPitch() else "variable"
self._fontBold = FONT_WEIGHT_MAP.get(fontBold, fontBold)
self._headWeight = self._fontBold if self._boldHeads else None
hScale = self._scaleHeads
self._fSizeTitle = self._emToPt(nwStyles.H_SIZES[0] if hScale else 1.0) # Was 2.50
self._fSizeHead1 = self._emToPt(nwStyles.H_SIZES[1] if hScale else 1.0) # Was 2.00
self._fSizeHead2 = self._emToPt(nwStyles.H_SIZES[2] if hScale else 1.0) # Was 1.60
self._fSizeHead3 = self._emToPt(nwStyles.H_SIZES[3] if hScale else 1.0) # Was 1.30
self._fSizeHead4 = self._emToPt(nwStyles.H_SIZES[4] if hScale else 1.0) # Was 1.15
self._fSizeHead = self._emToPt(nwStyles.H_SIZES[4] if hScale else 1.0) # Was 1.15
self._fSizeText = self._emToPt(1.0)
self._fSizeFoot = self._emToPt(0.8)
mScale = self._lineHeight/1.15
self._mTopTitle = self._emToCm(mScale * self._marginTitle[0])
self._mTopHead1 = self._emToCm(mScale * self._marginHead1[0])
self._mTopHead2 = self._emToCm(mScale * self._marginHead2[0])
self._mTopHead3 = self._emToCm(mScale * self._marginHead3[0])
self._mTopHead4 = self._emToCm(mScale * self._marginHead4[0])
self._mTopHead = self._emToCm(mScale * self._marginHead4[0])
self._mTopText = self._emToCm(mScale * self._marginText[0])
self._mTopMeta = self._emToCm(mScale * self._marginMeta[0])
self._mTopSep = self._emToCm(mScale * self._marginSep[0])
self._mBotTitle = self._emToCm(mScale * self._marginTitle[1])
self._mBotHead1 = self._emToCm(mScale * self._marginHead1[1])
self._mBotHead2 = self._emToCm(mScale * self._marginHead2[1])
self._mBotHead3 = self._emToCm(mScale * self._marginHead3[1])
self._mBotHead4 = self._emToCm(mScale * self._marginHead4[1])
self._mBotHead = self._emToCm(mScale * self._marginHead4[1])
self._mBotText = self._emToCm(mScale * self._marginText[1])
self._mBotMeta = self._emToCm(mScale * self._marginMeta[1])
self._mBotSep = self._emToCm(mScale * self._marginSep[1])
self._mLeftFoot = self._emToCm(self._marginFoot[0])
self._mBotFoot = self._emToCm(self._marginFoot[1])
self._fLineHeight = f"{round(100 * self._lineHeight):d}%"
self._fontFamily = self._textFont.family()
self._fontSize = self._textFont.pointSize()
self._fontWeight = FONT_WEIGHT_MAP.get(fontWeight, fontWeight)
self._fontStyle = FONT_STYLE.get(self._textFont.style(), "normal")
self._fontPitch = "fixed" if self._textFont.fixedPitch() else "variable"
self._fontBold = FONT_WEIGHT_MAP.get(fontBold, fontBold)
self._headWeight = self._fontBold if self._boldHeads else None
self._fBlockIndent = self._emToCm(self._blockIndent)
self._fTextIndent = self._emToCm(self._firstWidth)
# Clear Errors
self._errData = []
@@ -782,6 +710,9 @@ class ToOdt(Tokenizer):
def _defaultStyles(self) -> None:
"""Set the default styles."""
hScale = self._scaleHeads
textSize = self._emToPt(nwStyles.T_NORMAL)
# Add Paragraph Family Style
xStyl = ET.SubElement(self._xStyl, _mkTag("style", "default-style"), attrib={
_mkTag("style", "family"): "paragraph",
@@ -796,7 +727,7 @@ class ToOdt(Tokenizer):
_mkTag("fo", "font-family"): self._fontFamily,
_mkTag("fo", "font-weight"): self._fontWeight,
_mkTag("fo", "font-style"): self._fontStyle,
_mkTag("fo", "font-size"): self._fSizeText,
_mkTag("fo", "font-size"): textSize,
_mkTag("fo", "language"): self._dLanguage,
_mkTag("fo", "country"): self._dCountry,
})
@@ -812,7 +743,7 @@ class ToOdt(Tokenizer):
_mkTag("fo", "font-family"): self._fontFamily,
_mkTag("fo", "font-weight"): self._fontWeight,
_mkTag("fo", "font-style"): self._fontStyle,
_mkTag("fo", "font-size"): self._fSizeText,
_mkTag("fo", "font-size"): textSize,
})
# Add Default Heading Style
@@ -824,8 +755,8 @@ class ToOdt(Tokenizer):
_mkTag("style", "class"): "text",
})
ET.SubElement(xStyl, _mkTag("style", "paragraph-properties"), attrib={
_mkTag("fo", "margin-top"): self._mTopHead,
_mkTag("fo", "margin-bottom"): self._mBotHead,
_mkTag("fo", "margin-top"): self._emToCm(self._marginHead4[0]),
_mkTag("fo", "margin-bottom"): self._emToCm(self._marginHead4[1]),
_mkTag("fo", "keep-with-next"): "always",
})
ET.SubElement(xStyl, _mkTag("style", "text-properties"), attrib={
@@ -833,7 +764,7 @@ class ToOdt(Tokenizer):
_mkTag("fo", "font-family"): self._fontFamily,
_mkTag("fo", "font-weight"): self._fontWeight,
_mkTag("fo", "font-style"): self._fontStyle,
_mkTag("fo", "font-size"): self._fSizeHead,
_mkTag("fo", "font-size"): self._emToPt(nwStyles.H_SIZES[4] if hScale else 1.0),
})
# Add Header and Footer Styles
@@ -857,20 +788,24 @@ class ToOdt(Tokenizer):
def _useableStyles(self) -> None:
"""Set the usable styles."""
hScale = self._scaleHeads
hColor = self._theme.head if self._colorHeads else None
textSize = self._emToPt(nwStyles.T_NORMAL)
lineHeight = f"{round(100 * self._lineHeight):d}%"
# Add Text Body Style
style = ODTParagraphStyle(S_TEXT)
style.setDisplayName("Text body")
style.setParentStyleName("Standard")
style.setClass("text")
style.setMarginTop(self._mTopText)
style.setMarginBottom(self._mBotText)
style.setLineHeight(self._fLineHeight)
style.setMarginTop(self._emToCm(self._marginText[0]))
style.setMarginBottom(self._emToCm(self._marginText[1]))
style.setLineHeight(lineHeight)
style.setTextAlign(self._defaultAlign)
style.setFontName(self._fontFamily)
style.setFontFamily(self._fontFamily)
style.setFontSize(self._fSizeText)
style.setFontSize(textSize)
style.setFontWeight(self._fontWeight)
style.packXML(self._xStyl)
self._mainPara[style.name] = style
@@ -880,7 +815,7 @@ class ToOdt(Tokenizer):
style.setDisplayName("First line indent")
style.setParentStyleName(S_TEXT)
style.setClass("text")
style.setTextIndent(self._fTextIndent)
style.setTextIndent(self._emToCm(self._firstWidth))
style.packXML(self._xStyl)
self._mainPara[style.name] = style
@@ -889,12 +824,12 @@ class ToOdt(Tokenizer):
style.setDisplayName("Text Meta")
style.setParentStyleName("Standard")
style.setClass("text")
style.setMarginTop(self._mTopMeta)
style.setMarginBottom(self._mBotMeta)
style.setLineHeight(self._fLineHeight)
style.setMarginTop(self._emToCm(self._marginMeta[0]))
style.setMarginBottom(self._emToCm(self._marginMeta[1]))
style.setLineHeight(lineHeight)
style.setFontName(self._fontFamily)
style.setFontFamily(self._fontFamily)
style.setFontSize(self._fSizeText)
style.setFontSize(textSize)
style.setFontWeight(self._fontWeight)
style.packXML(self._xStyl)
self._mainPara[style.name] = style
@@ -905,12 +840,12 @@ class ToOdt(Tokenizer):
style.setParentStyleName("Heading")
style.setNextStyleName(S_TEXT)
style.setClass("chapter")
style.setMarginTop(self._mTopTitle)
style.setMarginBottom(self._mBotTitle)
style.setMarginTop(self._emToCm(self._marginTitle[0]))
style.setMarginBottom(self._emToCm(self._marginTitle[1]))
style.setTextAlign("center")
style.setFontName(self._fontFamily)
style.setFontFamily(self._fontFamily)
style.setFontSize(self._fSizeTitle)
style.setFontSize(self._emToPt(nwStyles.H_SIZES[0] if hScale else 1.0))
style.setFontWeight(self._headWeight)
style.packXML(self._xStyl)
self._mainPara[style.name] = style
@@ -921,13 +856,13 @@ class ToOdt(Tokenizer):
style.setParentStyleName("Standard")
style.setNextStyleName(S_TEXT)
style.setClass("text")
style.setMarginTop(self._mTopSep)
style.setMarginBottom(self._mBotSep)
style.setLineHeight(self._fLineHeight)
style.setMarginTop(self._emToCm(self._marginSep[0]))
style.setMarginBottom(self._emToCm(self._marginSep[1]))
style.setLineHeight(lineHeight)
style.setTextAlign("center")
style.setFontName(self._fontFamily)
style.setFontFamily(self._fontFamily)
style.setFontSize(self._fSizeText)
style.setFontSize(textSize)
style.setFontWeight(self._fontWeight)
style.packXML(self._xStyl)
self._mainPara[style.name] = style
@@ -939,11 +874,11 @@ class ToOdt(Tokenizer):
style.setNextStyleName(S_TEXT)
style.setOutlineLevel("1")
style.setClass("text")
style.setMarginTop(self._mTopHead1)
style.setMarginBottom(self._mBotHead1)
style.setMarginTop(self._emToCm(self._marginTitle[1]))
style.setMarginBottom(self._emToCm(self._marginHead1[1]))
style.setFontName(self._fontFamily)
style.setFontFamily(self._fontFamily)
style.setFontSize(self._fSizeHead1)
style.setFontSize(self._emToPt(nwStyles.H_SIZES[1] if hScale else 1.0))
style.setFontWeight(self._headWeight)
style.setColor(hColor)
style.packXML(self._xStyl)
@@ -956,11 +891,11 @@ class ToOdt(Tokenizer):
style.setNextStyleName(S_TEXT)
style.setOutlineLevel("2")
style.setClass("text")
style.setMarginTop(self._mTopHead2)
style.setMarginBottom(self._mBotHead2)
style.setMarginTop(self._emToCm(self._marginHead2[0]))
style.setMarginBottom(self._emToCm(self._marginHead2[1]))
style.setFontName(self._fontFamily)
style.setFontFamily(self._fontFamily)
style.setFontSize(self._fSizeHead2)
style.setFontSize(self._emToPt(nwStyles.H_SIZES[2] if hScale else 1.0))
style.setFontWeight(self._headWeight)
style.setColor(hColor)
style.packXML(self._xStyl)
@@ -973,11 +908,11 @@ class ToOdt(Tokenizer):
style.setNextStyleName(S_TEXT)
style.setOutlineLevel("3")
style.setClass("text")
style.setMarginTop(self._mTopHead3)
style.setMarginBottom(self._mBotHead3)
style.setMarginTop(self._emToCm(self._marginHead3[0]))
style.setMarginBottom(self._emToCm(self._marginHead3[1]))
style.setFontName(self._fontFamily)
style.setFontFamily(self._fontFamily)
style.setFontSize(self._fSizeHead3)
style.setFontSize(self._emToPt(nwStyles.H_SIZES[3] if hScale else 1.0))
style.setFontWeight(self._headWeight)
style.setColor(hColor)
style.packXML(self._xStyl)
@@ -990,11 +925,11 @@ class ToOdt(Tokenizer):
style.setNextStyleName(S_TEXT)
style.setOutlineLevel("4")
style.setClass("text")
style.setMarginTop(self._mTopHead4)
style.setMarginBottom(self._mBotHead4)
style.setMarginTop(self._emToCm(self._marginHead4[0]))
style.setMarginBottom(self._emToCm(self._marginHead4[1]))
style.setFontName(self._fontFamily)
style.setFontFamily(self._fontFamily)
style.setFontSize(self._fSizeHead4)
style.setFontSize(self._emToPt(nwStyles.H_SIZES[4] if hScale else 1.0))
style.setFontWeight(self._headWeight)
style.setColor(hColor)
style.packXML(self._xStyl)
@@ -1013,10 +948,10 @@ class ToOdt(Tokenizer):
style.setDisplayName("Footnote")
style.setParentStyleName("Standard")
style.setClass("extra")
style.setMarginLeft(self._mLeftFoot)
style.setMarginBottom(self._mBotFoot)
style.setTextIndent("-"+self._mLeftFoot)
style.setFontSize(self._fSizeFoot)
style.setMarginLeft(self._emToCm(self._marginFoot[0]))
style.setMarginBottom(self._emToCm(self._marginFoot[1]))
style.setTextIndent("-"+self._emToCm(self._marginFoot[0]))
style.setFontSize(self._emToPt(nwStyles.T_SMALL))
style.packXML(self._xStyl)
self._mainPara[style.name] = style