読者です 読者をやめる 読者になる 読者になる

ふくらみ

膨張し続けている

Markdownの脚注・見出しなどをはてなブログ向けにナイスな感じに変換するツール

入力 

脚注:


見出しの形式:


見出しレベル下げ:
※Setext形式は無視

下げ幅:

出力:

説明

既存のMarkdownドキュメントをはてなブログの「Markdownモード」で投稿しやすくするためのツールです。

最新のFirefoxGoogle Chromeで動作を確認しています。Javascriptが有効である必要があります。

使い方

脚注の変換

PHP Markdown Extraに起源を持ち、様々な方言に移植された下記のような脚注の形式

本文の[^1]テキスト

[^1]: 脚注のテキスト

を、はてな記法に由来するはてなブログ向けの形式

本文の((脚注のテキスト))テキスト

に変換します。

見出し形式の変換・見出しレベル下げ

はてなブログでは<h1>・<h2>がブログタイトル・記事タイトルに使われているので、本文の見出しは<h3>から始める必要があります。

またMarkdownに2つある見出し形式のうち、<h1>・<h2>を

h1見出しのテキスト
========

h2見出しのテキスト
--------

本文

のように表現するSetext形式にもはてなブログは対応していません(そもそも<h1>・<h2>を使わない)

見出し形式の変換機能では、Setext形式の見出しを#を使うATX形式に変換できます。

見出しレベル下げ機能では、見出しレベルを<h1>→<h2>、<h2>→<h3>などと下げ、はてなブログに対応させることができます。下げ幅には負数が指定できます。h1~6の範囲に入らないものは丸められます。

両者を同時に指定すれば、Setext形式見出しをATXにした上でレベルを下げることができます。

ATX→Setextの変換とレベル下げを併用した場合、レベルを下げた上でSetext形式へ変換します。

変換が指定されないSetext形式のレベル下げには対応しません。

コード

核心部分のみです。Javascript正規表現PerlRubyに似ているので、移植は容易だと思われます。無論node.jsでも使えます。

脚注の変換

//Footnote PHP Markdown Extra to Hatena
function md_footnote_pme_to_hatena(input){
    var list = [];
    input = input.replace(/(\[\^\d+\]): *([\s\S]*?)(?:\n\n|$)/g, function(match, p1,p2){
        list.push([p1,p2]);
        return "";
    });
    list.forEach(v=>{
        input = input.replace(v[0],"(("+v[1]+"))");
    });
    return input;
}
//Footnote Hatena to PHP Markdown Extra
function md_footnote_hatena_to_pme(input){
    var str = "";
    var i = 1;
    input = input.replace(/\(\(([\s\S]*?)\)\)/g, function(match, p1){
        var s = "[^"+(i++)+"]"
        str += (s+": "+p1+"\n\n");
        return s;
    });
    input += ((input.substr(-2)=="\n\n")?"":(input.substr(-1)=="\n")?"\n":"\n\n") + str;
    return input;
}

見出し形式の変換

//Header Setext to ATX
function md_header_setext_to_atx(input){
    return input.replace(/^(.+)\n([=-]{4,})\n/mg, function(match,p1,p2){
        var str = (p2[0]=="=")?"# ":"## ";
        return str + p1 + "\n";
    });
}
//Header ATX to Setext
function md_header_atx_to_setext(input){
    return input.replace(/^(\#{1,2}) (.+)\n/mg, function(match, p1, p2){
        return p2 + "\n" + (p1=="#"?"=":"-").repeat(8) + "\n";
    });
}

見出しのレベル下げ

//Header Level Down
function md_header_level_down(input, d){
    d = d||1;
    var exp1 = /^(\#{1,6}) (.+)\n/mg;
    input = input.replace(exp1, function(match, p1, p2){
        var level = p1.length;
        level = num_trim(level + d, 1, 6);
        return "#".repeat(level) + " " + p2 + "\n";
    });
    return input;
}
function num_trim(n, min, max){
    return n>max?max:n<min?min:n;
}