Markdown preview

Russian main discussion
  • Author
  • Message
Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Markdown preview

Post by Skif_off »

Вариантов, собственно, найдено два: Pandoc и MultiMarkdown.

Первый много чего ещё умеет, но pandoc.exe размером 37,9 Мб (хотя и неплохо ужимается UPX до 7,2) и есть параметр --from= с вариантами для Markdown в частности:

Code: Select all

markdown          (pandoc’s extended markdown)
markdown_strict   (original unextended markdown)
markdown_phpextra (PHP Markdown Extra extended markdown)
markdown_github   (github extended markdown)
Что не очень удобно, т.к. нужно выбирать.

У второго - вывод только в консоль (начинался с Markdown.pl, как понял) и только содрежимое <body></body>.
Обы предпочитают на входе-выходе UTF-8.

Есть ли альтернативы? Что-то видел на JScript, но не понял, как пользоваться.

-------------

смотрите ниже


Добавлено:
Добавлена проверка существования файла, если -browser в команде есть, а браузера нет.

Добавлено:
Убран ключ -c (compatibility mode), иначе не все фичи срабатывают (например, на Github).

Добавлено:
Выпилено

Code: Select all

<style type="text/css">code{white-space: pre;}</style>
Last edited by Skif_off on Thu Aug 27, 2015 4:28 pm, edited 4 times in total.

Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

Skif_off
Правильно ли я понял, что предпросмотр выводится в отдельном окне браузера?

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Cuprum
Типа как в AkelPadDocsView.js? Тогда нет, либо указанный полноценный браузер, либо ишак.

Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

Skif_off
Попробовал, работает :).
Но почему-то не показывает картинки, внедренные в markdown-файл.

Посмотрел еще варианты.
Есть marked. Он под node.js. Если на машине установлена node, наверное, можно как-то прикрутить.
Есть discount. Он на Си. Тут сказать нечего...
Лично я пользуюсь предпросмотром markdown в Brackets. Сделан в виде стороннего палагина. Очень удобно: окно редактора поделено на 2 области. В одной сам текст файла, в другой предпросмотр. "Живой" показ всех изменений + синхронизация скроллинга.

Вот что-то бы подобное для Акела, была бы бомба!

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Cuprum wrote:Но почему-то не показывает картинки, внедренные в markdown-файл.
Можно пример файла?
Cuprum wrote:Есть discount. Он на Си. Тут сказать нечего...
Мне тоже нечего :) Не удалось найти скомпилированную версию.

Brackets неприлично большой :) MarkdownPad вроде тоже так умеет.

Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

Skif_off
Можно пример файла?
По коду там просто. Указано в файле

Code: Select all

![forked](img/forked.png)
А рядом с md-файлом папка img, в которой рисунок forked.png.
Brackets неприлично большой
Если его использовать только как редактор для md - да, тяжеловат.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Cuprum wrote:А рядом с md-файлом папка img, в которой рисунок forked.png
А HTML-код правильный получается? Временный файл создаётся в %Temp%, относительные пути не сработают. Надо подумать о замене пути на абсолютный.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Замена относительного пути не тривиальна, оптимально - генерить *.html рядом с *.md, но как потом удалять?

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Brackets и MarkdownPad неприлично велики, Atom ещё и тормозной, Sublime Text не интересен, онлайн неудобно по разным причинам (не помню, что ещё есть, показывающее предпросмотр). За сим, закончил комплект, если кому интересно: MarkdownPreview.js, упомянутый выше MultiMarkdown и MarkdownPreview (написано на AutoIt, скомпилировано в 3.3.8.1 +исходники для 3.3.8.1 и 3.3.12.0). Иконки отдельно, удобно заменить на свои, синхронизации скроллинга нет, ибо нет идеи :)

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=28787#p28787
//
// Version: 2016-03-28
//
// -"" Call("Scripts::Main", 1, "MarkdownPreview.js", `-file="%f" -browser=path -del=0/1`)
//   параметры (не обязательны):
//     -file="%f" - имя текущего файла, если нет - временные md- и html-файлы
//                создаются не рядом, а в %Temp%, но в таком случае не будут показаны
//                изображения, если в md-файле используются относительные пути;
//     -browser=path - путь к браузеру, если нет - используется MarkdownPreview.exe;
//     -del=0/1 - удалять (1) или не удалять (0) временные md- и html-файлы
//                после закрытия MarkdownPreview.exe, по умолчанию - удалять
//                (пока только с MarkdownPreview.exe)
//
// Сохранить в UTF-16LE

// Пути к утилитам
var pMultiMarkdown   = "%a\\AkelFiles\\Tools\\MarkdownPreview\\multimarkdown.exe"
var pMarkdownPreview = "%a\\AkelFiles\\Tools\\MarkdownPreview\\MarkdownPreview.exe"

var hMainWnd      = AkelPad.GetMainWnd();
var pAkelFilesDir = AkelPad.GetAkelDir();
var nArg1         = AkelPad.GetArgValue("file", "");
var nArg2         = AkelPad.GetArgValue("browser", "");
var nArg3         = AkelPad.GetArgValue("del", 1);
var WshShell      = new ActiveXObject("WScript.Shell");
var fso           = new ActiveXObject("Scripting.FileSystemObject");
var pTextRange;
var sTxtTextError;
var pTempMDFile;
var pTempHTMLFile;

pTextRange = AkelPad.GetSelText(2);
if (! pTextRange.length > 0)
  pTextRange = AkelPad.GetTextRange(0, -1, 2);

if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1049 /*Russian*/) 
  sTxtTextError = "Не найдена утилита MultiMarkdown! Проверьте путь в pMultiMarkdown.";
else 
  sTxtTextError = "MultiMarkdown not found! Check path into pMultiMarkdown.";

