From a3a72bd8d86841c6bb16d301a268d8a3bd722778 Mon Sep 17 00:00:00 2001 From: 安竹洋平 <61961825+yasutakeyohei@users.noreply.github.com> Date: Thu, 1 Feb 2024 22:58:57 +0900 Subject: build --- build/blog/atom.xml | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 3 deletions(-) (limited to 'build/blog/atom.xml') diff --git a/build/blog/atom.xml b/build/blog/atom.xml index 4e835f80..7102eea2 100644 --- a/build/blog/atom.xml +++ b/build/blog/atom.xml @@ -2,11 +2,90 @@ https://yasutakeyohei.com/docs/blog 東京都小平市議・安竹洋平のまとめ Blog - 2024-01-27T00:00:00.000Z + 2024-01-31T00:00:00.000Z https://github.com/jpmonette/feed 東京都小平市議・安竹洋平のまとめ Blog https://yasutakeyohei.com/docs/img/favicon.ico + + <![CDATA[合気公園の工事進捗状況]]> + https://yasutakeyohei.com/docs/blog/2024/01/31/index + + 2024-01-31T00:00:00.000Z + + 小平市上水南町二丁目の佐川幸義邸跡地に新設される合気公園の工事進捗状況を見てきましたので、写真と動画で現在の様子をお知らせします。

+

順調に進んでいるようですね😊

+

これまでの経緯

+

合気公園に関してこれまでの経緯はこちら↓にまとめています。

+ +

市民による公園整備案

+

旧佐川邸の公園化を考える会が市に提出した公園計画案はこちら↓(ランドスケープデザイナー・鈴木綾による)

+

旧佐川邸の公園化を考える会が市に提出した合気公園計画案

+

市の整備イメージ案

+

上記の提案を受けて市が令和5年5月に提示した整備イメージ案がこちら↓

+

市民による計画案を受けて小平市水と緑と公園課が提示した合気公園整備イメージ案

+

この整備イメージに基づいて整備が進んでいます。

+

写真

+

以下の写真と動画は令和6年1月30日(火)に撮影したものです。

+

お知らせ

+

合気公園整備中・お知らせ

+

野外卓・顕彰碑・背なしベンチ

+

合気公園整備中・野外卓・顕彰碑・背なしベンチ

+

パーゴラ・顕彰碑

+

養生されている道場跡の部分が見えます。

+

合気公園整備中・パーゴラ・顕彰碑

+

メッシュフェンス・ブロック

+

合気公園整備中・メッシュフェンス・ブロック

+

水飲み場・東側出入口

+

園名碑が少し写っています。トラックが止まっていて撮影できませんでした。

+

水飲み場・東側出入口

+

合気公園整備中・水飲み場・東側出入口

+

庭園付近

+

合気公園整備中・庭園付近

+

西側出入口への道・目隠しフェンス

+

合気公園整備中・西側出入口への道・目隠しフェンス

+

南東の角

+

道路が拡幅されていることが分かります。

+

合気公園整備中・南東の角

+

庭園

+

このあたりは今後手が入るのかもですね。

+

合気公園整備中・園庭

+

売却予定地

+

奥の砂が盛ってあるところが売却予定地です。

+

合気公園整備中・売却予定地(奥の砂が盛ってあるところ)

+

拡幅された東側道路

+

合気公園整備中・拡幅された東側道路

+

道路拡幅は売却予定地前まで

+

合気公園整備中・道路拡幅は売却予定地前まで

+

佐川氏が四股を踏んでいたとされる石

+

右下の平らな石が佐川幸義氏が四股を踏んでいたとされる石です。

+

合気公園整備中・四股を踏んでいたと思われる石

+

西側出入口

+

案内板はまだ設置されていません。

+

合気公園整備中・西側出入口

+

西側園路と目隠しフェンス

+

合気公園整備中・西側園路と目隠しフェンス

+

西側の工事看板・目隠しフェンス上部

+

目隠しフェンス上部は人が乗り越えられないような突起が出ています。

