<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://kawala.in/index.php?action=history&amp;feed=atom&amp;title=%EB%AF%B8%EB%94%94%EC%96%B4%EC%9C%84%ED%82%A4%3AGadget-CU.js</id>
	<title>미디어위키:Gadget-CU.js - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://kawala.in/index.php?action=history&amp;feed=atom&amp;title=%EB%AF%B8%EB%94%94%EC%96%B4%EC%9C%84%ED%82%A4%3AGadget-CU.js"/>
	<link rel="alternate" type="text/html" href="https://kawala.in/index.php?title=%EB%AF%B8%EB%94%94%EC%96%B4%EC%9C%84%ED%82%A4:Gadget-CU.js&amp;action=history"/>
	<updated>2026-06-11T02:27:21Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://kawala.in/index.php?title=%EB%AF%B8%EB%94%94%EC%96%B4%EC%9C%84%ED%82%A4:Gadget-CU.js&amp;diff=243&amp;oldid=prev</id>
		<title>2026년 5월 27일 (수) 15:14에 Kawalain님의 편집</title>
		<link rel="alternate" type="text/html" href="https://kawala.in/index.php?title=%EB%AF%B8%EB%94%94%EC%96%B4%EC%9C%84%ED%82%A4:Gadget-CU.js&amp;diff=243&amp;oldid=prev"/>
		<updated>2026-05-27T15:14:48Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026년 5월 28일 (목) 00:14 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l233&quot;&gt;233번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;233번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					$(&amp;#039;&amp;lt;p style=&amp;quot;color:#f6ff73&amp;quot;&amp;gt;&amp;#039;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					$(&amp;#039;&amp;lt;p style=&amp;quot;color:#f6ff73&amp;quot;&amp;gt;&amp;#039;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;						.append(&amp;#039;&amp;lt;i class=&amp;quot;cu-icon c-9&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;#039;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;						.append(&amp;#039;&amp;lt;i class=&amp;quot;cu-icon c-9&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;#039;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;						.append(`${locale.source.other.itemvalue}${displayItemValue}&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;c&lt;/del&gt;`),&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;						.append(`${locale.source.other.itemvalue}${displayItemValue}`),&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key wiki:diff:1.41:old-230:rev-243:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Kawalain</name></author>
	</entry>
	<entry>
		<id>https://kawala.in/index.php?title=%EB%AF%B8%EB%94%94%EC%96%B4%EC%9C%84%ED%82%A4:Gadget-CU.js&amp;diff=230&amp;oldid=prev</id>
		<title>2026년 5월 27일 (수) 13:08에 Kawalain님의 편집</title>
		<link rel="alternate" type="text/html" href="https://kawala.in/index.php?title=%EB%AF%B8%EB%94%94%EC%96%B4%EC%9C%84%ED%82%A4:Gadget-CU.js&amp;diff=230&amp;oldid=prev"/>
		<updated>2026-05-27T13:08:43Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026년 5월 27일 (수) 22:08 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l143&quot;&gt;143번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;143번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			const liquidTags = containedLiquids.map(([id, amount]) =&amp;gt; {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			const liquidTags = containedLiquids.map(([id, amount]) =&amp;gt; {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				const liquid = liquids.source[id]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				const liquid = liquids.source[id]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;				if (!liquid) {&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;					return&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;				} &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				itemValue += liquid.valuePerLiter * (amount / 1000)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				itemValue += liquid.valuePerLiter * (amount / 1000)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key wiki:diff:1.41:old-221:rev-230:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Kawalain</name></author>
	</entry>
	<entry>
		<id>https://kawala.in/index.php?title=%EB%AF%B8%EB%94%94%EC%96%B4%EC%9C%84%ED%82%A4:Gadget-CU.js&amp;diff=221&amp;oldid=prev</id>
		<title>2026년 5월 27일 (수) 11:31에 Kawalain님의 편집</title>
		<link rel="alternate" type="text/html" href="https://kawala.in/index.php?title=%EB%AF%B8%EB%94%94%EC%96%B4%EC%9C%84%ED%82%A4:Gadget-CU.js&amp;diff=221&amp;oldid=prev"/>
		<updated>2026-05-27T11:31:22Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026년 5월 27일 (수) 20:31 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l116&quot;&gt;116번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;116번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			const rawLiquids = $currentTarget.data(&amp;#039;cuiLiquids&amp;#039;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			const rawLiquids = $currentTarget.data(&amp;#039;cuiLiquids&amp;#039;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			const containedLiquids = rawLiquids&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			const containedLiquids = rawLiquids&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				? rawLiquids.split(&#039;;&#039;).map((v) =&amp;gt; v.split(&#039;,&#039;))&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				? rawLiquids.split(&#039;;&#039;).map((v) =&amp;gt; v.split(&#039;,&#039;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;).map((s) =&amp;gt; s.trim()&lt;/ins&gt;))&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				: []&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				: []&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key wiki:diff:1.41:old-217:rev-221:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Kawalain</name></author>
	</entry>
	<entry>
		<id>https://kawala.in/index.php?title=%EB%AF%B8%EB%94%94%EC%96%B4%EC%9C%84%ED%82%A4:Gadget-CU.js&amp;diff=217&amp;oldid=prev</id>
		<title>Kawalain: 새 문서: const MW_BASE_URL = globalThis.MW_BASE_URL || &#039;&#039;  async function fetchJSON(title) { 	const response = await fetch( 		`${MW_BASE_URL}/rest.php/v1/page/${encodeURIComponent(title)}`, 	) 	if (!response.ok) { 		throw new Error(`Fetch failed with ${response.status}`) 	}  	const payload = await response.json() 	payload.source = JSON.parse(payload.source) 	return payload }  async function fetchCache(title) { 	if (!sessionStorage.getItem(title)) { 		await navigator.locks.request(title,...</title>
		<link rel="alternate" type="text/html" href="https://kawala.in/index.php?title=%EB%AF%B8%EB%94%94%EC%96%B4%EC%9C%84%ED%82%A4:Gadget-CU.js&amp;diff=217&amp;oldid=prev"/>
		<updated>2026-05-27T11:22:12Z</updated>

		<summary type="html">&lt;p&gt;새 문서: const MW_BASE_URL = globalThis.MW_BASE_URL || &amp;#039;&amp;#039;  async function fetchJSON(title) { 	const response = await fetch( 		`${MW_BASE_URL}/rest.php/v1/page/${encodeURIComponent(title)}`, 	) 	if (!response.ok) { 		throw new Error(`Fetch failed with ${response.status}`) 	}  	const payload = await response.json() 	payload.source = JSON.parse(payload.source) 	return payload }  async function fetchCache(title) { 	if (!sessionStorage.getItem(title)) { 		await navigator.locks.request(title,...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;const MW_BASE_URL = globalThis.MW_BASE_URL || &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
async function fetchJSON(title) {&lt;br /&gt;
	const response = await fetch(&lt;br /&gt;
		`${MW_BASE_URL}/rest.php/v1/page/${encodeURIComponent(title)}`,&lt;br /&gt;
	)&lt;br /&gt;
	if (!response.ok) {&lt;br /&gt;
		throw new Error(`Fetch failed with ${response.status}`)&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	const payload = await response.json()&lt;br /&gt;
	payload.source = JSON.parse(payload.source)&lt;br /&gt;
	return payload&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function fetchCache(title) {&lt;br /&gt;
	if (!sessionStorage.getItem(title)) {&lt;br /&gt;
		await navigator.locks.request(title, async (lock) =&amp;gt; {&lt;br /&gt;
			const payload = await fetchJSON(title)&lt;br /&gt;
			sessionStorage.setItem(title, JSON.stringify(payload))&lt;br /&gt;
		})&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	try {&lt;br /&gt;
		return JSON.parse(sessionStorage.getItem(title))&lt;br /&gt;
	} catch (e) {&lt;br /&gt;
		sessionStorage.removeItem(title)&lt;br /&gt;
		throw e&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function fetchData(ver, lang) {&lt;br /&gt;
	const prefix = `CU/data/${ver}`&lt;br /&gt;
	const promises = {&lt;br /&gt;
		locale: `${prefix}/${lang}.json`,&lt;br /&gt;
		items: `${prefix}/items.json`,&lt;br /&gt;
		liquids: `${prefix}/liquids.json`,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return Object.fromEntries(&lt;br /&gt;
		await Promise.all(&lt;br /&gt;
			Object.entries(promises).map(async ([k, v]) =&amp;gt; [k, await fetchCache(v)]),&lt;br /&gt;
		),&lt;br /&gt;
	)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const locale = {&lt;br /&gt;
	get: (key, lang = null) =&amp;gt; {&lt;br /&gt;
		const targetLocale =&lt;br /&gt;
			(lang ? locale[lang] : locale[document.documentElement.lang]) || locale.en&lt;br /&gt;
&lt;br /&gt;
		return targetLocale[key] || key&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	en: {&lt;br /&gt;
		toggleRetroFont: &amp;#039;Toggle Retro Font&amp;#039;,&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	ko: {&lt;br /&gt;
		toggleRetroFont: &amp;#039;레트로 글꼴 전환&amp;#039;,&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @type {Object&amp;lt;string, () =&amp;gt; void&amp;gt;}&lt;br /&gt;
 */&lt;br /&gt;
const scripts = {&lt;br /&gt;
	NoRetroFonts: () =&amp;gt; {&lt;br /&gt;
		const dataKey = &amp;#039;noRetroFont&amp;#039;&lt;br /&gt;
		let dataValue = localStorage.getItem(dataKey) == &amp;#039;true&amp;#039;&lt;br /&gt;
&lt;br /&gt;
		const apply = () =&amp;gt; {&lt;br /&gt;
			delete document.documentElement.dataset[dataKey]&lt;br /&gt;
			if (dataValue) {&lt;br /&gt;
				document.documentElement.dataset[dataKey] = &amp;#039;&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// 네비게이션 요소&lt;br /&gt;
		$(&amp;#039;#p-navigation ul&amp;#039;).append(&lt;br /&gt;
			$(&amp;#039;&amp;lt;li id=&amp;quot;n-noRetroFont&amp;quot; class=&amp;quot;mw-list-item&amp;quot;&amp;gt;&amp;#039;).append(&lt;br /&gt;
				$(&amp;#039;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
					.text(locale.get(&amp;#039;toggleRetroFont&amp;#039;))&lt;br /&gt;
					.on(&amp;#039;click&amp;#039;, (e) =&amp;gt; {&lt;br /&gt;
						e.preventDefault()&lt;br /&gt;
						dataValue = !dataValue&lt;br /&gt;
						localStorage.setItem(dataKey, dataValue)&lt;br /&gt;
						apply()&lt;br /&gt;
					}),&lt;br /&gt;
			),&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
		apply()&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	Tooltip: () =&amp;gt; {&lt;br /&gt;
		const $body = $(&amp;#039;body&amp;#039;)&lt;br /&gt;
		let $tooltip = null&lt;br /&gt;
		let $target = null&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * @param {PointerEvent} e&lt;br /&gt;
		 * @returns&lt;br /&gt;
		 */&lt;br /&gt;
		async function onPointerEnter(e) {&lt;br /&gt;
			const $currentTarget = $(this)&lt;br /&gt;
			const id = $currentTarget.data(&amp;#039;cui&amp;#039;)&lt;br /&gt;
			if (!id || $currentTarget.is($target)) {&lt;br /&gt;
				return&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$target = $currentTarget&lt;br /&gt;
&lt;br /&gt;
			const ver = $currentTarget.data(&amp;#039;cuiVer&amp;#039;) || &amp;#039;6.1&amp;#039;&lt;br /&gt;
			const lang = $currentTarget.data(&amp;#039;cuiLang&amp;#039;) || &amp;#039;EN&amp;#039;&lt;br /&gt;
			const rawLiquids = $currentTarget.data(&amp;#039;cuiLiquids&amp;#039;)&lt;br /&gt;
			const containedLiquids = rawLiquids&lt;br /&gt;
				? rawLiquids.split(&amp;#039;;&amp;#039;).map((v) =&amp;gt; v.split(&amp;#039;,&amp;#039;))&lt;br /&gt;
				: []&lt;br /&gt;
&lt;br /&gt;
			const { locale, items, liquids } = await fetchData(ver, lang)&lt;br /&gt;
&lt;br /&gt;
			// 타겟 요소가 바뀌었으면 넘어가기&lt;br /&gt;
			if (!$currentTarget.is($target)) {&lt;br /&gt;
				return&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$target = $currentTarget&lt;br /&gt;
&lt;br /&gt;
			const item = items.source[id]&lt;br /&gt;
&lt;br /&gt;
			let itemValue = item.value&lt;br /&gt;
			let itemActuallyUsableOnLimb = item.usableOnLimb&lt;br /&gt;
&lt;br /&gt;
			const headTags = [&lt;br /&gt;
				$(&amp;#039;&amp;lt;p class=&amp;quot;essential&amp;quot;&amp;gt;&amp;#039;).text(locale.source.main[id] || id),&lt;br /&gt;
			]&lt;br /&gt;
&lt;br /&gt;
			const footTags = [&lt;br /&gt;
				$(&amp;#039;&amp;lt;p class=&amp;quot;essential&amp;quot;&amp;gt;&amp;#039;).text(locale.source.main[id + &amp;#039;dsc&amp;#039;] || &amp;#039;&amp;#039;),&lt;br /&gt;
			]&lt;br /&gt;
&lt;br /&gt;
			const liquidTags = containedLiquids.map(([id, amount]) =&amp;gt; {&lt;br /&gt;
				const liquid = liquids.source[id]&lt;br /&gt;
&lt;br /&gt;
				itemValue += liquid.valuePerLiter * (amount / 1000)&lt;br /&gt;
				if (liquid.healthUsable) {&lt;br /&gt;
					itemActuallyUsableOnLimb = true&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				return $(&amp;#039;&amp;lt;section class=&amp;quot;cu-liquid&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
					.css(&lt;br /&gt;
						&amp;#039;color&amp;#039;,&lt;br /&gt;
						`color(srgb ${liquid.color.r} ${liquid.color.g} ${liquid.color.b})`,&lt;br /&gt;
					)&lt;br /&gt;
					.append(&lt;br /&gt;
						$(&amp;#039;&amp;lt;p class=&amp;quot;essential&amp;quot;&amp;gt;&amp;#039;).text(&lt;br /&gt;
							`${locale.source.other[liquid.localeName]} (${amount}ml)`,&lt;br /&gt;
						),&lt;br /&gt;
						$(&amp;#039;&amp;lt;p&amp;gt;&amp;#039;).text(locale.source.other[liquid.localeName + &amp;#039;dsc&amp;#039;] || &amp;#039;&amp;#039;),&lt;br /&gt;
					)&lt;br /&gt;
			})&lt;br /&gt;
&lt;br /&gt;
			const usableTags = []&lt;br /&gt;
&lt;br /&gt;
			// 액체가 들어있을 수 있는 경우&lt;br /&gt;
			if (item.capacity &amp;gt; 0) {&lt;br /&gt;
				footTags.push($(&amp;#039;&amp;lt;section class=&amp;quot;cu-liquids&amp;quot;&amp;gt;&amp;#039;).append(liquidTags))&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// 무게가 있는 경우&lt;br /&gt;
			if (item.weight &amp;gt; 0) {&lt;br /&gt;
				footTags.push(&lt;br /&gt;
					$(&amp;#039;&amp;lt;p class=&amp;quot;essential&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
						.append(&amp;#039;&amp;lt;i class=&amp;quot;cu-icon c-0&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;#039;)&lt;br /&gt;
						.append(`${locale.source.other.weight}: ${item.weight || 0}u`),&lt;br /&gt;
				)&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// 손으로만 들 수 있는 경우&lt;br /&gt;
			if (item.onlyHoldInHands) {&lt;br /&gt;
				footTags.push(&lt;br /&gt;
					$(&amp;#039;&amp;lt;p style=&amp;quot;color:#ff8787&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
						.append(&amp;#039;&amp;lt;i class=&amp;quot;cu-icon c-6&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;#039;)&lt;br /&gt;
						.append(locale.source.other.itemonlyinhands),&lt;br /&gt;
				)&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// 사용할 수 있는 경우&lt;br /&gt;
			if (item.usable) {&lt;br /&gt;
				usableTags.push(&lt;br /&gt;
					$(&amp;#039;&amp;lt;span style=&amp;quot;color:#a6ffaa&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
						.append(&amp;#039;&amp;lt;i class=&amp;quot;cu-icon c-6&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;#039;)&lt;br /&gt;
						.append(&lt;br /&gt;
							item.usableWithLMB&lt;br /&gt;
								? locale.source.other.itemusablehand&lt;br /&gt;
								: locale.source.other.itemusableinventory,&lt;br /&gt;
						),&lt;br /&gt;
				)&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// 사지에 사용할 수 있는 경우&lt;br /&gt;
			if (itemActuallyUsableOnLimb) {&lt;br /&gt;
				usableTags.push(&lt;br /&gt;
					$(&amp;#039;&amp;lt;span style=&amp;quot;color:#fffb91&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
						.append(&amp;#039;&amp;lt;i class=&amp;quot;cu-icon c-12&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;#039;)&lt;br /&gt;
						.append(locale.source.other.itemusablewound),&lt;br /&gt;
				)&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// 사용할 수 있는 경우&lt;br /&gt;
			if (usableTags.length &amp;gt; 0) {&lt;br /&gt;
				footTags.push(&lt;br /&gt;
					$(&amp;#039;&amp;lt;p style=&amp;quot;color:#a3a3a3&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
						.append(&amp;#039;&amp;lt;i class=&amp;quot;cu-icon c-11&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;#039;)&lt;br /&gt;
						.append(locale.source.other.itemusable)&lt;br /&gt;
						.append(&lt;br /&gt;
							usableTags.reduce(&lt;br /&gt;
								(p, c) =&amp;gt; (p.length &amp;gt; 0 ? [...p, &amp;#039;/&amp;#039;, c] : [c]),&lt;br /&gt;
								[],&lt;br /&gt;
							),&lt;br /&gt;
						),&lt;br /&gt;
				)&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// 가치가 있는 경우&lt;br /&gt;
			if (itemValue &amp;gt; 0) {&lt;br /&gt;
				const displayItemValue = Math.round(Math.min(itemValue, 50))&lt;br /&gt;
				footTags.push(&lt;br /&gt;
					$(&amp;#039;&amp;lt;p style=&amp;quot;color:#f6ff73&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
						.append(&amp;#039;&amp;lt;i class=&amp;quot;cu-icon c-9&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;#039;)&lt;br /&gt;
						.append(`${locale.source.other.itemvalue}${displayItemValue}c`),&lt;br /&gt;
				)&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$tooltip = $(&amp;#039;&amp;lt;div class=&amp;quot;cu-tooltip&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;)&lt;br /&gt;
				.append($(&amp;#039;&amp;lt;section&amp;gt;&amp;#039;).append(headTags))&lt;br /&gt;
				.append(&amp;#039;&amp;lt;br&amp;gt;&amp;#039;)&lt;br /&gt;
				.append($(&amp;#039;&amp;lt;section&amp;gt;&amp;#039;).append(footTags))&lt;br /&gt;
&lt;br /&gt;
			if (e.shiftKey) {&lt;br /&gt;
				$tooltip.attr(&amp;#039;open&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$body.append($tooltip)&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * @param {PointerEvent} e&lt;br /&gt;
		 * @returns&lt;br /&gt;
		 */&lt;br /&gt;
		function onPointerLeave(e) {&lt;br /&gt;
			if ($tooltip) {&lt;br /&gt;
				$tooltip.remove()&lt;br /&gt;
				$tooltip = null&lt;br /&gt;
				$target = null&lt;br /&gt;
			}&lt;br /&gt;
			$target = null&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * @param {PointerEvent} e&lt;br /&gt;
		 * @returns&lt;br /&gt;
		 */&lt;br /&gt;
		function onPointerMove(e) {&lt;br /&gt;
			if (!$tooltip || !$target) {&lt;br /&gt;
				return&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			const event = e.type.includes(&amp;#039;touch&amp;#039;) ? e.originalEvent.touches[0] : e&lt;br /&gt;
			const gap = parseInt($tooltip.data(&amp;#039;cuiGap&amp;#039;), 10) || 14&lt;br /&gt;
			const x = event.clientX + gap&lt;br /&gt;
			const y = event.clientY + gap&lt;br /&gt;
&lt;br /&gt;
			requestAnimationFrame(() =&amp;gt; {&lt;br /&gt;
				if ($tooltip) {&lt;br /&gt;
					$tooltip.css({&lt;br /&gt;
						left: `${Math.max(0, Math.min(x, window.innerWidth - $tooltip.outerWidth(true)))}px`,&lt;br /&gt;
						top: `${Math.max(0, Math.min(y, window.innerHeight - $tooltip.outerHeight(true)))}px`,&lt;br /&gt;
					})&lt;br /&gt;
				}&lt;br /&gt;
			})&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * @param {KeyboardEvent} e&lt;br /&gt;
		 * @returns&lt;br /&gt;
		 */&lt;br /&gt;
		function onKey(e) {&lt;br /&gt;
			if ($tooltip) {&lt;br /&gt;
				$tooltip.removeAttr(&amp;#039;open&amp;#039;)&lt;br /&gt;
				if (e.shiftKey) {&lt;br /&gt;
					$tooltip.attr(&amp;#039;open&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		$(&amp;#039;[data-cui]&amp;#039;)&lt;br /&gt;
			.on(&amp;#039;pointerenter&amp;#039;, onPointerEnter)&lt;br /&gt;
			.on(&amp;#039;pointerleave&amp;#039;, onPointerLeave)&lt;br /&gt;
			.on(&amp;#039;pointermove&amp;#039;, onPointerMove)&lt;br /&gt;
		$(&amp;#039;body&amp;#039;).on(&amp;#039;keyup keydown&amp;#039;, onKey)&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function setup() {&lt;br /&gt;
	$(&amp;#039;html&amp;#039;).addClass(&amp;#039;gadget-cu&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	for (const [name, func] of Object.entries(scripts)) {&lt;br /&gt;
		try {&lt;br /&gt;
			func(name)&lt;br /&gt;
		} catch (e) {&lt;br /&gt;
			console.error(name, e)&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (globalThis.mw) {&lt;br /&gt;
	mw.loader.using([&amp;#039;mediawiki.util&amp;#039;, &amp;#039;jquery&amp;#039;], () =&amp;gt; {&lt;br /&gt;
		$(() =&amp;gt; {&lt;br /&gt;
			if (mw.config.get(&amp;#039;wgCategories&amp;#039;).includes(&amp;#039;Casualties: Unknown&amp;#039;)) {&lt;br /&gt;
				setup()&lt;br /&gt;
			}&lt;br /&gt;
		})&lt;br /&gt;
	})&lt;br /&gt;
} else {&lt;br /&gt;
	setup()&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Kawalain</name></author>
	</entry>
</feed>