モジュール:自治体検索

モジュールの解説[表示] [編集] [履歴] [キャッシュを破棄]

このモジュールは日本の地方公共団体一覧で地方公共団体を読み仮名で検索するためのモジュールです。日本以外には対応しておらず、プレフィックス検索以外にも対応していません。

自治体のデータはモジュール:自治体検索/dataにあります。

local conv
do
	local list={}
	local z={
		{
			0,
			"ぁぃぅぇぉっゃゅょ",
			"あいうえおつやゆよ"
		},
		{
			2,
			"がぎぐげござじずぜぞだぢづでどばびぶべぼ",
			"かきくけこさしすせそたちつてとはひふへほ"
		},
		{
			3,
			"ぱぴぷぺぽ",
			"はひふへほ"
		}
	}
	for _,v in ipairs(z) do
		for i=0,#v[2]/3-1 do
			list[string.sub(v[2],i*3+1,i*3+3)]={string.sub(v[3],i*3+1,i*3+3),v[1]}
		end
	end
	conv=list
end
local function read(node,p)
	local list={}
	local so={"",0}
	for i=0,#node.kana/3-1 do
		local k=string.sub(node.kana,i*3+1,i*3+3)
		local c=conv[k]
		if(c==nil) then
			c={k,1}
		end
		so[1]=so[1]..c[1]
		so[2]=so[2]*10+c[2]
	end
	table.insert(list,{code=node.code,name=node.name,kana=node.kana,parent=string.sub(p,2),so=so})
	if(node.sub~=nil) then
		for _,subnode in ipairs(node.sub) do
			if(subnode.code~=13100 and not string.match(subnode.name,"支庁$")) then
				for _,item in ipairs(read(subnode,p.." "..node.name)) do
					table.insert(list,item)
				end
			else
				for _,subsubnode in ipairs(subnode.sub) do
					for _,item in ipairs(read(subsubnode,p.." "..node.name)) do
						table.insert(list,item)
					end
				end
			end
		end
	end
	return list
