機械学習基礎理論独習

誤りがあればご指摘いただけると幸いです。数式が整うまで少し時間かかります。リンクフリーです。

勉強ログです。リンクフリーです
目次へ戻る

はてなブログでページ内リンクを自動で作る方法

はじめに

本機能はプログラムによるものなので、自己責任でお願いします。

プログラムを追加する方法

①:管理画面のデザインを押下します。
f:id:olj611:20211113173155p:plain:w500

②:上にあるカスタマイズボタンを押下します。
f:id:olj611:20211113173355p:plain:w500

③:左側にあるフッタメニューを押下します。
f:id:olj611:20211113173527p:plain:w500

④:開いたフッタメニューの下側にあるテキストエリアを押下します。
f:id:olj611:20211113173729p:plain:w500

⑤:すると、プログラムの編集ができるようになります。
貼り付けるプログラムは後で説明します。
f:id:olj611:20211113173957p:plain:w500

⑥:プログラムの編集が終わったら、変更を保存するボタンを押下すれば、完了です。
f:id:olj611:20211113174134p:plain:w500

貼り付けるプログラム

⑤で貼り付けるプログラムは以下です。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script>
function appendLinkMenu(args) {
    var idCount = 0;
    var $h = $(args.h);

    // $h が 0 件なら終了する
    if($h.length === 0) {
        console.log('h is not found.');
    	return;
    }

    $hh = $(args.hh);
    $t = $(args.t);
    $t.prop({id: '___add_id_top'});
    $hh.append($t);
    $(args.p).prepend($hh);

    $h.each(function(i) {
        // h に idが振られていなければ、振る
        if(!$(this).prop('id')) { 
            $(this).prop({ id: '___add_id_' + idCount});
            idCount++;
        }
        $(this).css({ display:'inline-block' }).after('&nbsp;&nbsp;<a href="#___add_id_top" title="ページトップへ戻る">' + args.ts + '</a>');
        var $a = $('<a href="#' +  $(this).prop('id') + '">' + $(this).text() + '</a>');
        $a.css(args.as);
        $hh.append($a);
        $hh.append('<br>');
    });

    // args.iミリ秒おきに文字列が置き換わっていないか監視する
    setInterval(function() {
        $t.parent().find('a.keyword').remove();
        $h.each(function(i) {
            var id = $(this).prop('id');
            var hHtml = $(this).html(); 
            var $a = $('a[href="#' + id + '"]');
            var aHtml = $a.html();
            if(aHtml !== hHtml) {
                if(hHtml.indexOf('MathJax') >= 0) { 
                    $a.css(args.asmj); 
                    $a.html(hHtml);
                } else {
                    $a.html(hHtml);
                }
                
            }
        });
    }, args.i);

    // #___add_id_で始まるアンカーをクリックした場合に処理
    $('a[href^="#___add_id_"]').click(function() {
        // スクロールの速度
        var speed = args.ss; // ミリ秒
        // アンカーの値取得
        var href= $(this).attr("href");
        // 移動先を取得
        var target = $(href == "#" || href == "" ? 'html' : href);
        // 移動先を数値で取得
        var position = target.offset().top;
        // スムーススクロール
        $('body,html').animate({scrollTop:position}, speed, 'swing');
        return false;
    });
}
$(function() {
    if(location.href === "https://olj611.hatenablog.com/") { return; }
    if(location.href === "https://olj611.hatenablog.com/entry/2021/02/21/084728") { return; }
    if(location.href.indexOf("https://olj611.hatenablog.com/entry/prml") >= 0) { return; }
    
    appendLinkMenu({
        h: '#content-inner h4', // ページ内リンクのスタイル
        p: '#content-inner .entry-content', // ページ内リンクの親スタイル
        hh: '<div class="section"></div>', // ページ内リンクを覆うHTML
        t: '<h4>目次</h4>', // リンクの項目のHTML
        ts: '[TOP]', // 既存のhタグに追加されるリンクの文字列
        as: {}, // 普通(非MathJax)用の文字列のスタイル
        asmj: { lineHeight: '50px'}, // MathJax用文字列のスタイル
        i: 1000, // 文字の変化を監視する時間
        ss: 400, // スクロールにかかる時間
    });
});
</script>

プログラムの説明

プログラムはJavaScriptで書いており、ES5(多分IE11以下でもでも動く)に準拠して書いています。
動作確認は、Windows10のGoogle Chromeで行いました。
ソースはappendLinkMenuの定義とappendLinkMenuを呼び出す部分からなります。

jQueryを何らかの方法で既に読み込んでいる方は、以下のコードは不要です。
また、jQueryのバージョンはそんなに古くなかったら、何でもよいです。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

appendLinkMenuは、hタグとへのリンクとhタグの右側にトップへのリンクを作成します。
appendLinkMenuの呼び出し方ですが、以下のように引数を渡します。

hタグに数式(latex形式)を書いていても大丈夫です。
タイマーで定期的に最新の文字列で書き換えるようにしています。

appendLinkMenu({
        h: '#content-inner h4', // ページ内リンクのスタイル
        p: '#content-inner .entry-content', // ページ内リンクの親スタイル
        hh: '<div class="section"></div>', // ページ内リンクを覆うHTML
        t: '<h4>目次</h4>', // リンクの項目のHTML
        ts: '[TOP]', // 既存のhタグに追加されるリンクの文字列
        as: {}, // 普通(非MathJax)用の文字列のスタイル
        asmj: { lineHeight: '50px'}, // MathJax用文字列のスタイル
        i: 1000, // 文字の変化を監視する時間
        ss: 400, // スクロールにかかる時間
    });

呼び出したくないページは、if文でreturnします。
正規表現が分かる方はそっちで書いた方がよいです。
私は、
メインページ https://olj611.hatenablog.com/
目次用ページ https://olj611.hatenablog.com/entry/2021/02/21/084728
PRML演習問題用ページ https://olj611.hatenablog.com/entry/prml (で始めるURL)
では呼び出さないようにしています。
ここは自身のブログのURLに変更してください。

    if(location.href === "https://olj611.hatenablog.com/") { return; }
    if(location.href === "https://olj611.hatenablog.com/entry/2021/02/21/084728") { return; }
    if(location.href.indexOf("https://olj611.hatenablog.com/entry/prml") >= 0) { return; }

どんな感じになるのか

このページの目次のページ内リンクはプログラムで作成しています。
なので、このページのように自動で、ページ内リンクが作成されます。

最後に

プログラムを貼り付ける際、必ずバックアップを取ってやってください。
くれぐれも自己責任でやってください。
はてなブログで説明しましたが、プログラムをいじれるブログならできると思います。
なお、プログラムの改変、再配布等は自由に行ってください。
うまくいかなければ、どうぞ気軽にコメントを書き込んでください。twitterでもOKです。

目次へ戻る