Bloggerの記事タイトルやURLなどをJavaScriptで取得する方法

ブロガーのThemeを作っていると、


「ブログのタイトルを取得したい!」とか
「現在表示しているページが、個別記事なのかTopページなのかJSで取得したい!」
とかあったりしませんか?そSでBloggerの様々情報を取得して変数に格納する短いコードを記載します。どうぞご活用ください。



情報を取得するJavascriptコード

このコードをテンプレート中の<script>に記載すれば、それぞれ変数で定義した値を取得可能に。
<script type="text/javascript">
var blogTitle = '<data:blog.title/>';
var blogUrl = '<data:blog.homepageUrl/>';
var pageTitle = '<data:blog.pageTitle/>';
var url = location.href;
var blogType = '<data:blog.pageType/>';
</script>

それぞれ以下のようになっています。
  • ブログタイトル: <data:blog.title/>
  • ブログTopページのURL:<data:blog.homepageUrl/>
  • 表示しているページのURL:<data:blog.homepageUrl/>
  • 表示しているページのタイトル:<data:blog.pageTitle/>
  • 表示しているページの種類:<data:blog.pageType/>
なので、現在表示しているページの種類を知りたくば変数blogTypeの値を参照すればOKなわけです。ページの種類にはレイアウト用のデータタグ - Blogger ヘルプよれば、
「item」「file」「index」の3種類があるとされていますが、他にも加えて「archive」「static_page」が存在します。すべての種類は
  • item: 個別記事ページ
  • file: 不明?
  • archive: アーカイブ
  • index: ラベル、アーカイブ、トップページ
  • static_page: ページで作成した、ページ
の5種類です。



グローバルに参照できるデータ

<script>部にBloggerのdataタグが使用できるってちょっと以外ですよね。ミックスした文法に違和感というか。データタグって<b:>記法で参照できるものなんだなって勝手に解釈してた。


Blogger公式ヘルプの情報をみると
グローバルに利用可能なデータ この情報は、特定のウィジェットでのみ使用できるデータとは異なり、任意の場所で使用できます
レイアウト用のデータタグ - Blogger ヘルプ
任意の場所で使用できますとなっている。任意とは・・・・・??








画像引用元:ジョジョ5部
任意の場所・・・・・ってテンプレートのウィジェットの種類を選ばないでOK!ってことだと思ってたんだよ。。。。テンプレート=htmlのどこでも利用できるデータなのね。だからscriptの変数に混ぜたり、expr:してデータを取得したりとか結構できるみたいなんですね。これは奥深いわ。てか覚えられねぇよなぁ。なんとか体系的に語っている教科書的な情報はないものかなぁ・・・

Bloggerの画像がにじむ・荒くなる問題を解決する方法。


こんにちは! もし、前ブログよりリダイレクトしてこられた方はお手数おかけしてすみません。Blogger.comに画像を挿入すると画質が悪くなってがっかりすることはありませんか? その原因や対策を記事にしました。記事の後ろの方でJavaScriptで自動化できるコードを載せているのでぜひ最後までご覧ください





Blogger.comに投稿すると画像が粗くなる問題とは

以下2枚の画像をご覧ください。どちらも同一の画像です(別々にアップロードしたものではありません)

上の画像は画質が悪いですよね? 





画質悪い
画質良い



画質に差があります。横に並べてみるとわかりやすい
画像左: 粗い 画像右: シャープ
同じ画像のはずですが、左の方がジャギーかかって不鮮明になっています。これがBlogger.comの本文の画像が荒くなる問題。本文画像の画質が悪くなって不鮮明になってしまうのです。GooglePhotoでは問題ないのに。








Blogger.comの本文画像の鮮明さとGoogle+の設定は関係ない

