「Qtの基礎 - Markdown」の版間の差分

ナビゲーションに移動 検索に移動
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パーサライブラリ ==
* Hoedown
*: C言語で記述されたMarkdownパーサであり、パフォーマンスに優れたライブラリである。
* PEG Markdown Highlight
* PEG Markdown Highlight
*: PEGによるMarkdownパーサであり、Markdownの解析とシンタックスハイライトに特化している。
*: PEGによるMarkdownパーサであり、Markdownの解析とシンタックスハイライトに特化している。

案内メニュー