+

合気公園整備中・西側の工事看板・目隠しフェンス上部

+

西側園路の舗装

+

合気公園整備中・西側園路の舗装

+

動画

+ +

以上です。完成が楽しみですね。

]]>
+ + 安竹 洋平 + yohei@yasutakeyohei.com + https://yasutakeyohei.com + + + + + +
<![CDATA[Docusaurusの注意書きや警告文のタイトルを見出しにして、目次にも乗せる方法]]> https://yasutakeyohei.com/docs/blog/2024/01/27/docusaurus-admonition-heading-toc @@ -27,7 +106,7 @@
infoの例

ここに文章を書く

しかし(DocusaurusV3.1)でこのAdmonitionのタイトルは見出し(Heading)にならず、目次(TOC)にも乗りません。上記例なら「INFOの例」がTOCに表示されません。

次の図からも分かっていただけるかと思います。

-

Admonitionのタイトルが見出しになら�ない

+

Admonitionのタイトルが見出しにならない

些細なことのようにも思えますが、Docusaurusを書籍のように扱うには結構気になるところ。

なお以前はAdmonitionのタイトルはH5要素になっていたようですが、深さ(H1~H5のレベル)を決め打ちするのは好ましくないということから(?)、今はH5要素ではありません。

次のように本文中に見出しを書く方法もありますが

@@ -90,7 +169,7 @@

Remark/Rehypeプラグイン

次にプラグインを実装します。

docusaurusのsrcディレクトリ下にrehypeとremarkというディレクトリを作り、次のファイル名と内容で2つのプラグインを作ります。

-
src/rehype/admonition-title-to-heading-before-toc.js
import {visit} from 'unist-util-visit';