"Google+と関連付けられているGooglePhotoの設定を変えることで解決した"
この原因をググってみると上記がヒットするのですがGoogle+の設定は関係ありません。Google+の設定項目自体がなくなっているはず。Blogger.comではGooglePhotoへアップロードした画像がBloggerの本文に挿入されており、GooglePhotoは既にGoogle+から切り離されたサービスとなっています。公式フォーラムにも、Google+から切り離された旨が書かれています。
Google Photos is now a separate product from Google+ Photos, which no longer exists as such, and it does no longer provide the auto enhance setting.
引用元: Disable Auto Enhance for Photos - Google プロダクト フォーラム by Paolo Amoroso


Blogger本文の画像不鮮明問題を解決する方法を海外サイトで見つけました
The s320 is your resolution and it determines the quality depending on the size of the image. Notice how the link has a value of s1600, so when you click on the image it appears bigger and in better quality. An image with the width of 320px will look fine with s320. An image with the width of 800px will look awful with s320.

How to change the quality
The main options are s320, s640 and s1600 which is the highest quality. You can change that part of the code to be s1600 so it’s

or you can remove s1600/ to set it to original so it’s
引用元: How to fix blurry images on Blogger • XOmisse 






ということで、以下具体的手順です








解決方法はhtmlソースに修正を加えること

記事のimgタグのsrcを修正することで解決します。例えば、<img src="/url/any/photo/s320/hoge.jpg"> だったら、s320をs1600に書き変えることで解決します。

<img src="/url/any/photo/s320/hoge.jpg>  これを
<img src="/url/any/photo/s1600/hoge.jpg> こうする


S3桁数字
の部分の数字を大きくすればOK。記事編集ページで、編集モードをhtmlにして書き換えを行えばいいわけです。画像がくっきりしたものになるはず。
これ、一つ一つ手打ちで修正していくのはめんどくさいし辛いので、拡張機能を使ったもっと便利なやり方を紹介します。そして記事最後には、全ての投稿で自動で上記処理を行うJavaScriptコードを記載してありますのでご活用ください







文字列置換の拡張機能でhtmlソースを一括変換する

FindRというChromeの拡張機能を使って、imgタグのsrc属性を/s320から/s1600 へ一括変換可能です。

一括置換処理ができる機能があれば拡張機能・アプリはもちろんなんでもOK。ブラウザ画面を保ったまま操作を完了したいのでWindowsやMac、Linuxネイティブなアプリではなく、私は拡張機能をおすすめします





1,記事を作成する



2,htmlに切り替える


3,FindRで、"/s320" を "/s1600" へ置換

  1. Input Fieldsにチェックをいれる
  2. Find に "/s320" を入力
  3. Replace に "/s1600" を入力
  4. ReplaceAllボタンを押す。

1記事中のすべて画像を鮮明化できたはず。







ここまでの作業をJavaScriptで自動化して楽をしたい!