pMultiMarkdown = pMultiMarkdown.replace(/^%a(?=\\)/, pAkelFilesDir);
pMarkdownPreview = pMarkdownPreview.replace(/^%a(?=\\)/, pAkelFilesDir);

if (! fso.FileExists(pMultiMarkdown))
{
  AkelPad.MessageBox(hMainWnd, sTxtTextError, WScript.ScriptName, 48 /*MB_ICONWARNING*/);
  WScript.Quit();
}

// Strikethrough text: "~~text~~" => ""<strike>text</strike>"
//pTextRange = pTextRange.replace(/(~~)([^~]+)(~~)/g, '<strike>$2</strike>')

if (nArg1)
{
  pTempMDFile = nArg1 + "-temp.md";
  pTempHTMLFile = nArg1 + "-temp.html";
}
else
{
  pTempMDFile = WshShell.ExpandEnvironmentStrings("%Temp%") + "\\temp.md";
  pTempHTMLFile = WshShell.ExpandEnvironmentStrings("%Temp%") + "\\temp.html";
}

AkelPad.WriteFile(pTempMDFile, pTextRange, -1, 65001, false);

AkelPad.Exec("\"" + pMultiMarkdown + "\" --batch --full \"" + pTempMDFile + "\" --output=\"" + pTempHTMLFile + "\"", "", 1, 0);

if (nArg2 && fso.FileExists(nArg2))
  AkelPad.Exec(nArg2 + " " + pTempHTMLFile, "", 1);
else if (fso.FileExists(pMarkdownPreview))
  AkelPad.Exec("\"" + pMarkdownPreview + "\" " + nArg3 + " \"" + pTempHTMLFile + "\" \"" + pAkelFilesDir + "\\AkelPad.exe\"");
else
  AkelPad.Exec(WshShell.ExpandEnvironmentStrings("%ProgramFiles%") + "\\Internet Explorer\\iexplore.exe " + pTempHTMLFile, "", 1);

Необходимо проверить путь к multimarkdown.exe и MarkdownPreview.exe, предполагается, что лежат в AkelFiles\Tools\MarkdownPreview. MarkdownPreview сохраняет размер и положение окна в ini-файле с именем exe'шника, имя не задано жёстко, вполне можно переименовать оба файла.

Ключ -browser оставлен на всякий случай, неудобен, т.к. пока не решено, как отследить завершение и удалить временные md- и html-файлы (как контролировать закрытие процесса/окна (окна AkelPad для простоты?) в JScript пока не разбирался, возможно, получится повесить чистку на MarkdownPreview.exe и в этом случае)

Добавлено:
Пара правок в комментариях (напоминалка для ишака и ТС), в MarkdownPreview пропустил директиву #NoTrayIcon - ссылка обновлена.
Добавлено:
Скрипт в комплекте обновлён - ссылка обновлена.
Last edited by Skif_off on Mon Mar 28, 2016 5:13 pm, edited 11 times in total.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

MarkdownPreview.js обновлён с учётом нескольких расширений для файлов Markdown (сам не столкнулся - вылетело из головы).

Offline
Posts: 269
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

multimarkdown.exe (а также md.coder) некорректно обрабатывают ```, принятые в markdown на GitHub' е. Например, вот в этом readme.md после обработки пропадает (улетает в code class) строчка

Code: Select all

/usr/libexec/PlistBuddy -c “print” ~/Library/Preferences/com.adobe.CSXS.5.plist

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

yozhic
Не нашёл допустимость синтаксиса

Code: Select all

```text```
в манах Code blocks так пишут:

Code: Select all

```
text
```
Pandoc переваривает, однако.

Ниже блок

Code: Select all

	```
	Dict {
		PlayerDebugMode = 1
		LogLevel = 1
	}
	```
(с отступами в начале строки) MultiMarkdown не переваривает, как оказалось, если добавить пустую строку перед - тогда переваривает. Любопытно, если правильно понял - в манах это рекомендация, а не правило.

Обратите внимание на строки 58-63: гитхаб сам косячит.

Написал автору.

______
По md.coder: по идее достаточно добавить в фолдинг

Code: Select all

;585=1+8+64+512
585   1   ${VAR}   0   "```"      "```"      ""
но см. выше.

Offline
Posts: 269
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

Skif_off
Не нашёл допустимость синтаксиса
В манах нет, но по факту парсится. Значит есть :)
если добавить пустую строку перед - тогда переваривает
Может просто совпадение. Это ж не просто Markdown, а GitHub Flavored Markdown. MultiMarkdown может о нём и не знать.
добавить в фолдинг
Там не только фолдинг, но ещё и подсветка. У меня весь текст после ``` до конца файла красно-корчневым красится.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

yozhic wrote:Там не только фолдинг, но ещё и подсветка. У меня весь текст после ``` до конца файла красно-корчневым красится.
Дело именно в правиле фолдинга, обратите внимание: в правиле задан Color text - ${VAR}. Cuprum заглядывает, подождём, когда скорректирует или добавьте правило сами.
yozhic wrote:Это ж не просто Markdown, а GitHub Flavored Markdown. MultiMarkdown может о нём и не знать.
Отличий не так уж и много, не справляется с

Code: Select all

~~Mistaken text.~~
и, конечно,

Code: Select all

```ruby
require 'redcarpet'
markdown = Redcarpet.new("Hello World!")
puts markdown.to_html
```
.
Остальное вроде работает.

Offline
Posts: 269
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

добавьте правило сами
Да, всё чётко. Прошу прощения, сразу не посмотрел, всё впопыхах, да впопыхах :?
не справляется только
С этим тоже не справляется:

Code: Select all

```text```
усылает такое в class.
Post Reply