- Перенесли из моего исходного блога

ЗАДНИЙ ПЛАН:

Голанг действительно стал моим языком и заменил Python в качестве моего основного языка сценариев. Мне нравится, как легко писать. Мне нравится, насколько быстро он компилируется, и это скомпилированный язык, поэтому я могу просто распространять один двоичный файл вместо того, чтобы надеяться, что есть установка времени выполнения Python (например, небольшие образы контейнеров). Распространяя эти двоичные файлы, я могу легко скомпилировать Golang для разных архитектур и ОС без установки громоздкой цепочки инструментов.

Одним из больших недостатков языка Go является то, что он имеет очень небольшую поддержку графического интерфейса, и на самом деле в нем нет поддержки по умолчанию. Ну, есть пара довольно хороших сторонних библиотек с графическим интерфейсом, таких как Go-GTK, Go-UI и, наконец, Go-QML.

О QML

Раньше я играл с QML и виджетами Qt с C ++, и мне это очень понравилось. QML особенно хорош. Вместо классического синтаксиса стиля XML, который вы найдете в файлах пользовательского интерфейса WPF или даже Qt Widgets, QML использует синтаксис, более похожий на JavaScript / JSON. Хотя я только что сказал JSON, он использует синтаксис, подобный объекту, а не строковый синтаксис (это означает, что у вас не будет множества двойных кавычек).

Также QML может встраивать JavaScript непосредственно в строку или в отдельный файл .js для управления действиями в пользовательском интерфейсе. Любите или ненавидите JavaScript, это САМЫЙ используемый язык в мире. Самое замечательное в этой имплантации заключается в том, что в новых версиях Qt / QML она не запускает полную имплантацию Chromium в фоновом режиме, т. Е. Меньше накладных расходов по сравнению с Electron и NW.js.

Совместите это со скоростью и мощью языка Go, и вы сможете легко создавать быстрые приложения с графическим интерфейсом для множества архитектур и ОС.

НАЧИНАЯ

Для начала я использую Arch Linux, и все пакеты, которые я устанавливаю через системный менеджер пакетов, предназначены для этой системы. Все системные пакеты будут для Go-QML, за исключением буфера обмена go lib, в Linux вам понадобится xclip или xsel.

// Ubuntu (based), Debian
# apt-get install xclip
// Cent-OS, RHEL
# yum install xclip
// Fedora
# dnf install xclip
// OpenSUSE, SEL
# zypper in xclip
// Arch Linux
# pacman -S xclip

Чтобы использовать Go-QML и весь импорт QML в этом проекте, установите:

# pacman -S qt5-{base,declarative,quickcontrol}

Хорошо, эта команда может выглядеть немного странно. Использование фигурных скобок в оболочке bash - ОЧЕНЬ мощная вещь. В основном приведенная выше команда эквивалентна:

# pacman -S qt5-base qt5-declarative qt5-quickcontrol

Также обратите внимание, что в фигурных скобках нет пробелов, что очень важно. Вы можете использовать этот тип синтаксиса, когда файлы cp или многое другое

Теперь, когда у нас установлены системные пакеты, нам нужно убедиться, что у вас установлен язык Go и установлен $ GOPATH. Для получения дополнительной информации перейдите на golang.org, для получения дополнительной информации.

Теперь, когда все настроено, давайте установим сторонние пакеты Golang:

$ go get -u -v gopkg.in/qml.v1

Любые ошибки, возникающие при установке этого пакета, означают, что вам необходимо установить больше зависимостей в вашей системе. Дополнительную информацию см. В README Go-QML.

Теперь установим парсер уценки:

$ go get -u -v github.com/russross/blackfriday

В этом руководстве будут использоваться основные настройки того, что вы можете делать с blackfriday. Для производственного использования вы можете очистить уценку. Все это описано в README blackfriday.

Наконец, нам нужно установить поддержку буфера обмена:

$ go get -u -v github.com/atotto/clipboard

ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА

Я использовал пару ссылок, чтобы понять, как написать эту программу.

ВОПРОСЫ ВЕРСИИ ГОЛАНГА

На момент написания я использую самую последнюю версию языка Go (1.6.2). Изменения в cgo в 1.6 сделали так, чтобы GO-QML не компилировался, когда код QML пытается связаться с Go. Обход, упомянутый в уроке, на который я ссылался в конце последнего раздела, говорит:

$ GODEBUG=cgocheck=0 go run main.go

Поэтому каждый раз, когда вы запускаете свою программу, запускайте ее с установленными варами. Я не рекомендую экспортировать эти переменные и делать их глобальными, поскольку они могут подвергнуть другие программы go риску возможных проблем с безопасностью и ошибок.

У вас не должно быть этой проблемы с Go language version = ‹1.5.x

СОЗДАНИЕ КАТАЛОГОВ

Давайте перейдем в ваш каталог $ GOPATH / src и создадим свои каталоги. Примечание. Я предпочитаю, чтобы мои файлы графического интерфейса находились в отдельном подкаталоге проекта, независимо от того, насколько мал проект.

$ cd $GOPATH/src && mkdir -p qml-md/assets && cd qml-md && touch main.go assets/main.qml