const plugin = (options) => {
const transformer = async (ast) => {
let newBeginningText = "";
const visitor = ((node, index, parent) => {
if (node.type === 'containerDirective') {
// :::infoなどに続くタイトル冒頭Text部(冒頭#を含む(もしくは含まない)部分)を取得(:::info ##** )
// (タイトル全体にはHTML等が含まれる可能性があるため冒頭Text部だけ操作する、残りはシャロ―コピー)
const beginningText = node.children[0].children[0].value;

// タイトル冒頭Text部に#が2つ以上連続しているとき
if(/^##/.test(beginningText)) {
// タイトル冒頭部から#とそれに続く空白を削除
newBeginningText = beginningText.replace(/^#+/, '').trim();

// タイトル部冒頭だけ更新し、残りはシャロ―コピー
// まずタイトル部全体をシャロ―コピー
let titleNodes = [...node.children[0].children];

// 冒頭要素のvalueを更新(ほかはシャロ―コピー)
const newTitleBeginningNode = {
...titleNodes[0],
value: newBeginningText,
}

// タイトルノードの冒頭要素だけ更新(ほかはシャロ―コピー)
const newTitleNodes = [ ...titleNodes ];
newTitleNodes[0] = newTitleBeginningNode;

// visitしているcontainerDirectiveの前にheadingノードを追加
parent.children.splice(index, 0, {
type: 'heading',
depth: (beginningText.match(/^##+/) || [''])[0].length, // #の連続数がheadingの深さ
children: newTitleNodes,
});
// 次に検索するのはindexを2つ分飛ばしたノード
return index + 2;
}
}
});

visit(ast, 'containerDirective', visitor);

};
return transformer;
};

export default plugin;
+
src/rehype/admonition-title-to-heading-before-toc.js
import {visit} from 'unist-util-visit';

const plugin = (options) => {
const transformer = async (ast) => {
let newBeginningText = "";
const visitor = ((node, index, parent) => {
if (node.type === 'containerDirective') {
// :::infoなどに続くタイトル冒頭Text部(冒頭#を含む(もしくは含まない)部分)を取得(:::info ##** )
// (タイトル全体にはHTML等が含まれる可能性があるため冒頭Text部だけ操作する、残りはシャロ―コピー)
const beginningText = node.children[0].children[0].value;

// タイトル冒頭Text部に#が2つ以上連続しているとき
if(/^##/.test(beginningText)) {
// タイトル冒頭部から#とそれに続く空白を削除
newBeginningText = beginningText.replace(/^#+/, '').trim();

// タイトル部冒頭だけ更新し、残りはシャロ―コピー
// まずタイトル部全体をシャロ―コピー
let titleNodes = [...node.children[0].children];

// 冒頭要素のvalueを更新(ほかはシャロ―コピー)
const newTitleBeginningNode = {
...titleNodes[0],
value: newBeginningText,
}

// タイトルノードの冒頭要素だけ更新(ほかはシャロ―コピー)
const newTitleNodes = [ ...titleNodes ];
newTitleNodes[0] = newTitleBeginningNode;

// visitしているcontainerDirectiveの前にheadingノードを追加
parent.children.splice(index, 0, {
type: 'heading',
depth: (beginningText.match(/^##+/) || [''])[0].length, // #の連続数がheadingの深さ
children: newTitleNodes,
});
// 次に検索するのはindexを2つ分飛ばしたノード
return index + 2;
}
}
});

visit(ast, 'containerDirective', visitor);

};
return transformer;
};

export default plugin;
src/rehype/admonition-title-to-heading-after-toc.js
import {visit} from 'unist-util-visit';

const plugin = (options) => {
const transformer = async (ast) => {
let hId = null;
let hContent = null;
visit(ast, 'element', (node, index, parent) => {
if (/^h[2-6]$/.test(node.tagName) && node.properties && node.properties.id) {
// H要素(h2~h6)を見つけた場合

// IDとタイトルの冒頭Text部を取得する
hId = node.properties.id;
hContent = node.children ? node.children[0].value :
node.children[0].children[0] ? node.children[0].children[0].value : '';

// 続くAdmonitionを探す(docはH要素とadmonitionが連続しているが
// blogではなぜか改行要素{ type:'text', value:'\n' }が間に入っているので念のため隣接3要素を探す
for (let i = index + 1; i < index + 4 && i < parent.children.length; i++) {
if(parent.children[i] && parent.children[i].tagName === 'admonition') {
// admonition(div)を見つけた場合
const admonitionNode = parent.children[i];

// admonitionタイトルの冒頭Text部分を取得(properties.titleもしくはchildren[0].children[0].value)
const admonitionNodeTitle = admonitionNode.properties.title ? admonitionNode.properties.title :
admonitionNode.children[0] && admonitionNode.children[0].children[0] ? admonitionNode.children[0].children[0].value : '';

if(/^##/.test(admonitionNodeTitle) && admonitionNodeTitle.replace(/^#+/, '').trim() === hContent.trim()) {
// #で始まっていて、タイトル冒頭部が同じ場合
// divのidをHタグのidに設定
admonitionNode.properties.id = hId;
// H要素を削除
parent.children.splice(index, 1);
}
}
}
}
});
};
return transformer;
};

export default plugin;
Admonitionのツリー構造

参考までに、Remarkのプラグインから見るとAdmonitionのASTは例えば次のようになっています。

Admonitionのツリー構造(一例)
{
type: 'containerDirective',
name: 'info',
attributes: {},
children: [
{
type: 'paragraph',
data: { directiveLabel: true },
children: [
{
type: 'text',
value: '#### info title もしHTML等が入ると(ここにaタグを入れると)',
position: [Object]
},
{
type: 'mdxJsxTextElement',
name: 'a',
attributes: [],
position: [Object],
data: [Object],
children: [Array]
},
{ type: 'text', value: 'このようにタイトル部が別々の要素として配列に入っている。', position: [Object] }
],
position: {
start: { line: 1347, column: 8, offset: 34053 },
end: { line: 1347, column: 55, offset: 34100 }
}
},
{ type: 'paragraph', children: [Array], position: [Object] },
...
],
...
}

Swizzling

-- cgit v1.2.3-54-g00ecf