mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 13:59:52 +08:00
add VStyleParser as a wrapper of pmh_styleparser
Use VStyleParser to read .mdhl style file for markdown highlighting. Signed-off-by: Le Tan <tamlokveer@gmail.com>
This commit is contained in:
parent
33f62915e1
commit
d22f0124d3
@ -29,7 +29,9 @@ SOURCES += main.cpp\
|
|||||||
utils/vutils.cpp \
|
utils/vutils.cpp \
|
||||||
vpreviewpage.cpp \
|
vpreviewpage.cpp \
|
||||||
utils/peg-highlight/pmh_parser.c \
|
utils/peg-highlight/pmh_parser.c \
|
||||||
hgmarkdownhighlighter.cpp
|
hgmarkdownhighlighter.cpp \
|
||||||
|
vstyleparser.cpp \
|
||||||
|
utils/peg-highlight/pmh_styleparser.c
|
||||||
|
|
||||||
HEADERS += vmainwindow.h \
|
HEADERS += vmainwindow.h \
|
||||||
vdirectorytree.h \
|
vdirectorytree.h \
|
||||||
@ -49,7 +51,9 @@ HEADERS += vmainwindow.h \
|
|||||||
vpreviewpage.h \
|
vpreviewpage.h \
|
||||||
utils/peg-highlight/pmh_parser.h \
|
utils/peg-highlight/pmh_parser.h \
|
||||||
hgmarkdownhighlighter.h \
|
hgmarkdownhighlighter.h \
|
||||||
utils/peg-highlight/pmh_definitions.h
|
utils/peg-highlight/pmh_definitions.h \
|
||||||
|
vstyleparser.h \
|
||||||
|
utils/peg-highlight/pmh_styleparser.h
|
||||||
|
|
||||||
RESOURCES += \
|
RESOURCES += \
|
||||||
vnote.qrc
|
vnote.qrc
|
||||||
|
@ -18,8 +18,7 @@
|
|||||||
const int WorkerThread::initCapacity = 1024;
|
const int WorkerThread::initCapacity = 1024;
|
||||||
|
|
||||||
WorkerThread::WorkerThread()
|
WorkerThread::WorkerThread()
|
||||||
: QThread(NULL), content(NULL), result(NULL),
|
: QThread(NULL), content(NULL), capacity(0), result(NULL)
|
||||||
capacity(0)
|
|
||||||
{
|
{
|
||||||
resizeBuffer(initCapacity);
|
resizeBuffer(initCapacity);
|
||||||
}
|
}
|
||||||
@ -86,12 +85,14 @@ void WorkerThread::run()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Will be freeed by parent automatically
|
// Will be freeed by parent automatically
|
||||||
HGMarkdownHighlighter::HGMarkdownHighlighter(QTextDocument *parent,
|
HGMarkdownHighlighter::HGMarkdownHighlighter(const QVector<HighlightingStyle> &styles,
|
||||||
|
QTextDocument *parent,
|
||||||
int aWaitInterval) : QObject(parent)
|
int aWaitInterval) : QObject(parent)
|
||||||
{
|
{
|
||||||
workerThread = new WorkerThread();
|
workerThread = new WorkerThread();
|
||||||
cached_elements = NULL;
|
cached_elements = NULL;
|
||||||
waitInterval = aWaitInterval;
|
waitInterval = aWaitInterval;
|
||||||
|
setStyles(styles);
|
||||||
timer = new QTimer(this);
|
timer = new QTimer(this);
|
||||||
timer->setSingleShot(true);
|
timer->setSingleShot(true);
|
||||||
timer->setInterval(aWaitInterval);
|
timer->setInterval(aWaitInterval);
|
||||||
@ -123,63 +124,6 @@ void HGMarkdownHighlighter::setStyles(const QVector<HighlightingStyle> &styles)
|
|||||||
this->highlightingStyles = styles;
|
this->highlightingStyles = styles;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define STY(type, format) styles.append({type, format})
|
|
||||||
|
|
||||||
void HGMarkdownHighlighter::setDefaultStyles()
|
|
||||||
{
|
|
||||||
QVector<HighlightingStyle> &styles = this->highlightingStyles;
|
|
||||||
styles.clear();
|
|
||||||
|
|
||||||
QTextCharFormat headers; headers.setForeground(QBrush(Qt::darkBlue));
|
|
||||||
headers.setBackground(QBrush(QColor(230,230,240)));
|
|
||||||
STY(pmh_H1, headers);
|
|
||||||
STY(pmh_H2, headers);
|
|
||||||
STY(pmh_H3, headers);
|
|
||||||
STY(pmh_H4, headers);
|
|
||||||
STY(pmh_H5, headers);
|
|
||||||
STY(pmh_H6, headers);
|
|
||||||
|
|
||||||
QTextCharFormat hrule; hrule.setForeground(QBrush(Qt::darkGray));
|
|
||||||
hrule.setBackground(QBrush(Qt::lightGray));
|
|
||||||
STY(pmh_HRULE, hrule);
|
|
||||||
|
|
||||||
QTextCharFormat list; list.setForeground(QBrush(Qt::magenta));
|
|
||||||
STY(pmh_LIST_BULLET, list);
|
|
||||||
STY(pmh_LIST_ENUMERATOR, list);
|
|
||||||
|
|
||||||
QTextCharFormat link; link.setForeground(QBrush(Qt::darkCyan));
|
|
||||||
link.setBackground(QBrush(QColor(205,240,240)));
|
|
||||||
STY(pmh_LINK, link);
|
|
||||||
STY(pmh_AUTO_LINK_URL, link);
|
|
||||||
STY(pmh_AUTO_LINK_EMAIL, link);
|
|
||||||
|
|
||||||
QTextCharFormat image; image.setForeground(QBrush(Qt::darkCyan));
|
|
||||||
image.setBackground(QBrush(Qt::cyan));
|
|
||||||
STY(pmh_IMAGE, image);
|
|
||||||
|
|
||||||
QTextCharFormat ref; ref.setForeground(QBrush(QColor(213,178,178)));
|
|
||||||
STY(pmh_REFERENCE, ref);
|
|
||||||
|
|
||||||
QTextCharFormat code; code.setForeground(QBrush(Qt::darkGreen));
|
|
||||||
code.setBackground(QBrush(QColor(217,231,217)));
|
|
||||||
STY(pmh_CODE, code);
|
|
||||||
STY(pmh_VERBATIM, code);
|
|
||||||
|
|
||||||
QTextCharFormat emph; emph.setForeground(QBrush(Qt::darkYellow));
|
|
||||||
emph.setFontItalic(true);
|
|
||||||
STY(pmh_EMPH, emph);
|
|
||||||
|
|
||||||
QTextCharFormat strong; strong.setForeground(QBrush(Qt::magenta));
|
|
||||||
strong.setFontWeight(QFont::Bold);
|
|
||||||
STY(pmh_STRONG, strong);
|
|
||||||
|
|
||||||
QTextCharFormat comment; comment.setForeground(QBrush(Qt::gray));
|
|
||||||
STY(pmh_COMMENT, comment);
|
|
||||||
|
|
||||||
QTextCharFormat blockquote; blockquote.setForeground(QBrush(Qt::darkRed));
|
|
||||||
STY(pmh_BLOCKQUOTE, blockquote);
|
|
||||||
}
|
|
||||||
|
|
||||||
void HGMarkdownHighlighter::clearFormatting()
|
void HGMarkdownHighlighter::clearFormatting()
|
||||||
{
|
{
|
||||||
QTextBlock block = document->firstBlock();
|
QTextBlock block = document->firstBlock();
|
||||||
@ -195,8 +139,10 @@ void HGMarkdownHighlighter::highlight()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (highlightingStyles.isEmpty())
|
if (highlightingStyles.isEmpty()) {
|
||||||
this->setDefaultStyles();
|
qWarning() << "error: HighlightingStyles is not set";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this->clearFormatting();
|
this->clearFormatting();
|
||||||
|
|
||||||
|
@ -52,7 +52,8 @@ class HGMarkdownHighlighter : public QObject
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
HGMarkdownHighlighter(QTextDocument *parent = 0, int aWaitInterval = 2000);
|
HGMarkdownHighlighter(const QVector<HighlightingStyle> &styles,
|
||||||
|
QTextDocument *parent = 0, int aWaitInterval = 2000);
|
||||||
~HGMarkdownHighlighter();
|
~HGMarkdownHighlighter();
|
||||||
void setStyles(const QVector<HighlightingStyle> &styles);
|
void setStyles(const QVector<HighlightingStyle> &styles);
|
||||||
int waitInterval;
|
int waitInterval;
|
||||||
@ -73,7 +74,6 @@ private:
|
|||||||
void clearFormatting();
|
void clearFormatting();
|
||||||
void highlight();
|
void highlight();
|
||||||
void parse();
|
void parse();
|
||||||
void setDefaultStyles();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
79
resources/styles/default.mdhl
Normal file
79
resources/styles/default.mdhl
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
# This is the default markdown styles used for Peg-Markdown-Highlight
|
||||||
|
# Created by Le Tan (tamlokveer@gmail.com)
|
||||||
|
|
||||||
|
H1
|
||||||
|
foreground: 111111
|
||||||
|
font-style: bold
|
||||||
|
font-size: +12
|
||||||
|
|
||||||
|
H2
|
||||||
|
foreground: 111111
|
||||||
|
font-style: bold
|
||||||
|
font-size: +10
|
||||||
|
|
||||||
|
H3
|
||||||
|
foreground: 111111
|
||||||
|
font-style: bold
|
||||||
|
font-size: +8
|
||||||
|
|
||||||
|
H4
|
||||||
|
foreground: 111111
|
||||||
|
font-size: +6
|
||||||
|
|
||||||
|
H5
|
||||||
|
foreground: 111111
|
||||||
|
font-size: +4
|
||||||
|
|
||||||
|
H6
|
||||||
|
foreground: 111111
|
||||||
|
font-size: +2
|
||||||
|
|
||||||
|
HRULE
|
||||||
|
foreground: 586e75
|
||||||
|
|
||||||
|
LIST_BULLET
|
||||||
|
foreground: d33682
|
||||||
|
font-style: bold
|
||||||
|
font-size: +2
|
||||||
|
|
||||||
|
LIST_ENUMERATOR
|
||||||
|
foreground: 0000ff
|
||||||
|
|
||||||
|
LINK
|
||||||
|
foreground: 2aa198
|
||||||
|
|
||||||
|
AUTO_LINK_URL
|
||||||
|
foreground: 2aa198
|
||||||
|
|
||||||
|
AUTO_LINK_EMAIL
|
||||||
|
foreground: 2aa198
|
||||||
|
|
||||||
|
IMAGE
|
||||||
|
foreground: d33682
|
||||||
|
|
||||||
|
REFERENCE
|
||||||
|
foreground: b58900
|
||||||
|
|
||||||
|
CODE
|
||||||
|
foreground: 5f00ff
|
||||||
|
|
||||||
|
EMPH
|
||||||
|
font-style: italic
|
||||||
|
|
||||||
|
STRONG
|
||||||
|
font-style: bold
|
||||||
|
|
||||||
|
HTML_ENTITY
|
||||||
|
foreground: 6c71c4
|
||||||
|
|
||||||
|
COMMENT
|
||||||
|
foreground: 93a1a1
|
||||||
|
|
||||||
|
VERBATIM
|
||||||
|
foreground: 859900
|
||||||
|
|
||||||
|
BLOCKQUOTE
|
||||||
|
foreground: 00af00
|
||||||
|
|
||||||
|
STRIKE
|
||||||
|
strike-color: 586e75
|
79
resources/styles/solarized-dark.mdhl
Normal file
79
resources/styles/solarized-dark.mdhl
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
# Styles using 'Solarized' color scheme
|
||||||
|
# by Ethan Schoonover: http://ethanschoonover.com/solarized
|
||||||
|
#
|
||||||
|
# (dark background version)
|
||||||
|
|
||||||
|
editor
|
||||||
|
foreground: 93a1a1 # base1
|
||||||
|
background: 002b36 # base03
|
||||||
|
caret: ffffff
|
||||||
|
|
||||||
|
H1
|
||||||
|
foreground: 6c71c4 # violet
|
||||||
|
font-style: bold
|
||||||
|
|
||||||
|
H2
|
||||||
|
foreground: 6c71c4 # violet
|
||||||
|
font-style: bold
|
||||||
|
|
||||||
|
H3
|
||||||
|
foreground: 6c71c4 # violet
|
||||||
|
|
||||||
|
H4
|
||||||
|
foreground: 268bd2 # blue
|
||||||
|
|
||||||
|
H5
|
||||||
|
foreground: 268bd2 # blue
|
||||||
|
|
||||||
|
H6
|
||||||
|
foreground: 268bd2 # blue
|
||||||
|
|
||||||
|
HRULE
|
||||||
|
foreground: 586e75 # base01
|
||||||
|
|
||||||
|
LIST_BULLET
|
||||||
|
foreground: b58900 # yellow
|
||||||
|
|
||||||
|
LIST_ENUMERATOR
|
||||||
|
foreground: b58900 # yellow
|
||||||
|
|
||||||
|
LINK
|
||||||
|
foreground: 2aa198 # cyan
|
||||||
|
|
||||||
|
AUTO_LINK_URL
|
||||||
|
foreground: 2aa198 # cyan
|
||||||
|
|
||||||
|
AUTO_LINK_EMAIL
|
||||||
|
foreground: 2aa198 # cyan
|
||||||
|
|
||||||
|
IMAGE
|
||||||
|
foreground: d33682 # magenta
|
||||||
|
|
||||||
|
REFERENCE
|
||||||
|
foreground: 80b58900 # yellow, reduced alpha
|
||||||
|
|
||||||
|
CODE
|
||||||
|
foreground: 859900 # green
|
||||||
|
|
||||||
|
EMPH
|
||||||
|
foreground: cb4b16 # orange
|
||||||
|
font-style: italic
|
||||||
|
|
||||||
|
STRONG
|
||||||
|
foreground: dc322f # red
|
||||||
|
font-style: bold
|
||||||
|
|
||||||
|
HTML_ENTITY
|
||||||
|
foreground: 6c71c4 # violet
|
||||||
|
|
||||||
|
COMMENT
|
||||||
|
foreground: 93a1a1 # base1
|
||||||
|
|
||||||
|
VERBATIM
|
||||||
|
foreground: 859900 # green
|
||||||
|
|
||||||
|
BLOCKQUOTE
|
||||||
|
foreground: d33682 # magenta
|
||||||
|
|
||||||
|
STRIKE
|
||||||
|
strike-color: 93a1a1 # base1
|
80
resources/styles/solarized-light.mdhl
Normal file
80
resources/styles/solarized-light.mdhl
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
# Styles using 'Solarized' color scheme
|
||||||
|
# by Ethan Schoonover: http://ethanschoonover.com/solarized
|
||||||
|
#
|
||||||
|
# (light background version)
|
||||||
|
|
||||||
|
editor
|
||||||
|
foreground: 586e75 # base01
|
||||||
|
background: fdf6e3 # base3
|
||||||
|
caret: 000000
|
||||||
|
|
||||||
|
H1
|
||||||
|
foreground: 6c71c4 # violet
|
||||||
|
font-style: bold
|
||||||
|
|
||||||
|
H2
|
||||||
|
foreground: 6c71c4 # violet
|
||||||
|
font-style: bold
|
||||||
|
|
||||||
|
H3
|
||||||
|
foreground: 6c71c4 # violet
|
||||||
|
|
||||||
|
H4
|
||||||
|
foreground: 268bd2 # blue
|
||||||
|
|
||||||
|
H5
|
||||||
|
foreground: 268bd2 # blue
|
||||||
|
|
||||||
|
H6
|
||||||
|
foreground: 268bd2 # blue
|
||||||
|
|
||||||
|
HRULE
|
||||||
|
foreground: 586e75 # base01
|
||||||
|
|
||||||
|
LIST_BULLET
|
||||||
|
foreground: b58900 # yellow
|
||||||
|
|
||||||
|
LIST_ENUMERATOR
|
||||||
|
foreground: b58900 # yellow
|
||||||
|
|
||||||
|
LINK
|
||||||
|
foreground: 2aa198 # cyan
|
||||||
|
|
||||||
|
AUTO_LINK_URL
|
||||||
|
foreground: 2aa198 # cyan
|
||||||
|
|
||||||
|
AUTO_LINK_EMAIL
|
||||||
|
foreground: 2aa198 # cyan
|
||||||
|
|
||||||
|
IMAGE
|
||||||
|
foreground: d33682 # magenta
|
||||||
|
|
||||||
|
REFERENCE
|
||||||
|
foreground: 80b58900 # yellow, reduced alpha
|
||||||
|
|
||||||
|
CODE
|
||||||
|
foreground: 859900 # green
|
||||||
|
|
||||||
|
EMPH
|
||||||
|
foreground: cb4b16 # orange
|
||||||
|
font-style: italic
|
||||||
|
|
||||||
|
STRONG
|
||||||
|
foreground: dc322f # red
|
||||||
|
font-style: bold
|
||||||
|
|
||||||
|
HTML_ENTITY
|
||||||
|
foreground: 6c71c4 # violet
|
||||||
|
|
||||||
|
COMMENT
|
||||||
|
foreground: 93a1a1 # base1
|
||||||
|
|
||||||
|
VERBATIM
|
||||||
|
foreground: 859900 # green
|
||||||
|
|
||||||
|
BLOCKQUOTE
|
||||||
|
foreground: d33682 # magenta
|
||||||
|
|
||||||
|
STRIKE
|
||||||
|
strike-color: 586e75 # base01
|
||||||
|
|
@ -6,12 +6,33 @@
|
|||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
#include <QJsonDocument>
|
#include <QJsonDocument>
|
||||||
#include <QtDebug>
|
#include <QtDebug>
|
||||||
|
#include <QTextEdit>
|
||||||
|
#include "utils/vutils.h"
|
||||||
|
#include "vstyleparser.h"
|
||||||
|
|
||||||
const QString VConfigManager::dirConfigFileName = QString(".vnote.json");
|
const QString VConfigManager::dirConfigFileName = QString(".vnote.json");
|
||||||
|
VConfigManager* VConfigManager::instance = NULL;
|
||||||
|
|
||||||
VConfigManager::VConfigManager()
|
VConfigManager::VConfigManager()
|
||||||
|
: baseEditFont(QFont())
|
||||||
{
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
VConfigManager* VConfigManager::getInst()
|
||||||
|
{
|
||||||
|
if (!instance) {
|
||||||
|
instance = new VConfigManager();
|
||||||
|
instance->initialize();
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VConfigManager::initialize()
|
||||||
|
{
|
||||||
|
baseEditFont.setPointSize(11);
|
||||||
|
baseEditPalette = QTextEdit().palette();
|
||||||
|
|
||||||
|
updateMarkdownEditStyle();
|
||||||
}
|
}
|
||||||
|
|
||||||
QJsonObject VConfigManager::readDirectoryConfig(const QString &path)
|
QJsonObject VConfigManager::readDirectoryConfig(const QString &path)
|
||||||
@ -60,3 +81,19 @@ bool VConfigManager::deleteDirectoryConfig(const QString &path)
|
|||||||
qDebug() << "delete config file:" << configFile;
|
qDebug() << "delete config file:" << configFile;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VConfigManager::updateMarkdownEditStyle()
|
||||||
|
{
|
||||||
|
// Read style file .mdhl
|
||||||
|
QString file(":/resources/styles/default.mdhl");
|
||||||
|
|
||||||
|
QString styleStr = VUtils::readFileFromDisk(file);
|
||||||
|
if (styleStr.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
VStyleParser parser;
|
||||||
|
parser.parseMarkdownStyle(styleStr);
|
||||||
|
mdHighlightingStyles = parser.fetchMarkdownStyles(baseEditFont);
|
||||||
|
mdEditPalette = parser.fetchMarkdownEditorStyles(baseEditPalette);
|
||||||
|
}
|
||||||
|
@ -1,22 +1,39 @@
|
|||||||
#ifndef VCONFIGMANAGER_H
|
#ifndef VCONFIGMANAGER_H
|
||||||
#define VCONFIGMANAGER_H
|
#define VCONFIGMANAGER_H
|
||||||
|
|
||||||
|
#include <QFont>
|
||||||
|
#include <QPalette>
|
||||||
|
#include <QVector>
|
||||||
|
|
||||||
|
#include "hgmarkdownhighlighter.h"
|
||||||
|
|
||||||
class QJsonObject;
|
class QJsonObject;
|
||||||
class QString;
|
class QString;
|
||||||
|
|
||||||
|
#define VConfigInst VConfigManager::getInst()
|
||||||
|
|
||||||
class VConfigManager
|
class VConfigManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
VConfigManager();
|
static VConfigManager *getInst();
|
||||||
|
|
||||||
// Read config from the directory config json file into a QJsonObject
|
// Read config from the directory config json file into a QJsonObject
|
||||||
static QJsonObject readDirectoryConfig(const QString &path);
|
static QJsonObject readDirectoryConfig(const QString &path);
|
||||||
static bool writeDirectoryConfig(const QString &path, const QJsonObject &configJson);
|
static bool writeDirectoryConfig(const QString &path, const QJsonObject &configJson);
|
||||||
static bool deleteDirectoryConfig(const QString &path);
|
static bool deleteDirectoryConfig(const QString &path);
|
||||||
|
|
||||||
|
void updateMarkdownEditStyle();
|
||||||
|
|
||||||
|
QFont baseEditFont;
|
||||||
|
QPalette baseEditPalette;
|
||||||
|
QPalette mdEditPalette;
|
||||||
|
QVector<HighlightingStyle> mdHighlightingStyles;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
VConfigManager();
|
||||||
|
void initialize();
|
||||||
// The name of the config file in each directory
|
// The name of the config file in each directory
|
||||||
static const QString dirConfigFileName;
|
static const QString dirConfigFileName;
|
||||||
|
static VConfigManager *instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // VCONFIGMANAGER_H
|
#endif // VCONFIGMANAGER_H
|
||||||
|
@ -1,11 +1,15 @@
|
|||||||
#include <QtWidgets>
|
#include <QtWidgets>
|
||||||
#include "vedit.h"
|
#include "vedit.h"
|
||||||
#include "vnote.h"
|
#include "vnote.h"
|
||||||
|
#include "vconfigmanager.h"
|
||||||
|
|
||||||
VEdit::VEdit(VNoteFile *noteFile, QWidget *parent)
|
VEdit::VEdit(VNoteFile *noteFile, QWidget *parent)
|
||||||
: QTextEdit(parent), noteFile(noteFile)
|
: QTextEdit(parent), noteFile(noteFile)
|
||||||
{
|
{
|
||||||
setFont(VNote::editorAndBrowserFont);
|
setFont(VConfigInst->baseEditFont);
|
||||||
|
if (noteFile->docType == DocType::Markdown) {
|
||||||
|
setPalette(VConfigInst->mdEditPalette);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VEdit::beginEdit()
|
void VEdit::beginEdit()
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include "utils/vutils.h"
|
#include "utils/vutils.h"
|
||||||
#include "vpreviewpage.h"
|
#include "vpreviewpage.h"
|
||||||
#include "hgmarkdownhighlighter.h"
|
#include "hgmarkdownhighlighter.h"
|
||||||
|
#include "vconfigmanager.h"
|
||||||
|
|
||||||
VEditor::VEditor(const QString &path, const QString &name, bool modifiable,
|
VEditor::VEditor(const QString &path, const QString &name, bool modifiable,
|
||||||
QWidget *parent)
|
QWidget *parent)
|
||||||
@ -43,13 +44,14 @@ void VEditor::setupUI()
|
|||||||
setupMarkdownPreview();
|
setupMarkdownPreview();
|
||||||
textBrowser = NULL;
|
textBrowser = NULL;
|
||||||
|
|
||||||
mdHighlighter = new HGMarkdownHighlighter(textEditor->document(), 500);
|
mdHighlighter = new HGMarkdownHighlighter(VConfigInst->mdHighlightingStyles,
|
||||||
|
textEditor->document(), 500);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DocType::Html:
|
case DocType::Html:
|
||||||
textBrowser = new QTextBrowser();
|
textBrowser = new QTextBrowser();
|
||||||
addWidget(textBrowser);
|
addWidget(textBrowser);
|
||||||
textBrowser->setFont(VNote::editorAndBrowserFont);
|
textBrowser->setFont(VConfigInst->baseEditFont);
|
||||||
webPreviewer = NULL;
|
webPreviewer = NULL;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -4,10 +4,12 @@
|
|||||||
#include "vnote.h"
|
#include "vnote.h"
|
||||||
#include "vfilelist.h"
|
#include "vfilelist.h"
|
||||||
#include "vtabwidget.h"
|
#include "vtabwidget.h"
|
||||||
|
#include "vconfigmanager.h"
|
||||||
|
|
||||||
VMainWindow::VMainWindow(QWidget *parent)
|
VMainWindow::VMainWindow(QWidget *parent)
|
||||||
: QMainWindow(parent)
|
: QMainWindow(parent)
|
||||||
{
|
{
|
||||||
|
VConfigInst;
|
||||||
setupUI();
|
setupUI();
|
||||||
initActions();
|
initActions();
|
||||||
initToolBar();
|
initToolBar();
|
||||||
|
@ -13,13 +13,11 @@ const QString VNote::defaultCssUrl = QString("qrc:/resources/markdown.css");
|
|||||||
|
|
||||||
QString VNote::templateHtml;
|
QString VNote::templateHtml;
|
||||||
QString VNote::cssUrl = VNote::defaultCssUrl;
|
QString VNote::cssUrl = VNote::defaultCssUrl;
|
||||||
QFont VNote::editorAndBrowserFont;
|
|
||||||
|
|
||||||
VNote::VNote()
|
VNote::VNote()
|
||||||
: curNotebookIndex(0)
|
: curNotebookIndex(0)
|
||||||
{
|
{
|
||||||
decorateTemplate();
|
decorateTemplate();
|
||||||
editorAndBrowserFont.setPointSize(11);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VNote::decorateTemplate()
|
void VNote::decorateTemplate()
|
||||||
|
1
vnote.h
1
vnote.h
@ -26,7 +26,6 @@ public:
|
|||||||
static const QString templatePath;
|
static const QString templatePath;
|
||||||
|
|
||||||
static QString templateHtml;
|
static QString templateHtml;
|
||||||
static QFont editorAndBrowserFont;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Write notebooks section of global config
|
// Write notebooks section of global config
|
||||||
|
@ -32,5 +32,8 @@
|
|||||||
<file>utils/highlightjs/styles/tomorrow-night-eighties.css</file>
|
<file>utils/highlightjs/styles/tomorrow-night-eighties.css</file>
|
||||||
<file>utils/highlightjs/styles/tomorrow-night.css</file>
|
<file>utils/highlightjs/styles/tomorrow-night.css</file>
|
||||||
<file>utils/highlightjs/styles/tomorrow.css</file>
|
<file>utils/highlightjs/styles/tomorrow.css</file>
|
||||||
|
<file>resources/styles/default.mdhl</file>
|
||||||
|
<file>resources/styles/solarized-light.mdhl</file>
|
||||||
|
<file>resources/styles/solarized-dark.mdhl</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
174
vstyleparser.cpp
Normal file
174
vstyleparser.cpp
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
#include "vstyleparser.h"
|
||||||
|
|
||||||
|
#include <QFont>
|
||||||
|
#include <QPalette>
|
||||||
|
#include <QTextEdit>
|
||||||
|
#include <QColor>
|
||||||
|
#include <QBrush>
|
||||||
|
#include <QVector>
|
||||||
|
#include <QtDebug>
|
||||||
|
|
||||||
|
VStyleParser::VStyleParser()
|
||||||
|
{
|
||||||
|
markdownStyles = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
VStyleParser::~VStyleParser()
|
||||||
|
{
|
||||||
|
if (markdownStyles) {
|
||||||
|
pmh_free_style_collection(markdownStyles);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QColor VStyleParser::QColorFromPmhAttr(pmh_attr_argb_color *attr) const
|
||||||
|
{
|
||||||
|
return QColor(attr->red, attr->green, attr->blue, attr->alpha);
|
||||||
|
}
|
||||||
|
|
||||||
|
QBrush VStyleParser::QBrushFromPmhAttr(pmh_attr_argb_color *attr) const
|
||||||
|
{
|
||||||
|
return QBrush(QColorFromPmhAttr(attr));
|
||||||
|
}
|
||||||
|
|
||||||
|
void markdownStyleErrorCB(char *errMsg, int lineNr, void *context)
|
||||||
|
{
|
||||||
|
(void)context;
|
||||||
|
qDebug() << "parser error:" << errMsg << lineNr;
|
||||||
|
}
|
||||||
|
|
||||||
|
QTextCharFormat VStyleParser::QTextCharFormatFromAttrs(pmh_style_attribute *attrs,
|
||||||
|
const QFont &baseFont) const
|
||||||
|
{
|
||||||
|
QTextCharFormat format;
|
||||||
|
while (attrs) {
|
||||||
|
switch (attrs->type) {
|
||||||
|
case pmh_attr_type_foreground_color:
|
||||||
|
format.setForeground(QBrushFromPmhAttr(attrs->value->argb_color));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case pmh_attr_type_background_color:
|
||||||
|
format.setBackground(QBrushFromPmhAttr(attrs->value->argb_color));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case pmh_attr_type_font_size_pt:
|
||||||
|
{
|
||||||
|
pmh_attr_font_size *fontSize = attrs->value->font_size;
|
||||||
|
int ptSize = fontSize->size_pt;
|
||||||
|
if (fontSize->is_relative) {
|
||||||
|
int basePtSize = baseFont.pointSize();
|
||||||
|
if (basePtSize == -1) {
|
||||||
|
// In pixel. Use default font configuration.
|
||||||
|
basePtSize = 11;
|
||||||
|
}
|
||||||
|
ptSize += basePtSize;
|
||||||
|
}
|
||||||
|
if (ptSize > 0) {
|
||||||
|
format.setFontPointSize(ptSize);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case pmh_attr_type_font_family:
|
||||||
|
// TODO
|
||||||
|
break;
|
||||||
|
|
||||||
|
case pmh_attr_type_font_style:
|
||||||
|
{
|
||||||
|
pmh_attr_font_styles *fontStyle = attrs->value->font_styles;
|
||||||
|
if (fontStyle->italic) {
|
||||||
|
format.setFontItalic(true);
|
||||||
|
}
|
||||||
|
if (fontStyle->bold) {
|
||||||
|
format.setFontWeight(QFont::Bold);
|
||||||
|
}
|
||||||
|
if (fontStyle->underlined) {
|
||||||
|
format.setFontUnderline(true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
qWarning() << "warning: unimplemented format attr type:" << attrs->type;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
attrs = attrs->next;
|
||||||
|
}
|
||||||
|
return format;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VStyleParser::parseMarkdownStyle(const QString &styleStr)
|
||||||
|
{
|
||||||
|
if (markdownStyles) {
|
||||||
|
pmh_free_style_collection(markdownStyles);
|
||||||
|
}
|
||||||
|
markdownStyles = pmh_parse_styles(styleStr.toLocal8Bit().data(),
|
||||||
|
&markdownStyleErrorCB, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVector<HighlightingStyle> VStyleParser::fetchMarkdownStyles(const QFont &baseFont) const
|
||||||
|
{
|
||||||
|
QVector<HighlightingStyle> styles(pmh_NUM_LANG_TYPES);
|
||||||
|
|
||||||
|
for (int i = 0; i < pmh_NUM_LANG_TYPES; ++i) {
|
||||||
|
pmh_style_attribute *attr = markdownStyles->element_styles[i];
|
||||||
|
if (!attr) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
styles[i].type = attr->lang_element_type;
|
||||||
|
styles[i].format = QTextCharFormatFromAttrs(attr, baseFont);
|
||||||
|
}
|
||||||
|
return styles;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPalette VStyleParser::fetchMarkdownEditorStyles(const QPalette &basePalette) const
|
||||||
|
{
|
||||||
|
QPalette palette(basePalette);
|
||||||
|
|
||||||
|
// editor
|
||||||
|
pmh_style_attribute *editorStyles = markdownStyles->editor_styles;
|
||||||
|
while (editorStyles) {
|
||||||
|
switch (editorStyles->type) {
|
||||||
|
case pmh_attr_type_foreground_color:
|
||||||
|
palette.setColor(QPalette::Text,
|
||||||
|
QColorFromPmhAttr(editorStyles->value->argb_color));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case pmh_attr_type_background_color:
|
||||||
|
palette.setColor(QPalette::Base,
|
||||||
|
QColorFromPmhAttr(editorStyles->value->argb_color));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
qWarning() << "warning: unimplemented editor attr type:" << editorStyles->type;
|
||||||
|
}
|
||||||
|
editorStyles = editorStyles->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
// editor-current-line
|
||||||
|
pmh_style_attribute *curLineStyles = markdownStyles->editor_current_line_styles;
|
||||||
|
if (curLineStyles) {
|
||||||
|
qDebug() << "editor-current-line style is not supported";
|
||||||
|
}
|
||||||
|
|
||||||
|
// editor-selection
|
||||||
|
pmh_style_attribute *selStyles = markdownStyles->editor_selection_styles;
|
||||||
|
while (selStyles) {
|
||||||
|
switch (selStyles->type) {
|
||||||
|
case pmh_attr_type_foreground_color:
|
||||||
|
palette.setColor(QPalette::HighlightedText,
|
||||||
|
QColorFromPmhAttr(selStyles->value->argb_color));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case pmh_attr_type_background_color:
|
||||||
|
palette.setColor(QPalette::Highlight,
|
||||||
|
QColorFromPmhAttr(selStyles->value->argb_color));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
qWarning() << "warning: unimplemented selection attr type:" << selStyles->type;
|
||||||
|
}
|
||||||
|
selStyles = selStyles->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return palette;
|
||||||
|
}
|
34
vstyleparser.h
Normal file
34
vstyleparser.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#ifndef VSTYLEPARSER_H
|
||||||
|
#define VSTYLEPARSER_H
|
||||||
|
|
||||||
|
#include <QPalette>
|
||||||
|
#include <QVector>
|
||||||
|
#include "hgmarkdownhighlighter.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "utils/peg-highlight/pmh_definitions.h"
|
||||||
|
#include "utils/peg-highlight/pmh_styleparser.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
class QColor;
|
||||||
|
class QBrush;
|
||||||
|
|
||||||
|
class VStyleParser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
VStyleParser();
|
||||||
|
~VStyleParser();
|
||||||
|
|
||||||
|
void parseMarkdownStyle(const QString &styleStr);
|
||||||
|
QVector<HighlightingStyle> fetchMarkdownStyles(const QFont &baseFont) const;
|
||||||
|
QPalette fetchMarkdownEditorStyles(const QPalette &basePalette) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
QColor QColorFromPmhAttr(pmh_attr_argb_color *attr) const;
|
||||||
|
QBrush QBrushFromPmhAttr(pmh_attr_argb_color *attr) const;
|
||||||
|
QTextCharFormat QTextCharFormatFromAttrs(pmh_style_attribute *attrs,
|
||||||
|
const QFont &baseFont) const;
|
||||||
|
pmh_style_collection *markdownStyles;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // VSTYLEPARSER_H
|
Loading…
x
Reference in New Issue
Block a user