<script>
// 投稿記事、GooglePhoto画像の鮮明化
function imgRefiner(){
var url = location.href;
var postimgs = document.querySelectorAll('.post-body div.separator img, .post-body tr img');

postimgs.forEach(function(img){
img.setAttribute('src', img.src.replace(/\/s.+\//, '/s1600/'));
});
}

if ( url.lastIndexOf('.html') > 0 ){
imgRefiner();
} </script>
このコードをBloggerのテンプレートのどこかにコピペ。場所は</body>直上当たりが定番でしょうか。.post-body内のimgタグを集めて、それぞれすべてimgタブの属性値src値の変更を自動で行っています。ご使用のテーマによっては、メイン投稿記事のクラス名が上記コードのものと異なっているかもしれません。上記コードの場合だと投稿記事のクラス名は.post-bodyです。

その場合は
.post-body div.separator img, .post-body tr img
部分のセレクタを適宜調整してください。A , Bで複数のセレクタを指定しています。








記事まとめ

Chrome拡張機能とjavascriptの二通りを紹介しました。処理に違いがあるのでより良い方をご選択ください
  • 拡張機能を使用: 記事公開前にhtmlへ修正を加えている。閲覧者はページを表示する
  • javascriptで記述: 記事公開後 閲覧者のブラウザでスクリプトを実行して画像を表示する
JavaScriptの方は記事をロードしてから画像の変換処理というプロセスが挟まれるので、閲覧のもたつきにつながる可能性があります。記事作成者としては楽ができるが、ユーザーエクスペリエンスへは直結しないかもですね。Bloggerの仕様はデフォルトでもっと簡単になってほしい、とも思いますがJavascriptやjqueryでどんどん便利にできるので改善のしがいがありますね。最後までお読みいただきありがとうございました

Bloggerテーマの作り方、必須初期設定などまとめ

画像引用元: https://www.blogger.com/about/favicon/apple-touch-icon-180x180.png

ClassicMacOS9のplatinumなBloggerテーマを作成している当ブログ。私流のブロガーテーマ作成方法を記事にしました。



Blogger公式情報

困ったときや、Blogger記法の情報を知りたいときは上記を参照。歯を食いしばって熟読。



元となるBlogerテーマを探す

私はClassicMacOSの外観がすごい好きだったので、BloggerのこちらのテーマRetroMacThemeというを見つけてこれを元にテーマカスタマイズから始めました。リンク先のレトロマックThemeも、もとはWordPressのテーマをBlogger向けへエクスポートしたもの。

このように自分が作りたいテーマのイメージに近いテンプレを探して手を入れていきます。Blogger TemplatesでBloggerのテーマを探せます。Bloggerの初期テーマもかなりシャレオツなのでこの辺をいじるのがいいかもですね。



ブログパーツの作り方

例えば、目次とかメニューとかサイドバーのアクセサリっぽいやつとかは、プロトタイプになるものをWeb Makerを使用し個別先に作る。
このスクショでは、記事の目次パーツをSheepShaverのスクショを並べて見ながら作成している。WebMakerはWYSIWYGなWebエディタで、html/css/jsを記述したそばから反映結果を表示してくれる。素人のトライアンドエラーでもストレス無く?作業できるのが魅力なcodepenのオフライン版のようなChrome拡張機能&アプリ


htmlエディタへコピペ

WebMakerである程度満足いくまで完成したらBloggerのhtmlエディタへコピペ。これ特にめんどくさいのは、cssは<b:skin></b:skin>内に、JSは<script></script>に記述する必要があり毎度大量のスクロールで編集箇所へ移動しないといけないこと

cssはhtml最上部、scriptはhtml最下部なので、

「Webmakerではleft: 10pxでよかったけど、Bloggerで表示させたらleft: 20pxのほうがいいわ」
とか
「セレクタの記述が間違っていたのでJS書き直さなきゃ」
なんて微調整がしんどい。

更新ボタンを押したときに強制的にエディタ上部に移動させられて編集地点を見失うのはなんとか改善したかったので、HTMLエディタ下部のツールバーを上部へ持ってきて、ウィジェット間ジャンプでショートカットするようにしています。
ツールバーを上部へ持ってくる方法はこちらの記事をご覧ください。BloggerThemeを自作する: BloggerのHTMLエディタが使いづらいのを工夫する





テーマの微調整はChromeDevToolを使用

画像引用元: https://1.bp.blogspot.com/-vkF7AFJOwBk/VkQxeAGi1mI/AAAAAAAARYo/57denvsQ8zA/s1600-r/logo_chromium.png

Bloggerのhtmlエディタへのデプロイが完了し、実際にChromeでページを表示してみると

「もっと記事のwidthを増やしたい!」
など改善点や、他見栄えを良くするアイディアなどがいろいろ出てくると思います。そういうときは、右クリック>検証かctrl shift i でChromeDevtoolを使用する。ElementタブでCssを修正すると、即時に結果が反映される。詳しい使用法はこちらのブログさまをご覧ください 初心者向け!Chromeの検証機能(デベロッパーツール)の使い方

死ぬほどわかりやすいです。

注意点はページをリロードしたときにDevToolを閉じておくこと。キャッシュが残っていると変更点が正しく表示されません。また、修正箇所はリロードすると消えてしまい、

「差分だけリストアップしてくれないかな」
とかできないみたいなので、そういうときはCrome拡張機能のLive editor for CSS, Less & Sass - Magic CSS - Chrome ウェブストアを使用しています。
ChromeDevToolかこの拡張機能かは使用場面によって使いやすいほうを選択。





自身のアクセスをカウントしないようにする

Bloggerは、設定で自アクセスをカウントしないに🗹チェックをいれても、自アクセスを他所からアクセスがあったとカウントする。

「えぇ!?ブログを開設して間もないのに、もうこんなにアクセスが来てるの!?」
と驚かれるかもしれないが







模写引用元: ジョジョ4部
これは世界グローバルサービスなBloggerの仕様のようで、chromeのcookiesを以下のように手打ちで設定する必要があるそうな。めんどくさいけど以下のようにする。ChromeDevTool の Consoleで以下を実行。
document.cookie = "_ns=2; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
参考URL: Blogger 「自分のビューを追跡しない」が機能しない(保存されない)原因と対策


素材となるpngやsvgイメージを作成する

ドローエディタは、最近グラデーションメッシュが使用できるようになったオープンソースなInkscapeが使いやすいんだけど、当方環境はChromeOS/ChromiumOSなのでChromeネイティブアプリなSVGBoxを使用する。SVGBoxは、ChromeOSファミリならライセンスフリーのはず。



記事まとめ




コピペJSでコード Bloggerで個別記事、アーカイブ記事、ジャンル記事を判定する方法

Bloggerのページには以下いくつか種類があります。

  1. 個別記事
  2. ラベル一覧ページ
  3. アーカイブ一覧ページ
  4. 検索結果一覧ページ
  5. TOPページ
例えば、ページネーションや関連記事とかはTOPページや各一覧ページではなく個別記事ページに表示しておいてほしい。そういうとき、表示ページの区別をつけたい。Bloggerのネイティブコード(ex: <b: if > <b:data: >とか)で判別する方法とは別に、JSのみで、現在表示しているページの種類を判別するソースコードを記載します。どうぞ御コピペ納ください。





コピペOK 記事種類判別 jsコード

var url =  location.href;
if( url.lastIndexOf('.html') > 0 ){
    //個別記事ページの処理
    }else if( url.lastIndexOf('label') > 0 ){
    // ラベル一覧ページ
    }else if (url.lastIndexOf('search') > 0) {
   // 検索結果一覧ページ
 } else {
   //アーカイブ一覧ページ、やTOPページ
}

画像模写引用元:ジョジョ5部
else if ばっかりだけど、用はそれぞのページのURLを観察してみると
  • 個別記事: 末尾に.html
  • ラベルページ: urlに'label'を含む
  • 検索結果一覧ページ:  'search'を含む
  • アーカイブページ: 以上以外
となっているので、URLの文字列で判定して条件コードを書いてしまえばいい。皆様のお力になれたら、コードをご利用ください



Bloggerに目次追加 ClassicMacOS9Themeに目次追加するのに試行錯誤する

ClassicMacな見た目のブログテーマを自作している当ブログ。スクロールすると右下に目次が表示されるようにしたいのでスクラッチで目次機能を追加してみた。例によってWebMakerを使用しパーツを個別に自作。
うろ覚えなJSの文法を思い出しつつ、ウェブをこねくり回して検索してなんとか作ったのがこちらのクソコード
var headers = document.querySelectorAll('.post-body h2, .post-body h3:not(.post-title), .post-body h4');
var toc = document.getElementById('tocinner');
var i = 0; var k = 0; var j = 0;
var n = 1;
var id, toca;

headers.forEach(function(htag){
if( htag.tagName == 'H2'){
id = 'h2-' + i;
i++;
htag.id = id;
toca = document.createElement('p');
toca.innerHTML = n + '<a href=#' + id + '>' + htag.textContent + '</a>';
toc.appendChild(toca);
n++;
}

if( htag.tagName == 'H3'){
id = 'h3-' + k;
k++;
htag.id = id;
toca = document.createElement('p');
toca.innerHTML = n + '<a href=#' + id + '>' + htag.textContent + '</a>';
toc.appendChild(toca);
n++;
}

if( htag.tagName == 'H4'){
id = 'h4-' + j;
j++;
htag.id = id;
toca = document.createElement('p');
toca.innerHTML = n + '<a href=#' + id + '>' + htag.textContent + '</a>';
toc.appendChild(toca);
n++;
}


});


動くものはできた







というのはわかってる。アマチュアクオリティならこの程度ものなんだよお母さん。コードでやっていることはかんたんで、
  1. Bloggerの投稿セクションの.post-bodyにあるh2~h4タグを収集して
  2. idを追加
  3. #tocに、aタグhref=idで順次追加していく
ということ。H2,H3,H4のために用意したif文ではそれぞれほぼ同じ処理をおこなっているので、重複をswitch文を使用してスリム化
var headers = document.querySelectorAll('.post-body h2, .post-body h3:not(.post-title), .post-body h4');
var toc = document.getElementById('tocinner');
var Hid, toca;
var Hn = 0;


var Hi = 0; var Hk = 0; var Hj = 0;
var m = 0;

headers.forEach(function(htag){
switch(htag.tagName){
case 'H2':
Hn = 2;
Hi++; 
m=Hi;
break;

case 'H3':
Hn = 3;
Hk++;
m=Hk;
break;

case 'H4':
Hn = 4;
Hj++
m=Hj;
break;
   }

Hid = Hn + '-' + m;
htag.id = Hid;
toca = document.createElement('p');
toca.innerHTML = '<a href=#' + Hid + '>' + htag.textContent + '</a>';
toc.appendChild(toca);

});

この処理のために宣言している変数が無駄に多い気がする。もっと減らせないの?難しい処理をしているわけではないんだから。


変数を減らしたい

H2タグ、H3タグ、H4タグが混在している記事中で律儀に

「一個目のH2なら付与するidは2-1で、2個目なら2-2」
「H3だったら3-1,2、H4なら4-1,2,」
というふうに増えていくようにナンバリングしたかったが、

と気づいた。ポルナレフも言っていることだし、ようは順序通りに目次追加ができていて、リンクジャンプで記事のそれぞれヘッダーに飛べればOKじゃぁないかってことで、付与するidはヘッダータグの要素内の値の先頭5文字にしてしまうことにした。これで宣言する変数の数を減らしてしまえ。
function createToc(){
var headers = document.querySelectorAll('.post-body .post-title, .post-body h2, .post-body h3, .post-body h4');
var toc = document.getElementById('toc');
var tocinner = document.createElement('div');
var toca, Hn;
var n = 1;
tocinner.id="tocinner";
headers.forEach(function(htag){
switch(htag.tagName){
case 'H2':
Hn = 0; break;
case 'H3':
Hn = 2; break;
case 'H4':
Hn = 4; break;    }
htag.id = htag.innerHTML.slice(1, 5) + n;
n++;
toca = document.createElement('p');
toca.innerHTML = '<a href="#' + htag.id + '" style="padding-left:' + Hn + 'px" >' + htag.textContent + '</a>';
tocinner.appendChild(toca);
});
toc.appendChild(tocinner);
}
createToc();
改善点としては、divタグを作ってそこへ収集したヘッダーを追加していって、DOMへ追加レンダリングするのは最後にまとめて一回だけ行うようにした。




個別記事ページでのみ目次を表示するようにする

すべてのヘッダータグを収集しているので、Topページ、ラベルページ、アーカイブページなど記事が複数表示されているページでは目次を表示したくない。URLに注目するとそれぞれいかのようになった。
  • TopPage:  https://thmertial.blogspot.com/
  • 個別記事ページ: https://thmertial.blogspot.com/2020/04/bloggerhtml.html
  • ラベル:https://thmertial.blogspot.com/search/label/ラベル名
  • アーカイブ:https://thmertial.blogspot.com/2020/04/
個別記事ページがカレントページだとすると末尾にhtmlがつく。つまり、個別記事ページのURL末尾にhtmlがあれば個別記事ページにアクセスしていることが判定できる。
if ( location.href.lastIndexOf("html") > 0 ){
createToc();     
}

 Bloggerのネイティブコードに、個別記事かどうかを判定するコードがあったはずなのでそれをなんとか利用したいな。。。。



CSSで見た目はどうしよかなぁ

にょう!ってでてくる目次ですが、Macのウィンドウ
っぽい枠にするのもいいんだけどサイズ的にちいさいからなぁ・・・・・・。バランスが悪いなぁ・・・・。と思って、SheepShaverのスクショを漁っていると・・・・・みつけた!!!

クラリスワークスのワードアプリを起動中に出てきた文字変換候補ウィンドウ!これいいじゃん!!目次で表示されたらちょうどええやん!この変換候補ウィンドウに目次のヘッダーが入ってほしいぞ

「左側のボツボツはグラデーションのドット表現でいけるな!」
とか思ったら、さぁぁぁとWebMakerで完成させてしまった。微妙にずれがあるかもだけどだいたいこんなもんだろう。右側のスクロールバーを実装できてないんだけど、スクロールバーのCSSってどうやってつくるんだろうか・・・。

BloggerのHTMLエディタが使いづらいのを工夫する

BloggerのHTMLエディタがいつの間にかシャレオツな外観になっていた。HTMLエディタのアップデートはフォーラムの情報をみると2019 9/25には到来していた模様で、投稿主の方が言っている通りこの新エディタのまじで不満な点は、更新ボタンを押すと編集地点からエディタ内の最上部に強制的に戻されること。これをなんとかできないか




ツールバーの位置を変更する

拡張機能を使用して独自CSSを設定し、下部右にあったツールバーを上部Blogger隣へ持ってきた。使用した拡張はLive editor for CSS, Less & Sass - Magic CSS - Chrome ウェブストア。この拡張機能をクリックした後のみWebページに独自CSSを設定できる。

これが
こうなった。

最下部にあったツールバーを上に持ってきたことで、ウィジェット間ジャンプをマウスクリックでやりやすくした。ツールバー一段左のボタンをクリックするとドロップダウンでウィジェットへのショートカットが表示される。













「俺は編集していた地点へ戻るぞジョジョーッ!」


は残念ながらできないが、ボタンをの利便性を上げてリロードのたびにマウススクロールを大量に行う手間を省いた。ウィジェット位置へ大雑把に移動できればOK!コードは以下。

.FHNj3b {
        display: flex;
        flex: 0 0 auto;
        position: fixed;
        left: 50%;
        top: 0;
        z-index: 1000;
        transform: translate(-100%, 10px);
    border: none;
}

.FHNj3bなどのセレクタは、要素ピッカーでマウスオーバー&クリックでグラフィカルに取得できます。




独自JavaScriptで編集していた地点へ戻れるが、実行方法がわからない

クリックで拡大
BloggerのHTMLコードエディタにおいて、スクロールを司っている要素のクラスは.CodeMirro-vscrollbarというもの。ChromeDevツールのコンソールで以下を実行すると、スクロール量を調節できる。
var code = document.querySelector('.CodeMirror-vscrollbar');
code.scrollTop = 50;
しかしながら、このコードをページ中の要素へイベントハンドラ登録ができない

例えばこの画像みたいに、Bloggerロゴ右に<button>を自前JSで追加してみた。こちらの拡張機能Custom JavaScript for Websites 2 - Chrome ウェブストアを使えば独自JSを実行できる。

このボタンをクリックしたら上記コード実行という処理を記述してみたけど、NGだった。これはGoogleの仕様?でページ内に後付けイベントハンドラを登録できないようにしてあるっぽい。Consoleや拡張機能越しには実行できるみたいなんだけど・・・・

いちいちcode.scrollTopの値を書き換えて実行するとかだるいので、JSをショートカットキーで呼び出せるような拡張機能があればうまくいきそうなもんだけど。。

ClassicMacIcons & Logos