end
local function create()
	local list={}
	for i,node in ipairs(require("Module:自治体検索/data")) do
		for i,item in ipairs(read(node,"")) do
			table.insert(list,item)
		end
	end
	do
		local namelist={}
		for _,item in ipairs(list) do
			table.insert(namelist,item.name)
		end
		table.sort(namelist)
		local dp={}
		for i=1,#namelist-1 do
			if(namelist[i]==namelist[i+1]) then
				dp[namelist[i]]=true
			end
		end
		for _,item in ipairs(list) do
			if(dp[item.name]==true) then
				item.disambiguation=string.match(item.name,"区$") and string.match(item.parent,"[^ ]+$") or string.match(item.parent,"^[^ ]+")
			end
		end
	end
	local index={}
	for i=0,50 do
		table.insert(index,i)
	end
	return{
		width=128*7,
		height=512,
		signals={
			{
				name="k",
				init="",
				streams={
					{
						type="@clear:click",
						expr="''"
					},
					{
						type="@add:click",
						expr="k+datum.c"
					}
				}
			},
			{
				name="activeitem",
				init=nil,
				streams={
					{
						type="@item:mouseover",
						expr="datum"
					},
					{
						type="@item:mouseout",
						expr="null"
					}
				}
			},
			{
				name="o",
				init=nil,
				streams={
					{
						type="@item:click",
						expr="open('https://ja.wikipedia.org/wiki/'+datum.name+(datum.disambiguation==null?'':'_('+datum.disambiguation+')'))"
					}
				}
			}
		},
		data={
			{
				name="i",
				values=index,
			},
			{
				name="list",
				values=list,
				transform={
					{
						type="filter",
						test="length(k)>0 && test('^'+k,datum.so[0])"
					},
					{
						type="sort",
						by={"so[0]","so[1]"}
					},
					{
						type="rank"
					},
					{
						type="filter",
						test="datum.rank<=120"
					},
					{
						type="formula",
						field="r",
						expr="[16+floor((datum.rank-1)/24)*128,16+(datum.rank-1)%24*20,128-16,18]"
					}
				}
			},
			{
				name="activeitem",
				source="list",
				transform={
					{
						type="filter",
						test="activeitem!=null && datum.code==activeitem.code"
					},
					{
						type="formula",
						field="p",
						expr="[datum.r[0]+32,if(datum.r[1]<512-64,datum.r[1]+32,datum.r[1]-48),32+max(length(datum.kana),length(datum.parent))*14,if(length(datum.parent)>0,40,24)]"
					}
				}
			},
			{
				name="kana",
				values={"あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもや・ゆ・よらりるれろわ・・・・ん"},
				transform={
					{
						type="cross",
						with="i"
					},
					{
						type="formula",
						field="c",
						expr="datum.a.data[datum.b.data]"
					},
					{
						type="filter",
						test="datum.c!='・'"
					}
				}
			}
		},
		marks={
			{
				type="text",
				properties={
					enter={
						align={
							value="left"
						},
						baseline={
							value="middle"
						},
						fill={
							value="black"
						},
						fontSize={
							value=18
						},
						font={
							value="TakaoGothic"
						}
					},
					update={
						x={
							value=672
						},
						y={
							value=32
						},
						text={
							signal="k"
						}
					}
				}
			},
			{
				type="text",
				name="clear",
				properties={
					enter={
						align={
							value="center"
						},
						baseline={
							value="middle"
						},
						fill={
							value="black"
						},
						fontSize={
							value=18
						},
						font={
							value="TakaoGothic"
						},
						cursor={
							value="pointer"
						}
					},
					update={
						x={
							value=880
						},
						y={
							value=32
						},
						text={
							value="×"
						},
					}
				}
			},
			{
				type="text",
				name="add",
				from={
					data="kana",
					transform={
						{
							type="formula",
							field="p",
							expr="[880-floor(datum.b.data/5)*22,64+(datum.b.data%5)*22]"
						}
					}
				},
				properties={
					enter={
						align={
							value="center"
						},
						baseline={
							value="middle"
						},
						fill={
							value="black"
						},
						fontSize={
							value=16
						},
						font={
							value="TakaoGothic"
						},
						cursor={
							value="pointer"
						}
					},
					update={
						x={
							field="p[0]"
						},
						y={
							field="p[1]"
						},
						text={
							field="c"
						}
					}
				}
			},
			{
				type="rect",
				name="item",
				from={
					data="list",
					transform={
						{
							type="formula",
							field="color",
							expr="(activeitem!=null && datum.code==activeitem.code)?'pink':'transparent'"
						}
					}
				},
				properties={
					enter={
						cursor={
							value="pointer"
						}
					},
					update={
						fill={
							field="color"
						},
						x={
							field="r[0]"
						},
						y={
							field="r[1]"
						},
						width={
							field="r[2]"
						},
						height={
							field="r[3]"
						}
					}
				}
			},
			{
				type="text",
				from={
					data="list",
				},
				interactive=false,
				properties={
					enter={
						baseline={
							value="top"
						},
						fill={
							value="blue"
						},
						font={
							value="TakaoGothic"
						}
					},
					update={
						x={
							field="r[0]",
							offset=4
						},
						y={
							field="r[1]",
							offset=1
						},
						text={
							field="name"
						},
						fontSize={
							value=15
						}
					}
				}
			},
			{
				type="rect",
				from={
					data="activeitem",
				},
				properties={
					enter={
						fill={
							value="white"
						},
						fillOpacity={
							value=0.9
						},
						stroke={
							value="black"
						},
						strokeWidth={
							value=0.5
						}
					},
					update={
						x={
							field="p[0]"
						},
						y={
							field="p[1]"
						},
						width={
							field="p[2]"
						},
						height={
							field="p[3]"
						}
					}
				}
			},
			{
				type="text",
				from={
					data="activeitem",
				},
				properties={
					enter={
						baseline={
							value="top"
						},
						fill={
							value="black"
						},
						font={
							value="TakaoGothic"
						}
					},
					update={
						x={
							field="p[0]",
							offset=4
						},
						y={
							field="p[1]",
							offset=4
						},
						text={
							field="kana"
						},
						fontSize={
							value=15
						}
					}
				}
			},
			{
				type="text",
				from={
					data="activeitem",
				},
				properties={
					enter={
						baseline={
							value="top"
						},
						fill={
							value="black"
						},
						font={
							value="TakaoGothic"
						}
					},
					update={
						x={
							field="p[0]",
							offset=4
						},
						y={
							field="p[1]",
							offset=20
						},
						text={
							field="parent"
						},
						fontSize={
							value=15
						}
					}
				}
			}
		}
	}
end
return {
	_=function(frame)
		return frame:extensionTag('graph',mw.text.jsonEncode(create()),{mode='interactive',title='検索'})
	end
}