結局 SP 版はムリでしたが、PC版では使ってるので変更のメモ

とりあえずこんなコードになりました
!function(){
// 記事IDに対応したcss/jsのロード
function load_page_resources(){
ld_blog_vars.articles.forEach(function(article){
var path = article.permalink;
var csspath = path.replace(/\.html$/, ".css");
var jspath = path.replace(/\.html$/, ".js");

var css_elem = document.createElement("link");
css_elem.rel = "stylesheet";
css_elem.href = csspath;

var js_elem = document.createElement("script");
js_elem.src = jspath;

document.head.appendChild(css_elem);
document.head.appendChild(js_elem);
});
}

// 前の月、次の月
function monthly(){
var ext_point = location.pathname.lastIndexOf(".");
var basepath = location.pathname.substr(0, ext_point);
var jsonpath = basepath + ".json";
var prev_elem = document.getElementById("to-prev-month");
var next_elem = document.getElementById("to-next-month");
XHR(jsonpath, "GET", function(xhr){
if(document.readyState === "loading"){
document.addEventListener("DOMContentLoaded", setPager);
}else{
setPager();
}
function setPager(){
var data = JSON.parse(xhr.responseText);
if(data.prev_url){
prev_elem.href = data.prev_url;
}else{
prev_elem.style.visibility = "hidden";
}
if(data.next_url){
next_elem.href = data.next_url;
}else{
next_elem.style.visibility = "hidden";
}
}
});
}

// スマホページの共通css/js
function load_sp_resources(){
var css_elem = document.createElement("link");
css_elem.rel = "stylesheet";
css_elem.href = "/sp/blog.css";

var js_elem = document.createElement("script");
js_elem.src = "/sp/blog.js";

document.head.appendChild(css_elem);
document.head.appendChild(js_elem);
}

function XHR(url, type, cb, cberr){
var xhr = new XMLHttpRequest();
xhr.open(type, url);
xhr.onload = function(){
if(this.readyState == 4){
cb(this);
}
};
xhr.onerror = cberr || function(){};
xhr.ontimeout = cberr || function(){};
xhr.send();
}

// ページの種類ごとに何かしたいとき
switch(ld_blog_vars.current_page.type){
case "index": break;
case "article":
window.addSideBarContents && addSideBarContents();
break;
case "monthly": monthly();break;
case "category": break;
case "tag": break;
}

load_page_resources();
ld_blog_vars.current_page.is_smartphone && load_sp_resources();
}();

最初の方は関数定義だけ

最後にページの種類を見て、
index(トップページ)、article(個別の記事ページ)、monthly(月別のページ)、tag(タグのページ)、category(カテゴリのページ)
のどれかに応じた処理をします

個別記事の時は 記事にサイドバーを拡張する情報があれば拡張します

月別では前の月と次の月のリンクを作る処理です
月に記事が1つもないとその月のページはないので、APIから前後の月情報を取得します

http://nmm.blog.jp/archives/2016-04.html

のページの前後の月を知りたいときは

http://nmm.blog.jp/archives/2016-04.json

にアクセスすると取得できる json の next_url と prev_url を使います


ここからは SP 用に作っていたので、あまり意味が無い機能です

ページ分割対策で css と js を別ファイルで読み込みます

http://nmm.blog.jp/archives/48676352.html という URL なら http://nmm.blog.jp/archives/48676352.css と http://nmm.blog.jp/archives/48676352.js のように拡張子変えたファイルを自動でロードさせます
ファイルがない場合は 404 エラーとなります

トップページやタグページだと10以上の記事が表示されるので、 20 以上のファイルがロードされます
全部ファイルがなかったら 20 くらいのエラーがコンソールに並ぶのがちょっと気持ち悪いです

先にファイルがあるか確認するために
whenUrlExists(csspath, function(ok){
var css_elem = document.createElement("link");
css_elem.rel = "stylesheet";
css_elem.href = csspath;
document.head.appendChild(css_elem);
})

whenUrlExists(jspath, function(){
var js_elem = document.createElement("script");
js_elem.src = jspath;
document.head.appendChild(js_elem);
})

function whenUrlExists(url, cb){
XHR(url, "HEAD", function(xhr){
if(xhr.status !== 404){
cb();
}
});
}

こうしたのですが、結局見つからなかった場合はコンソールにエラーが残るので直接ロードしてしまってもかわらなそうです

そして最後にスマートフォンページのフラグがあれば、スマートフォン用の css と js を読み込む…のですが、このスクリプト自体を読みこませられないのでムダに終わりました