Overview
Examples
Screenshots
Comparisons
Applications
Download
Documentation
Tutorials
UppHub
Status & Roadmap
FAQ
Authors & License
Forums
Funding U++
Search on this site











SourceForge.net Logo

SourceForge.net Logo

GitHub Logo

Discord Logo

MarkdownViewer

 

A simple markdown viewer with image displaying capability.

 

 

main.cpp

 

#include <CtrlLib/CtrlLib.h>

 

#include <plugin/md/Markdown.h>

#include <plugin/bmp/bmp.h>

#include <plugin/jpg/jpg.h>

 

using namespace Upp;

 

struct MarkdownViewer : TopWindow {

    RichTextView view;

    MenuBar menubar;

    Array<QtfRichObject> images;

    

    MarkdownViewer()

    {

        Title(t_("A simple markdown viewer"));

        Sizeable().Zoomable().SetRect(0, 0, 800, 600);

        Add(view.SizePos());

        AddFrame(menubar);

        menubar.Set([this](Bar& menu)

        {

            menu.Sub(t_("File"), [this](Bar& menu)

            {

                    menu.Add(t_("Open"), [this] { OpenFile(); })

                        .Key(K_CTRL_O);

                    menu.Add(t_("Copy to clipboard (as qtf)"),[this] { CopyAsQtf(); })

                        .Key(K_CTRL_C)

                        .Enable(!IsNull(~view));

                    menu.Separator();

                    menu.Add(t_("Exit"),   THISFN(Close))

                        .Key(K_CTRL_Q);

            });

        });

        ParseFile(GetDataFile("example.md"));

    }

    

    void OpenFile()

    {

        if(String f = SelectFileOpen("*.md"); !f.IsEmpty())

            ParseFile(f);

    }

    

    void ParseFile(const String& fname)

    {

        images.Clear();

        MarkdownConverter mdc;

        mdc.WhenImages = [&](VectorMap<String, String>& imglist)

        {

            String dir = GetFileDirectory(fname);

            Progress pi(t_("Loading images..."), imglist.GetCount());

            pi.pi.Percent();

            for(int i = 0; i < imglist.GetCount(); i++) {

                if(String path = NormalizePath(imglist.GetKey(i), dir); FileExists(path)) { // Image resource paths are expected to be relative to the main markdown file's.

                    if(Image img = StreamRaster::LoadFileAny(path); !IsNull(img))

                        imglist[i] << images.Add(CreatePNGObject(img));

                    if(pi.StepCanceled())

                        break;

                }

            }

        };

        view.SetQTF(mdc.Tables().NoHtml().ToQtf(LoadFile(fname)));

    }

    

    void CopyAsQtf()

    {

        AppendClipboardUnicodeText(~view);

    }

};

 

GUI_APP_MAIN

{

    MarkdownViewer().Run();

}

 

 

 

 

Do you want to contribute?