MarkdownView: исправлен делегат и парсинг блоков
- Repeater delegate: убраны required property, заменены на property string blockType: model.type || "" и т.д. для html/code блоков (иначе QML Cannot create delegate когда у html нет codeId) - parseBlocks тест в mdparser_test.cpp: проверка 3 блоков (html/code/html) и highlighted - Убран console.log из MarkdownView::update
This commit is contained in:
+14
-17
@@ -17,7 +17,6 @@ Item {
|
|||||||
// Триггерим пересборку блоков
|
// Триггерим пересборку блоков
|
||||||
blocksModel.clear()
|
blocksModel.clear()
|
||||||
const blocks = mdParser.parseBlocks(markdown, vaultRoot, fileDir)
|
const blocks = mdParser.parseBlocks(markdown, vaultRoot, fileDir)
|
||||||
// console.log("MarkdownView update", markdown.length, blocks.length)
|
|
||||||
for (let i = 0; i < blocks.length; i++) {
|
for (let i = 0; i < blocks.length; i++) {
|
||||||
blocksModel.append(blocks[i])
|
blocksModel.append(blocks[i])
|
||||||
}
|
}
|
||||||
@@ -35,30 +34,28 @@ Item {
|
|||||||
|
|
||||||
Column {
|
Column {
|
||||||
id: column
|
id: column
|
||||||
width: parent.width
|
|
||||||
spacing: 8
|
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.margins: 12
|
anchors.margins: 12
|
||||||
|
spacing: 8
|
||||||
|
|
||||||
Repeater {
|
Repeater {
|
||||||
model: blocksModel
|
model: blocksModel
|
||||||
delegate: Item {
|
delegate: Item {
|
||||||
required property int index
|
|
||||||
required property string type
|
|
||||||
required property string html
|
|
||||||
required property string code
|
|
||||||
required property string language
|
|
||||||
required property string codeId
|
|
||||||
required property string highlighted
|
|
||||||
width: parent.width
|
width: parent.width
|
||||||
height: childrenRect.height
|
height: childrenRect.height
|
||||||
|
property string blockType: model.type || ""
|
||||||
|
property string blockHtml: model.html || ""
|
||||||
|
property string blockCode: model.code || ""
|
||||||
|
property string blockLang: model.language || "text"
|
||||||
|
property string blockCodeId: model.codeId || ""
|
||||||
|
property string blockHighlighted: model.highlighted || ""
|
||||||
// HTML block
|
// HTML block
|
||||||
Text {
|
Text {
|
||||||
visible: type === "html" && html
|
visible: blockType === "html" && blockHtml
|
||||||
width: parent.width
|
width: parent.width
|
||||||
text: html || ""
|
text: blockHtml
|
||||||
textFormat: Text.RichText
|
textFormat: Text.RichText
|
||||||
wrapMode: Text.Wrap
|
wrapMode: Text.Wrap
|
||||||
color: Theme.text
|
color: Theme.text
|
||||||
@@ -68,12 +65,12 @@ Item {
|
|||||||
}
|
}
|
||||||
// Code block - separate component
|
// Code block - separate component
|
||||||
CodeBlock {
|
CodeBlock {
|
||||||
visible: type === "code"
|
visible: blockType === "code"
|
||||||
width: parent.width
|
width: parent.width
|
||||||
code: code || ""
|
code: blockCode
|
||||||
language: language || "text"
|
language: blockLang
|
||||||
codeId: codeId || ""
|
codeId: blockCodeId
|
||||||
highlightedText: highlighted || ""
|
highlightedText: blockHighlighted
|
||||||
onCopyRequested: (id) => {
|
onCopyRequested: (id) => {
|
||||||
const txt = mdParser.getCodeBlock(id)
|
const txt = mdParser.getCodeBlock(id)
|
||||||
if (txt.length > 0) {
|
if (txt.length > 0) {
|
||||||
|
|||||||
@@ -105,6 +105,16 @@ int main(int argc, char *argv[])
|
|||||||
if (!probe(im, "<img") && !probe(im, "изображение"))
|
if (!probe(im, "<img") && !probe(im, "изображение"))
|
||||||
return fail("картинка", im);
|
return fail("картинка", im);
|
||||||
|
|
||||||
|
// CodeBlock отдельный компонент — parseBlocks
|
||||||
|
auto blocks = p.parseBlocks("# Hello\n\n```cpp\nint x=1;\n```\n\nText", vault, fileDir);
|
||||||
|
if (blocks.size() != 3) return fail("parseBlocks size", QString::number(blocks.size()));
|
||||||
|
if (blocks[0].toMap().value("type").toString() != "html") return fail("block 0 type", blocks[0].toMap().value("type").toString());
|
||||||
|
if (blocks[1].toMap().value("type").toString() != "code") return fail("block 1 type", blocks[1].toMap().value("type").toString());
|
||||||
|
if (blocks[1].toMap().value("language").toString() != "C++" && blocks[1].toMap().value("language").toString() != "cpp") return fail("block 1 lang", blocks[1].toMap().value("language").toString());
|
||||||
|
if (!blocks[1].toMap().value("code").toString().contains("int x=1;")) return fail("block 1 code", blocks[1].toMap().value("code").toString());
|
||||||
|
if (blocks[1].toMap().value("highlighted").toString().isEmpty()) return fail("highlighted empty");
|
||||||
|
if (blocks[2].toMap().value("type").toString() != "html") return fail("block 2 type");
|
||||||
|
|
||||||
std::printf("MDPARSER TEST OK\n");
|
std::printf("MDPARSER TEST OK\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user