Add text paragraph formatting

This commit is contained in:
Veronica Berglyd Olsen
2024-05-23 19:43:32 +02:00
parent 6d84942746
commit c8017a1f42
3 changed files with 72 additions and 24 deletions
@@ -26,8 +26,8 @@ from __future__ import annotations
import logging
from PyQt5.QtGui import (
QFont, QFontMetrics, QTextBlockFormat, QTextCharFormat, QTextCursor,
QTextDocument
QColor, QFont, QFontMetrics, QTextBlockFormat, QTextCharFormat,
QTextCursor, QTextDocument
)
from novelwriter import SHARED
@@ -36,13 +36,13 @@ from novelwriter.core.project import NWProject
from novelwriter.core.tokenizer import T_Formats, Tokenizer
from novelwriter.types import (
QtAlignCenter, QtAlignJustify, QtAlignLeft, QtAlignRight, QtPageBreakAfter,
QtPageBreakBefore
QtPageBreakBefore, QtTransparent, QtVAlignNormal, QtVAlignSub,
QtVAlignSuper
)
logger = logging.getLogger(__name__)
T_TextStyle = tuple[QTextBlockFormat, QTextCharFormat]
T_TextParFormat = tuple[str, QTextCharFormat]
class ToQTextDocument(Tokenizer):
@@ -58,7 +58,11 @@ class ToQTextDocument(Tokenizer):
self._document.setUndoRedoEnabled(False)
self._styles: dict[int, T_TextStyle] = {}
self._usedNotes: dict[str, int] = {}
self._init = False
self._bold = QFont.Weight.Bold
self._normal = QFont.Weight.Normal
return
@@ -166,8 +170,7 @@ class ToQTextDocument(Tokenizer):
if tType == self.T_TEXT:
newBlock(bFmt)
tTemp, cFmt = self._formatText(tText, tFormat, self._defaultChar)
cursor.insertText(tTemp, cFmt)
self._insertFragments(tText, tFormat, cursor, self._defaultChar)
elif tType in self.L_HEADINGS:
bFmt, cFmt = self._genHeadStyle(tType, bFmt)
@@ -222,23 +225,64 @@ class ToQTextDocument(Tokenizer):
# Internal Functions
##
def _formatText(self, text: str, tFmt: T_Formats, dFmt: QTextCharFormat) -> T_TextParFormat:
def _insertFragments(
self, text: str, tFmt: T_Formats, cursor: QTextCursor,
dFmt: QTextCharFormat, bgCol: QColor = QtTransparent
) -> None:
"""Apply formatting tags to text."""
temp = text
fmt = QTextCharFormat(dFmt)
# for pos, fmt, data in reversed(tFmt):
# md = ""
# if fmt == self.FMT_FNOTE:
# if data in self._footnotes:
# index = len(self._usedNotes) + 1
# self._usedNotes[data] = index
# md = f"[{index}]"
# else:
# md = "[ERR]"
# else:
# md = tags.get(fmt, "")
# temp = f"{temp[:pos]}{md}{temp[pos:]}"
return temp, fmt
cFmt = QTextCharFormat(dFmt)
start = 0
for pos, fmt, data in tFmt:
# Insert buffer with previous format
cursor.insertText(text[start:pos], cFmt)
# Construct next format
if fmt == self.FMT_B_B:
cFmt.setFontWeight(self._bold)
elif fmt == self.FMT_B_E:
cFmt.setFontWeight(self._normal)
elif fmt == self.FMT_I_B:
cFmt.setFontItalic(True)
elif fmt == self.FMT_I_E:
cFmt.setFontItalic(False)
elif fmt == self.FMT_D_B:
cFmt.setFontStrikeOut(True)
elif fmt == self.FMT_D_E:
cFmt.setFontStrikeOut(False)
elif fmt == self.FMT_U_B:
cFmt.setFontUnderline(True)
elif fmt == self.FMT_U_E:
cFmt.setFontUnderline(False)
elif fmt == self.FMT_M_B:
cFmt.setBackground(SHARED.theme.colMark)
elif fmt == self.FMT_M_E:
cFmt.setBackground(bgCol)
elif fmt == self.FMT_SUP_B:
cFmt.setVerticalAlignment(QtVAlignSuper)
elif fmt == self.FMT_SUP_E:
cFmt.setVerticalAlignment(QtVAlignNormal)
elif fmt == self.FMT_SUB_B:
cFmt.setVerticalAlignment(QtVAlignSub)
elif fmt == self.FMT_SUB_E:
cFmt.setVerticalAlignment(QtVAlignNormal)
elif fmt == self.FMT_FNOTE:
cFmt.setVerticalAlignment(QtVAlignSuper)
if data in self._footnotes:
index = len(self._usedNotes) + 1
self._usedNotes[data] = index
cursor.insertText(f"[{index}]", cFmt)
else:
cursor.insertText("[ERR]", cFmt)
cFmt.setVerticalAlignment(QtVAlignNormal)
# Move pos for next pass
start = pos
# Insert whatever is left in the buffer
cursor.insertText(text[start:], cFmt)
return
def _formatKeywords(self, text: str, style: int) -> str:
"""Apply Markdown formatting to keywords."""
+1 -1
View File
@@ -40,7 +40,7 @@ from PyQt5.QtWidgets import (
from novelwriter import CONFIG, SHARED
from novelwriter.common import cssCol
from novelwriter.constants import nwHeaders, nwUnicode
from novelwriter.core.toqdocument import ToQTextDocument
from novelwriter.core.toqdoc import ToQTextDocument
from novelwriter.enum import nwDocAction, nwDocMode, nwItemType
from novelwriter.error import logException
from novelwriter.extensions.eventfilters import WheelEventFilter
+5 -1
View File
@@ -24,7 +24,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
from __future__ import annotations
from PyQt5.QtCore import QRegularExpression, Qt
from PyQt5.QtGui import QColor, QFont, QPainter, QTextCursor, QTextFormat
from PyQt5.QtGui import QColor, QFont, QPainter, QTextCharFormat, QTextCursor, QTextFormat
from PyQt5.QtWidgets import QDialogButtonBox, QSizePolicy, QStyle
# Qt Alignment Flags
@@ -44,6 +44,10 @@ QtAlignRightMiddle = Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter
QtAlignRightTop = Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignTop
QtAlignTop = Qt.AlignmentFlag.AlignTop
QtVAlignNormal = QTextCharFormat.VerticalAlignment.AlignNormal
QtVAlignSub = QTextCharFormat.VerticalAlignment.AlignSubScript
QtVAlignSuper = QTextCharFormat.VerticalAlignment.AlignSuperScript
# Qt Page Break
QtPageBreakBefore = QTextFormat.PageBreakFlag.PageBreak_AlwaysBefore