Это создаст все необходимое дерево каталогов и необходимые файлы

Наконец-то мы можем открыть ваш любимый текстовый редактор и написать код!

К КОДУ:

Здесь вы можете видеть, что мы импортировали 3 сторонних библиотеки, библиотеки os и fmt из std.

Теперь мы получим файл QML для загрузки в приложение go.

Здесь мы создаем функцию запуска, которая возвращает ошибку. Внутри функции run мы создаем движок QML и слушаем сигнал «quit» для корректного завершения работы.
Загрузите файл QML. И, наконец, создайте, откройте и удерживайте окно QML открытым.

В основной функции мы запускаем функцию запуска, чтобы открыть окно QML.

Как видите, QML - это простой язык разметки, который позволяет очень быстро и легко писать пользовательские интерфейсы. Мы создаем ApplicationWindow в качестве нашей базовой сущности и RowLayout для организации его дочерних элементов. 2 TextAreas, одно для Markdown, а другое для RichText / HTML. Причина, по которой я говорю RichText / HTML, станет очевидна позже, когда мы сделаем его так, чтобы вы могли видеть его как форматированный текст или необработанный HTML.

В комментариях выше я говорю «Предлагаю». Я говорю это, потому что при использовании Layout.param это говорит о том, что дочерний элемент макета должен следовать этой команде в качестве журнала, поскольку это не заставляет ParentLayout нарушать свои определенные параметры.

Теперь нам нужно установить параметр в QML и в Go, чтобы установить текст в каждой TextArea. Сначала мы удалим статический текст из mdarea.text и rtarea.text с именами переменных для ссылки в коде Golang. Когда я говорю что-то вроде mdarea.text, я имею в виду:

  • Мы устанавливаем идентификатор TextArea в текстовой области Markdown как mdarea
  • И я использую точечный синтаксис для ссылки на текстовый параметр

Теперь мы можем перейти к коду Go и создать переменную контекста, которая будет глобальной, чтобы мы могли обращаться к ней из других частей нашего кода по мере необходимости. Затем используйте контекст для установки переменных до создания окна, чтобы установить текст при загрузке.

Приведенный выше код Go теперь установит свойства mdtxt и rttxt в пользовательском интерфейсе QML при загрузке приложения. Теперь нам нужен механизм для синтаксического анализа и синхронизации текстовой области уценки с областью форматированного текста. Мы сделаем это за пару шагов.

  • Сначала мы создадим собственный тип из кода Go для импорта в QML.
  • Затем мы будем использовать событие клавиатуры в сущности mdarea, чтобы отслеживать изменение текста.
  • Когда текст изменяется в mdarea, он затем отправляет содержимое mdarea.text в код Go, чтобы затем проанализировать уценку и установить текст в визуализированном HTML в rtarea.text как RichText

Сначала мы создаем глобальную структуру HTMLText (примечание: первая буква в верхнем регистре, поэтому структура экспортируется), которая принимает qml.Object и строку

Теперь мы создаем метод SetHTMLText (снова экспортируемый) для вызова из QML для управления данными, хранящимися в HTMLText, и устанавливаем текст в rttext с помощью указателя ctx.

Теперь нам нужен способ создания объекта HTMLText в файле QML, для этого нам нужно зарегистрировать типы в QML из кода Go до запуска движка.

См. Эти 2 части Go-QML GoDoc: qml.RegisterTypes и qml.TypeSpec

В приведенном выше коде все усложняется. Мы создали импортируемый набор объектов для QML. Мы сделаем это сейчас.

GoDoc для Go-QML объясняет нижний регистр: Lowercasing_of_names

В приведенном выше коде вы увидите, что я использовал Keys.onReleased, сначала я использовал onPressed, но он отправляет сигнал до добавления нового символа, поэтому rtarea всегда отставала на один символ.

Теперь приложение автоматически синхронизирует и проанализирует уценку, которую вы пишете в mdarea, и отформатирует ее, чтобы она хорошо выглядела в rtarea. Но что, если мы захотим увидеть HTML-код. Что ж, дальше мы сделаем так, чтобы при щелчке по rtarea автоматически отображался необработанный HTML.

Вы можете спросить, почему я сделал дополнительные 2 шага в конце инструкции else. В QML, как только вы установите TextArea для отображения RichText, QML добавляет html, header и теги body. Кроме того, он добавляет информацию о стиле шрифта в виде CSS, который нам не нужен, если нам нужен простой HTML с разметкой. Итак, как только мы установим для TextArea значение PlainText, он будет показывать только то, что было отправлено.

Теперь последним шагом будет добавление кнопки Копировать в HTML, чтобы легко извлечь необработанный HTML. И наклеить куда угодно.

Приведенный выше код теперь создаст ToolBar, добавит кнопку Copy To HTML Button и вызовет несуществующий в настоящее время метод HTMLText .CopyToClip (строка). Давайте построим это сейчас.

и это все! Хотя есть много других вещей, которые вы можете сделать с этим, например, очистить уценку. Но теперь вы можете экспериментировать с такими вещами, как сохранение файла HTML и т. Д.

Удачи!

Полный исходный код находится: https://github.com/dtoebe/qml_markdown