mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Merge branch 'master' of https://github.com/cbhaley/calibre
This commit is contained in:
commit
bccbb2afd1
@ -5,16 +5,17 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
|
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
import sys
|
import os, sys
|
||||||
|
|
||||||
from qt.core import (Qt, QApplication, QStyle, QIcon, QDoubleSpinBox, QStyleOptionViewItem,
|
from qt.core import (Qt, QApplication, QStyle, QIcon, QDoubleSpinBox, QStyleOptionViewItem,
|
||||||
QSpinBox, QStyledItemDelegate, QComboBox, QTextDocument, QMenu, QKeySequence,
|
QSpinBox, QStyledItemDelegate, QComboBox, QTextDocument, QMenu, QKeySequence, QUrl,
|
||||||
QAbstractTextDocumentLayout, QFont, QFontInfo, QDate, QDateTimeEdit, QDateTime, QEvent,
|
QAbstractTextDocumentLayout, QFont, QFontInfo, QDate, QDateTimeEdit, QDateTime, QEvent,
|
||||||
QStyleOptionComboBox, QStyleOptionSpinBox, QLocale, QSize, QLineEdit, QDialog, QPalette)
|
QStyleOptionComboBox, QStyleOptionSpinBox, QLocale, QSize, QLineEdit, QDialog, QPalette)
|
||||||
|
|
||||||
from calibre.ebooks.metadata import rating_to_stars, title_sort
|
from calibre.ebooks.metadata import rating_to_stars, title_sort
|
||||||
from calibre.gui2 import UNDEFINED_QDATETIME, rating_font, gprefs
|
from calibre.gui2 import UNDEFINED_QDATETIME, rating_font, gprefs
|
||||||
from calibre.constants import iswindows
|
from calibre.constants import iswindows
|
||||||
|
from calibre.gui2.markdown_editor import MarkdownEditDialog
|
||||||
from calibre.gui2.widgets import EnLineEdit
|
from calibre.gui2.widgets import EnLineEdit
|
||||||
from calibre.gui2.widgets2 import populate_standard_spinbox_context_menu, RatingEditor, DateTimeEdit as DateTimeEditBase
|
from calibre.gui2.widgets2 import populate_standard_spinbox_context_menu, RatingEditor, DateTimeEdit as DateTimeEditBase
|
||||||
from calibre.gui2.complete2 import EditWithComplete
|
from calibre.gui2.complete2 import EditWithComplete
|
||||||
@ -534,7 +535,14 @@ class CcLongTextDelegate(QStyledItemDelegate): # {{{
|
|||||||
text = ''
|
text = ''
|
||||||
else:
|
else:
|
||||||
text = m.db.data[index.row()][m.custom_columns[col]['rec_index']]
|
text = m.db.data[index.row()][m.custom_columns[col]['rec_index']]
|
||||||
d = PlainTextDialog(parent, text, column_name=m.custom_columns[col]['name'])
|
column_format = m.custom_columns[m.column_map[index.column()]]['display'].get('interpret_as')
|
||||||
|
if column_format == 'markdown':
|
||||||
|
path = m.db.abspath(index.row(), index_is_id=False)
|
||||||
|
base_url = QUrl.fromLocalFile(os.path.join(path, 'metadata.html')) if path else None
|
||||||
|
d = MarkdownEditDialog(parent, text, column_name=m.custom_columns[col]['name'],
|
||||||
|
base_url=base_url)
|
||||||
|
else:
|
||||||
|
d = PlainTextDialog(parent, text, column_name=m.custom_columns[col]['name'])
|
||||||
if d.exec() == QDialog.DialogCode.Accepted:
|
if d.exec() == QDialog.DialogCode.Accepted:
|
||||||
m.setData(index, d.text, Qt.ItemDataRole.EditRole)
|
m.setData(index, d.text, Qt.ItemDataRole.EditRole)
|
||||||
return None
|
return None
|
||||||
|
@ -3,13 +3,14 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
from qt.core import (
|
from qt.core import (
|
||||||
QPlainTextEdit, Qt, QTabWidget, QUrl, QVBoxLayout, QWidget, pyqtSignal,
|
QDialog, QDialogButtonBox, QPlainTextEdit, QSize, Qt, QTabWidget, QUrl,
|
||||||
|
QVBoxLayout, QWidget, pyqtSignal,
|
||||||
)
|
)
|
||||||
|
|
||||||
from calibre.gui2 import safe_open_url
|
from calibre.gui2 import safe_open_url, gprefs
|
||||||
from calibre.gui2.book_details import css
|
from calibre.gui2.book_details import css
|
||||||
from calibre.gui2.widgets2 import HTMLDisplay
|
from calibre.gui2.widgets2 import HTMLDisplay
|
||||||
from calibre.library.comments import markdown
|
from calibre.library.comments import markdown as get_markdown
|
||||||
|
|
||||||
|
|
||||||
class Preview(HTMLDisplay):
|
class Preview(HTMLDisplay):
|
||||||
@ -42,6 +43,56 @@ class MarkdownEdit(QPlainTextEdit):
|
|||||||
m.exec(ev.globalPos())
|
m.exec(ev.globalPos())
|
||||||
|
|
||||||
|
|
||||||
|
class MarkdownEditDialog(QDialog):
|
||||||
|
|
||||||
|
def __init__(self, parent, text, column_name=None, base_url=None):
|
||||||
|
QDialog.__init__(self, parent)
|
||||||
|
self.setObjectName("MarkdownEditDialog")
|
||||||
|
self.setWindowTitle(_("Edit markdown"))
|
||||||
|
self.verticalLayout = l = QVBoxLayout(self)
|
||||||
|
self.textbox = editor = Editor(self)
|
||||||
|
editor.set_base_url(base_url)
|
||||||
|
self.buttonBox = bb = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel, self)
|
||||||
|
bb.accepted.connect(self.accept)
|
||||||
|
bb.rejected.connect(self.reject)
|
||||||
|
l.addWidget(editor)
|
||||||
|
l.addWidget(bb)
|
||||||
|
# Remove help icon on title bar
|
||||||
|
icon = self.windowIcon()
|
||||||
|
self.setWindowFlags(self.windowFlags()&(~Qt.WindowType.WindowContextHelpButtonHint))
|
||||||
|
self.setWindowIcon(icon)
|
||||||
|
|
||||||
|
self.textbox.markdown =text
|
||||||
|
# self.textbox.wyswyg_dirtied()
|
||||||
|
|
||||||
|
if column_name:
|
||||||
|
self.setWindowTitle(_('Edit "{0}"').format(column_name))
|
||||||
|
self.restore_geometry(gprefs, 'markdown_edit_dialog_geom')
|
||||||
|
|
||||||
|
def sizeHint(self):
|
||||||
|
return QSize(650, 600)
|
||||||
|
|
||||||
|
def accept(self):
|
||||||
|
self.save_geometry(gprefs, 'markdown_edit_dialog_geom')
|
||||||
|
QDialog.accept(self)
|
||||||
|
|
||||||
|
def reject(self):
|
||||||
|
self.save_geometry(gprefs, 'markdown_edit_dialog_geom')
|
||||||
|
QDialog.reject(self)
|
||||||
|
|
||||||
|
def closeEvent(self, ev):
|
||||||
|
self.save_geometry(gprefs, 'markdown_edit_dialog_geom')
|
||||||
|
return QDialog.closeEvent(self, ev)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def text(self):
|
||||||
|
return self.textbox.markdown
|
||||||
|
|
||||||
|
@text.setter
|
||||||
|
def text(self, val):
|
||||||
|
self.textbox.markdown = val or ''
|
||||||
|
|
||||||
|
|
||||||
class Editor(QWidget): # {{{
|
class Editor(QWidget): # {{{
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
@ -90,7 +141,7 @@ class Editor(QWidget): # {{{
|
|||||||
self.update_preview()
|
self.update_preview()
|
||||||
|
|
||||||
def update_preview(self):
|
def update_preview(self):
|
||||||
html = markdown(self.editor.toPlainText().strip())
|
html = get_markdown(self.editor.toPlainText().strip())
|
||||||
val = f'''\
|
val = f'''\
|
||||||
<html>
|
<html>
|
||||||
<head></head>
|
<head></head>
|
||||||
|
@ -237,13 +237,13 @@ class MarkdownHighlighter(QSyntaxHighlighter):
|
|||||||
prevAscii = str(prev.replace('\u2029','\n'))
|
prevAscii = str(prev.replace('\u2029','\n'))
|
||||||
if prevAscii.strip():
|
if prevAscii.strip():
|
||||||
#print "Its a header"
|
#print "Its a header"
|
||||||
prevCursor.select(QTextCursor.LineUnderCursor)
|
prevCursor.select(QTextCursor.SelectionType.LineUnderCursor)
|
||||||
#prevCursor.setCharFormat(self.MARKDOWN_KWS_FORMAT['Header'])
|
#prevCursor.setCharFormat(self.MARKDOWN_KWS_FORMAT['Header'])
|
||||||
formatRange = QTextLayout.FormatRange()
|
formatRange = QTextLayout.FormatRange()
|
||||||
formatRange.format = self.MARKDOWN_KWS_FORMAT['Header']
|
formatRange.format = self.MARKDOWN_KWS_FORMAT['Header']
|
||||||
formatRange.length = prevCursor.block().length()
|
formatRange.length = prevCursor.block().length()
|
||||||
formatRange.start = 0
|
formatRange.start = 0
|
||||||
prevCursor.block().layout().setAdditionalFormats([formatRange])
|
prevCursor.block().layout().setFormats([formatRange])
|
||||||
self.setFormat(mo.start()+strt, mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['HR'])
|
self.setFormat(mo.start()+strt, mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['HR'])
|
||||||
|
|
||||||
for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['eHR'],text):
|
for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['eHR'],text):
|
||||||
@ -253,13 +253,13 @@ class MarkdownHighlighter(QSyntaxHighlighter):
|
|||||||
prevAscii = str(prev.replace('\u2029','\n'))
|
prevAscii = str(prev.replace('\u2029','\n'))
|
||||||
if prevAscii.strip():
|
if prevAscii.strip():
|
||||||
#print "Its a header"
|
#print "Its a header"
|
||||||
prevCursor.select(QTextCursor.LineUnderCursor)
|
prevCursor.select(QTextCursor.SelectionType.LineUnderCursor)
|
||||||
#prevCursor.setCharFormat(self.MARKDOWN_KWS_FORMAT['Header'])
|
#prevCursor.setCharFormat(self.MARKDOWN_KWS_FORMAT['Header'])
|
||||||
formatRange = QTextLayout.FormatRange()
|
formatRange = QTextLayout.FormatRange()
|
||||||
formatRange.format = self.MARKDOWN_KWS_FORMAT['Header']
|
formatRange.format = self.MARKDOWN_KWS_FORMAT['Header']
|
||||||
formatRange.length = prevCursor.block().length()
|
formatRange.length = prevCursor.block().length()
|
||||||
formatRange.start = 0
|
formatRange.start = 0
|
||||||
prevCursor.block().layout().setAdditionalFormats([formatRange])
|
prevCursor.block().layout().setFormats([formatRange])
|
||||||
self.setFormat(mo.start()+strt, mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['HR'])
|
self.setFormat(mo.start()+strt, mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['HR'])
|
||||||
return found
|
return found
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user