(2022/04/06 2年近く放置したOGP問題を解決したので加筆。Eleventyに移行したので記事の内容は古いです)
便利なMarkdownチートシートは健在
エアコミケ98に合わせて記事公開するつもりが、公開後もソースをゴリゴリ直してました。
最終的にテンプレートと同じのを自作というありがちな方法で完成したので、文章も再々構築しました。
同人サークル「悦楽舎」代表、及びサイト管理人のhoshi(@hoshi903)です。よろしく(挨拶は基本)
と、blogっぽいものは昔置いてました。
blog(日記)はメモ帳にHTML手打ちで乗り切れないコンテンツで、何かを利用する必要(と更新し続ける気力が必要)で、外部サービスを使っても面倒な感じになった(し、遷移したらそこはもう個人サイトじゃないよね)(とか、今も容量50MBでxreaに巨大CGI設置不可とか)という感じです。
当時、何故そんな厄介なものを設置していたのか……CGIの掲示板やチャットなど誰も使っていなくても一通りセットであるのが昔の個人Webサイトで……(遠い目
で、jQueryだのレスポンシブだのの時期が来て、サイト自体を「個人サイト & 悦楽舎」から作品情報中心の「悦楽舎Web」にリニューアルしました(2012年頃)(旧コンテンツは全部無かったことに)
そして最近、10周年記念タオルや、GB向け自作ソフト「ココちゃんGB」、GCゲーム「風タク」のModなど、音楽以外のモノを置く場所に悩みました。
サークル活動やCD情報に特化しすぎて、解説が必要だったりファイルを公開する場所が無いんですね!(今更)
サイト全体としても
ついでに、管理人個人は
告知で時々twitterへのリンク、曲の試聴はbandcampの埋め込みと、その辺のサービスが終わったら微妙にやべーなとか、せっかくWeb開いてくれてるのにtwitterに誘導すんのはどうなん?とかぼんやり考えてます。twitterにはろくなこと書いてないし
個人サイトに拘るのは、情報はなるべく簡潔で一箇所にまとまっていたほうが嬉しいだろうというのと、過去に日記やイラストの毎日更新を挫折した自分は現代のSNS PRバトルに繰り出して毎日アウトプットし続けるのは天地がひっくり返っても無理かな、と
毎日動画投稿とか何人体制なんでしょうね、自慢じゃないですが15秒3本立てのアニメMAD作るのにそれぞれ30分+3時間+2日かかりました
あと、このサイト自体がずっと技術実験場なので何か作る時の題材としてちょうどいいとか(今回のも)
Vue.jsでのblogの作り方を調べると公式の構築例があります。
前述の通り、外部サービスを使うと面倒が押し寄せてきた経験や、(昔の)xreaを信仰しているのでButterCMSは嫌です(我儘)
とりあえず、VueとMarkdownのスターターキットが見つかり、Nuxtは静的ファイルの生成が出来るので最初(blog設置直後)はコレの魔改造版が動いていました(
公開後、色々弄ってNuxtがなんとなくわか(り、息抜きの麻雀でボロ負けして雀豪は到底無理と悟)ったので、1からNuxtとmarkdown-itで動くblogを自作する方向に一気に進みました。
記事一覧コンポーネント、記事へのルーティング、Markdownからの記事生成コンポーネントだけ作ってサクッとできました。
依存関係もこんな感じ
package.json{ // 中略 "dependencies": { "frontmatter-markdown-loader": "^3.4.2", "highlight.js": "^10.0.2", "markdown-it": "^10.0.0", "nuxt": "^2.12.2" }, "devDependencies": { "node-sass": "^4.14.1", "sass-loader": "^8.0.2" } }
Webにありがちな新たなる小手先の技術が一切登場せずシンプルなものがシンプルなままストレートに完成して感動すら覚えます……
もしかしたらNuxtを選択すべきじゃないアレかもしれないが応用から始めて基本を学ぶ全飛ばし逆走学習法なので容赦してほしい
因みにothersのファイル群は新たに借りた容量20倍(1GBまで)のhoshi.s1007.xrea.comに置いてます。
容量50MBでMP3も置けない!みたいな持ちネタを散々披露してきましたが、今2MBくらいなのでサイト全体をNuxtにしても全然いけます(
スターターキットに出てきたNetlifyが気になってました。
静的サイトホスティングサービスで、連携したGitHubリポジトリにPushがあれば自動でビルドしてdeployしてくれるすごいヤツです。
手順は割愛して試した結果です。( github.com/hoshi903/lf_test -> 903.netlify.app )
「NuxtでビルドしてFFFTP開いてファイル選んでアップロード」する必要がなく「git push」して待っていれば変わってる!という経験はとても素晴らしくみなさまにも一度お試しいただきたく(ry
独自ドメインが使えて証明書も発行してくれたりといい感じですが、自分が乗り換えてないのは開いた時にちょっと遅いので……(特にサイズの大きいwebフォント)
比較対象がクソ早いxreaで(&サイト表示1秒未満を心がけてるクソ管理人で)なければ即採用です!おすすめです!たぶん
最初はJavaScriptにファイル構造というのがそれなりに謎で、そこからジェネレーションギャップを埋めつつ進めて普通のバックエンド開発になったのかなという理解になりました。やっぱりJavaScriptはJavaの亜種になったのかな(
とりあえず、微妙に余ってたサブドメインも有効利用したし(hoshi.903.ch)、デザインもちゃんと共通にできたし、構築はだいたい目標通りです。
これ以降も、自作ソフトやModの記事、エアコミケ98やVket4の告知の詳細、画像がたくさんあるページ(?)などを追加していくと思います。
必要そうな感じになってきたらタグ機能とか一覧のソート機能とか追加します。
ではでは(〆の死語)
……ここで記事が終われていればどんなに良かったことか、続きます。(初版5/5→追記5/11、5/12、12/20)
Webにありがちな小手先の技術、続々登場です!!(ブチ切れ)
Markdown-it v10.0.0 で aタグに target="_blank" rel="noopener"
が付くように改変します。
/markdown-it/lib/rules_inline/link.js 137行目// この行を token.attrs = attrs = [ [ 'href', href ] ]; // 書き換える token.attrs = attrs = [ [ 'href', href ], [ 'target', '_blank' ], [ 'rel', 'noopener' ] ];
付録のチートシートにリンクの使い分け方を載せておきます(同じタブで開きたい時はaやn-linkタグを書く)
/markdown-it/lib/rules_inline/image.js 140行目// この行を token.attrs = attrs = [ [ 'src', href ], [ 'alt', '' ] ]; // 書き換える token.attrs = attrs = [ [ 'src', (適当なbase64ダミー) ], [ 'data-src', href ], [ 'alt', '' ], [ 'class', 'lazyload' ] ];
応用してimgタグはlazysizesの基本形にしました。
周辺のjsファイルもHTMLタグに結びついた似たようなソースコードっぽいです。
改変するならいくつやっても同じなんで他のタグもカスタマイズしてキミだけの最強のmarkdown-itを作ろう!(
(22年4月追記) 今はeleventy-plugin-external-linksとeleventy-plugin-lazyimages使ってます。
さっきから黒いエリアに付いてる白いラベルです。これもMarkdown-itを改変します。
/markdown-it/lib/renderer.js の default_rules.fence の中身// fileNameを保持出来るように改変する var fileName = ''; if (info) { langName = info.split(":")[0]; fileName = info.split(":")[1]; }
同上 if (info) {} のほうのreturn// returnは return '<pre><code' + slf.renderAttrs(tmpToken) + '>' + highlighted + '</code></pre>\n'; // 三項演算子でなんだかなあという形にする return fileName ? '<pre><div><small>' + fileName+ '</small></div><code' + slf.renderAttrs(tmpToken) + '>' + highlighted + '</code></pre>\n': '<pre><code' + slf.renderAttrs(tmpToken) + '>' + highlighted + '</code></pre>\n';
あとは適当にCSSをキメてヨシ!
githubにnode_modulesは上げないのでNetlifyで楽々更新とか出来なくなってしまった
(22年4月追記) ハイライトはprism.jsに、ラベル出すのはeleventyのaddPairedShortcodeを使うようにしました。
長い記事を書いていてページ内ジャンプが欲しくなったので追加します。
/markdown-it/lib/rules_block/heading.js 42行目// この行を挿入 if(level < 4){ token = state.push('paragraph_open', 'p', 1); token.attrs = [ [ 'id', state.src.slice(pos, max).replace(/<("[^"]*"|'[^']*'|[^'">])*>|\s+/g,'') ] ]; token.map = [ startLine, state.line ]; token = state.push('paragraph_close', 'p', -1); }
hタグにid付spanタグが一緒に追加されるようになったので、後はaタグでジャンプ
/markdown-it/lib/rules_block/hr.js 41行目token.attrs = [ [ 'noshade', '' ] ];
ふわっと消えるとかそういう微妙な効果を入れるんじゃなくて、nuxt-linkタグで記事から記事へ飛んだ時にスクロール位置が記憶されてる(記事の途中から表示してしまう)やつを修正します
Nuxt(2.7以上?)はpageTransitionが勝手に効くので利用します
nuxtタグをtransitionタグで囲う
Layouts/***.vue<transition name="page"> <nuxt/> </transition>
CSSでアニメーションの始点の効果だけ設定
CSS.page-enter { display: none;} /* Scroll位置対策 */
こうしておけば記事のDOMが消えてから再描画されるのでスクロール位置も吹き飛びます。
怒りにまかせてかなり乱暴な書き方したけど意外と大丈夫だった(検証漏れあるかも)
Vueのtransitionタグは死んだ、もう動かない
例: タイトルの右スライド書き直し
HTML<!-- 在りし頃のtransitionタグ --> <transition name="right-fade"> <div v-show="showOther" class="big"> <span><i class="fa fa-fw fa-pencil"></i>others.</span> </div> </transition> <!-- Nuxtで諦めた版 --> <div class="big anime right-fade"> <span><i class="fa fa-fw fa-pencil"></i>others.</span> </div>
CSS/* 在りし頃のtransitionタグ用CSS */ .right-fade-enter-active { transition: all .5s ease .15s;} .right-fade-enter { transform: translateX(-30px);} /* Nuxtで諦めた版 */ .anime.right-fade { animation: rightslide .5s ease .15s backwards; }
keyframesはそのまま@keyframes rightslide { 0% {transform: translateX(-30px); } 100% {transform: translateX(0px); } }
ルーティングがこんなにも簡単にできるなんて、ワタクシとても感動いたしましたわ。
headタグの中身も変わってて素晴らし...OGP出て来ねぇじゃん、クローラーがjs実行しない...?そうか...
選択肢は3つで、
まだ記事は少ないし個人サイトなので2番です(
クローラーがjsを実行するようになればちゃんとOGPが出るように出来てるはずなので待ちます。
(22年4月追記) EleventyでSSG化して解決しますた。早くなったしファイル数も減って管理しやすい。最高。
昔のさ~、s54.xrea.comだから、50MBしかなくてさ~、つら......
えっ
1GB増量は2013年の新サーバー(s600以降)だけじゃなかったの?2017年のマイグレで全アカウント増量されたのか??いつから容量が50MBしか無いと錯覚していた???ここの表記は何????一体どうなtt
書こうと思った時に忘れてていつもQiitaとかに辿り着いていませんか?俺がそれ
↓
***
---
# h1 Heading
## h2 Heading
### h3 Heading
#### h4 Heading
##### h5 Heading
###### h6 Heading
太字になるやつ
太字になるやつ
斜体になるやつ
斜体になるやつ
取り消し線が付くやつ
**太字になるやつ**
__太字になるやつ__
*斜体になるやつ*
_斜体になるやつ_
~~取り消し線が付くやつ~~
(HTML書くとそのまま動く)
<br>
昔流行った虹色文字も今はCSS3で楽に書けていいね(全く使わないけど)
薄い文字
クソデカ感情
完全にミジンコ
#FF3C28
<span style="color: #000000; background: -webkit-linear-gradient(0deg, #0000FF, #FF0000, #00FF00); -webkit-background-clip: text; -webkit-text-fill-color: transparent;">昔流行った虹色文字も今はCSS3で楽に書けていいね(全く使わないけど)</span>
<font color="lightgray">薄い文字</font>
<big>クソデカ感情</big>
<small>完全にミジンコ</small>
<img src="https://via.placeholder.com/16/FF3C28/FFFFFF/?text=%20" class="inline">`#FF3C28`
(改変済) そのままでも target="_blank" rel="noopener"
が付く状態にしたので、以下のように使い分け
「target="_blank"」の判定も自動になったので使い分けとか考えずMarkdownで書けばおk
新しいウィンドウで開く blog内は同じウィンドウで開きます。
SPAじゃないから使えない。
[新しいウィンドウで開く](/blog/20200505_c98/ "エアコミケ98の記事")
<n-link to="/blog/20200505_c98/">同じウィンドウで開く(nuxt-linkによる遷移)</n-link>
<a href="/blog/20200505_c98/">同じウィンドウで開く(属性なしのaタグ)</a>
summary下は空白行必須
<details><summary>クリックで開く</summary>
summary下は空白行必須
</details>
+
、 -
、*
のいずれかを付けます+ リストを作成するときは頭に`+`、 `-`、`*`のいずれかを付けます
+ インデント(スペース2つ)を入れて続けると段落が付きます
- 頭につける記号を変えると別のリストとして生成されます
* おおきくすってせーの
+ あ・え・い・う・え・お
- あお
+ ジャーン!
頭に数字がつくほう
1. ナリタウマレタママブライアン
2. ライスシャワー
3. ズガイコツマルダシ
1. オーラス東家、35000点
1. 南家、35000点(1で始めても自動で数字を割り振ってくれます)
57. 数字を途中から
1. 始めることもできます
インライン code
インデント(スペース4つ)
// Some comments
line 1 of code
line 2 of code
line 3 of code
// Some comments
line 1 of code
line 2 of code
line 3 of code
囲う感じのやつ(バッククオートは Shift + @
で出る)
Sample text here...
```
Sample text here...
```
(改変済) ファイル名ラベルを付けることが出来ます。 シンタックスハイライトも可能(highlight.js導入済)
test.jsvar foo = function (bar) { return bar++; }; console.log(foo(5));
``` js:test.js
var foo = function (bar) {
return bar++;
};
console.log(foo(5));
```
引用です
不等号を重ねると入れ子になります
スペースを挟んでても機能します
> 引用です
>> 不等号を重ねると入れ子になります
> > > スペースを挟んでても機能します
(たぶん使うときまで後回し)
Option | Description |
---|---|
data | path to data files to supply the data that will be passed into templates. |
engine | engine to be used for processing templates. Handlebars is the default. |
ext | extension to be used for dest files. |
| Option | Description |
| ------ | ----------- |
| data | path to data files to supply the data that will be passed into templates. |
| engine | engine to be used for processing templates. Handlebars is the default. |
| ext | extension to be used for dest files. |
Right aligned columns
Option | Description |
---|---|
data | path to data files to supply the data that will be passed into templates. |
engine | engine to be used for processing templates. Handlebars is the default. |
ext | extension to be used for dest files. |
Right aligned columns
| Option | Description |
| ------:| -----------:|
| data | path to data files to supply the data that will be passed into templates. |
| engine | engine to be used for processing templates. Handlebars is the default. |
| ext | extension to be used for dest files. |
Markdownで貼ることも出来るが、サイズ調整すらなくて一切融通がきかない
![Dojocat](https://octodex.github.com/images/dojocat.jpg "The Dojocat")
画像に適用されてるCSSimg{ max-width: 100%; }
で、Webエンジニアは何かに付けてす~ぐflexboxを使い出す(くらい、CSS3のこれで本当に革命が起きた)(clearfix?知らない子ですね)
<div class="flex">
<img src="https://octodex.github.com/images/minion.png" alt="Minion">
<img src="https://octodex.github.com/images/stormtroopocat.jpg" alt="Stormtroopocat">
<img src="https://octodex.github.com/images/dojocat.jpg" alt="Dojocat">
</div>
<div class="flex">
<img src="https://octodex.github.com/images/droctocat.png" alt="Droctocat">
<img src="https://octodex.github.com/images/spidertocat.png" alt="Spidertocat">
</div>
画像の追加SCSSdiv.flex{ display: flex; > img{ flex : 1 1 auto; width: 0%; } }
改めてgif、APNG、mp4(h.264)を比較したがmp4が圧倒的に有利、動画は素直にvideoタグ使うべき
(22年4月追記) コーデックはh.264よりAV1のほうが良い感じ(容量が更に1/3になった、けどiOS対応いつ?)
(自動再生)
<video src="/img/20200505_blog/hand.mp4" playsinline muted autoplay loop></video>
(手動再生)
<video src="/img/20200505_blog/hand.mp4" playsinline muted controls loop preload="auto"></video>
(以上、無音mp4。59frames、99KB)
<img src="/img/20200505_blog/hand.gif">
<img src="/img/20200505_blog/hand.png">
Markdownだけで記事が全部書ける......そんなふうに考えていた時期が俺にもありました