12,788
回編集
857行目: | 857行目: | ||
return -1; | return -1; | ||
} | } | ||
return 0; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== Hoedownライブラリ == | |||
==== Hoedownライブラリとは ==== | |||
<br> | |||
==== Hoedownライブラリのライセンス ==== | |||
<br> | |||
==== Hoedownライブラリのインストール ==== | |||
<br> | |||
==== QtプロジェクトファイルおよびCMakeLists.txtファイル ==== | |||
<syntaxhighlight lang="make"> | |||
# Qtプロジェクトファイル (.pro) | |||
# Pkg-configを使用する場合 | |||
CONFIG += link_pkgconfig | |||
PKGCONFIG += hoedown | |||
# Pkg-configを使用しない場合 | |||
LIBS += -lhoedown | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="cmake"> | |||
# CMakeLists.txtファイル | |||
find_package(PkgConfig REQUIRED) | |||
pkg_check_modules(HOEDOWN REQUIRED hoedown) | |||
target_link_libraries(<ターゲット名> PRIVATE | |||
${HOEDOWN_LIBRARIES} | |||
) | |||
target_include_directories(<ターゲット名> PRIVATE | |||
${HOEDOWN_INCLUDE_DIRS} | |||
) | |||
target_compile_options(<ターゲット名> PRIVATE | |||
${HOEDOWN_CFLAGS_OTHER} | |||
) | |||
</syntaxhighlight> | |||
<br> | |||
==== HTMLファイルへ変換 ==== | |||
以下の例では、Hoedownライブラリを使用してMarkdownファイルを解析および操作している。<br> | |||
# Markdownファイルを読み込む。 | |||
# Hoedownライブラリを使用してMarkdownをHTMLに変換する。 | |||
# 変換結果を出力する。 | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// main.cppファイル | |||
#include <QCoreApplication> | |||
#include <QFile> | |||
#include <QTextStream> | |||
#include <stdexcept> | |||
#include <hoedown/hoedown.h> | |||
#include <QDebug> | |||
QString parseMarkdown(const QString &markdown) | |||
{ | |||
hoedown_buffer *ib = nullptr, | |||
*ob = nullptr; | |||
hoedown_renderer *renderer = nullptr; | |||
hoedown_document *document = nullptr; | |||
QString result; | |||
try { | |||
ib = hoedown_buffer_new(markdown.toUtf8().length()); | |||
if (!ib) throw std::runtime_error("Failed to create input buffer"); | |||
hoedown_buffer_put(ib, markdown.toUtf8().constData(), markdown.toUtf8().length()); | |||
ob = hoedown_buffer_new(64); | |||
if (!ob) throw std::runtime_error("出力バッファの生成に失敗"); | |||
renderer = hoedown_html_renderer_new(HOEDOWN_HTML_SKIP_HTML, 0); | |||
if (!renderer) throw std::runtime_error("HTMLレンダラの生成に失敗"); | |||
document = hoedown_document_new(renderer, HOEDOWN_EXT_TABLES | HOEDOWN_EXT_FENCED_CODE, 16); | |||
if (!document) throw std::runtime_error("ドキュメントの生成に失敗"); | |||
hoedown_document_render(document, ob, ib->data, ib->size); | |||
result = QString::fromUtf8(hoedown_buffer_cstr(ob)); | |||
} | |||
catch (const std::exception &e) { | |||
qCritical() << "Markdownのパースに失敗: " << e.what(); | |||
} | |||
// リソースを削除 | |||
if (ib) hoedown_buffer_free(ib); | |||
if (ob) hoedown_buffer_free(ob); | |||
if (renderer) hoedown_html_renderer_free(renderer); | |||
if (document) hoedown_document_free(document); | |||
return result; | |||
} | |||
bool readMarkdownFile(const QString &filePath, QString &content) | |||
{ | |||
QFile file(filePath); | |||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { | |||
qCritical() << "Markdownファイルのオープンに失敗: " << file.errorString(); | |||
return false; | |||
} | |||
QTextStream in(&file); | |||
content = in.readAll(); | |||
file.close(); | |||
if (content.isEmpty()) { | |||
qWarning() << "The file is empty"; | |||
return false; | |||
} | |||
return true; | |||
} | |||
int main(int argc, char *argv[]) | |||
{ | |||
QCoreApplication a(argc, argv); | |||
QString filePath = "<Markdownファイルのパス>"; | |||
QFileInfo fileInfo(filePath); | |||
if (!fileInfo.exists()) { | |||
qCritical() << "Markdownファイルが見つからない: " << filePath; | |||
return -1; | |||
} | |||
if (!fileInfo.isFile() || !fileInfo.isReadable()) { | |||
qCritical() << "ファイルが読めない、または、正規のファイルではない: " << filePath; | |||
return -1; | |||
} | |||
QString content; | |||
if (!readMarkdownFile(filePath, content)) { | |||
return -1; | |||
} | |||
QString parsedContent = parseMarkdown(content); | |||
if (parsedContent.isEmpty()) { | |||
qCritical() << "Markdownのパースに失敗"; | |||
return 1; | |||
} | |||
qDebug() << "パースされたMarkdownの内容:"; | |||
qDebug().noquote() << parsedContent; | |||
return 0; | return 0; | ||
864行目: | 1,016行目: | ||
== その他のMarkdownパーサライブラリ == | == その他のMarkdownパーサライブラリ == | ||
* PEG Markdown Highlight | * PEG Markdown Highlight | ||
*: PEGによるMarkdownパーサであり、Markdownの解析とシンタックスハイライトに特化している。 | *: PEGによるMarkdownパーサであり、Markdownの解析とシンタックスハイライトに特化している。 |