MOXBOX ウィジェット
概要
この MOXBOX で JavaScript や CSS (あるいはサーバサイドの XSLT や REST API など) で実装されたウィジェットおよびツールが正しく機能することを確認するためのページである。このサイトの作者以外には特に有用なものではないが、何かの参考にはなるかも知れない。
Table of Contents
Foldable Prompts
目的: コマンドプロンプトでの一連の作業を記述するために使用する。ここで冗長な出力はデフォルトでは非表示にできる。ただし、Accordion のように完全に非表示にするだけではなく、指定した先頭行/末尾行をデフォルトで表示する「半開き」表示ができる。左にシェブロンマークのある行でアクションすると出力部の開閉ができる。
記述: 一連のプロンプト記述を <dl>
とし、個々のプロンプト入力および出力のペアをそれぞれ <dt>
と <dd>
で記述する。<dt>
, <dd>
は直下に単一の <pre>
を配置する必要がある。
<dd>
の初期状態の開閉はクラスに collapsed
(閉じた状態) か abridged
(縮約状態) を指定する。abridged
を指定した場合、data-mox-heads
または data-mox-tails
属性を併用する必要がある。
<dl class="foldable-prompts">
<dt><pre>$ curl -s -D - -o /dev/null https://hazm.at/index.html</pre></dt>
<dd><pre>HTTP/1.1 200 OK
Date: Thu, 16 Feb 2023 18:39:44 GMT
Server: HazMat Server/1.2.7 Finagle/22.1.0_20220113-213812
Content-Type: text/html
Last-Modified: Fri, 17 Jul 2020 02:40:06 GMT
Content-Length: 7059
Vary: Accept-Encoding</pre></dd>
</dl>
$ curl -s -D - -o /dev/null https://hazm.at/index.html
HTTP/1.1 200 OK Date: Thu, 16 Feb 2023 18:39:44 GMT Server: HazMat Server/1.2.7 Finagle/22.1.0_20220113-213812 Content-Type: text/html Last-Modified: Fri, 17 Jul 2020 02:40:06 GMT Content-Length: 7059 Vary: Accept-Encoding
<dt>
または <dd>
に collapsed
クラスを指定するとデフォルトで閉じた状態で表示される。
<dl class="foldable-prompts">
<dt><pre>$ curl -s -D - -o /dev/null https://hazm.at/index.html</pre></dt>
<dd class="collapsed"><pre>HTTP/1.1 200 OK
Date: Thu, 16 Feb 2023 18:39:44 GMT
Server: HazMat Server/1.2.7 Finagle/22.1.0_20220113-213812
Content-Type: text/html
Last-Modified: Fri, 17 Jul 2020 02:40:06 GMT
Content-Length: 7059
Vary: Accept-Encoding</pre></dd>
</dl>
$ curl -s -D - -o /dev/null https://hazm.at/index.html
HTTP/1.1 200 OK Date: Thu, 16 Feb 2023 18:39:44 GMT Server: HazMat Server/1.2.7 Finagle/22.1.0_20220113-213812 Content-Type: text/html Last-Modified: Fri, 17 Jul 2020 02:40:06 GMT Content-Length: 7059 Vary: Accept-Encoding
data-mox-heads
, data-mox-tails
, data-mox-ellipsis
を指定して完全に閉じていない半開きを使用することができる。data-mox-ellipsis
には HTML を指定できる。<pre>
直後の空行や </pre>
直前の空行も 1 行として扱われることに注意。
<dl class="foldable-prompts">
<dt><pre>$ curl -s -D - -o /dev/null https://hazm.at/index.html</pre></dt>
<dd class="abridged" data-mox-heads="2" data-mox-tails="1" data-mox-ellipsis="⌛"><pre>HTTP/1.1 200 OK
Date: Thu, 16 Feb 2023 18:39:44 GMT
Server: HazMat Server/1.2.7 Finagle/22.1.0_20220113-213812
Content-Type: text/html
Last-Modified: Fri, 17 Jul 2020 02:40:06 GMT
Content-Length: 7059
Vary: Accept-Encoding</pre></dd>
</dl>
$ curl -s -D - -o /dev/null https://hazm.at/index.html
HTTP/1.1 200 OK Date: Thu, 16 Feb 2023 18:39:44 GMT Server: HazMat Server/1.2.7 Finagle/22.1.0_20220113-213812 Content-Type: text/html Last-Modified: Fri, 17 Jul 2020 02:40:06 GMT Content-Length: 7059 Vary: Accept-Encoding
以下は様々な状況でのテスト。
$ cat main.rs
fn main() { let mut values = vec![1, 2, 3, 4]; for value in &values { println!("value = {}", value); } if values.len() > 5 { println!("List is longer than five items"); } // Pattern matching match values.len() { 0 => println!("Empty"), 1 => println!("One value"), 2..=10 => println!("Between two and ten values"), 11 => println!("Eleven values"), _ => println!("Many values"), }; // while loop with predicate and pattern matching using let while let Some(value) = values.pop() { println!("value = {value}"); // using curly braces to format a local variable } }
$ cat main.rs; data-mox-heads="2" data-mox-tails="2"
fn main() { let mut values = vec![1, 2, 3, 4]; for value in &values { println!("value = {}", value); } if values.len() > 5 { println!("List is longer than five items"); } // Pattern matching match values.len() { 0 => println!("Empty"), 1 => println!("One value"), 2..=10 => println!("Between two and ten values"), 11 => println!("Eleven values"), _ => println!("Many values"), }; // while loop with predicate and pattern matching using let while let Some(value) = values.pop() { println!("value = {value}"); // using curly braces to format a local variable } }
$ cat main.rs; data-mox-tails="2"
fn main() { let mut values = vec![1, 2, 3, 4]; for value in &values { println!("value = {}", value); } if values.len() > 5 { println!("List is longer than five items"); } // Pattern matching match values.len() { 0 => println!("Empty"), 1 => println!("One value"), 2..=10 => println!("Between two and ten values"), 11 => println!("Eleven values"), _ => println!("Many values"), }; // while loop with predicate and pattern matching using let while let Some(value) = values.pop() { println!("value = {value}"); // using curly braces to format a local variable } }
$ cat main.rs; data-mox-heads="2"
fn main() { let mut values = vec![1, 2, 3, 4]; for value in &values { println!("value = {}", value); } if values.len() > 5 { println!("List is longer than five items"); } // Pattern matching match values.len() { 0 => println!("Empty"), 1 => println!("One value"), 2..=10 => println!("Between two and ten values"), 11 => println!("Eleven values"), _ => println!("Many values"), }; // while loop with predicate and pattern matching using let while let Some(value) = values.pop() { println!("value = {value}"); // using curly braces to format a local variable } }
$ cat main.rs; data-mox-heads="0" data-mox-tails="0"
fn main() { let mut values = vec![1, 2, 3, 4]; for value in &values { println!("value = {}", value); } if values.len() > 5 { println!("List is longer than five items"); } // Pattern matching match values.len() { 0 => println!("Empty"), 1 => println!("One value"), 2..=10 => println!("Between two and ten values"), 11 => println!("Eleven values"), _ => println!("Many values"), }; // while loop with predicate and pattern matching using let while let Some(value) = values.pop() { println!("value = {value}"); // using curly braces to format a local variable } }
$ cat main.rs; data-mox-heads="6" data-mox-tails="3" data-mox-ellipsis="<b> /* ... */</b>"
fn main() { let mut values = vec![1, 2, 3, 4]; for value in &values { println!("value = {}", value); } if values.len() > 5 { println!("List is longer than five items"); } // Pattern matching match values.len() { 0 => println!("Empty"), 1 => println!("One value"), 2..=10 => println!("Between two and ten values"), 11 => println!("Eleven values"), _ => println!("Many values"), }; // while loop with predicate and pattern matching using let while let Some(value) = values.pop() { println!("value = {value}"); // using curly braces to format a local variable } }
$ cat main.rs; data-mox-heads="24"
fn main() { let mut values = vec![1, 2, 3, 4]; for value in &values { println!("value = {}", value); } if values.len() > 5 { println!("List is longer than five items"); } // Pattern matching match values.len() { 0 => println!("Empty"), 1 => println!("One value"), 2..=10 => println!("Between two and ten values"), 11 => println!("Eleven values"), _ => println!("Many values"), }; // while loop with predicate and pattern matching using let while let Some(value) = values.pop() { println!("value = {value}"); // using curly braces to format a local variable } }
$ cat main.rs; data-mox-tails="24"
fn main() { let mut values = vec![1, 2, 3, 4]; for value in &values { println!("value = {}", value); } if values.len() > 5 { println!("List is longer than five items"); } // Pattern matching match values.len() { 0 => println!("Empty"), 1 => println!("One value"), 2..=10 => println!("Between two and ten values"), 11 => println!("Eleven values"), _ => println!("Many values"), }; // while loop with predicate and pattern matching using let while let Some(value) = values.pop() { println!("value = {value}"); // using curly braces to format a local variable } }
$ cat main.rs; data-mox-heads="25"
fn main() { let mut values = vec![1, 2, 3, 4]; for value in &values { println!("value = {}", value); } if values.len() > 5 { println!("List is longer than five items"); } // Pattern matching match values.len() { 0 => println!("Empty"), 1 => println!("One value"), 2..=10 => println!("Between two and ten values"), 11 => println!("Eleven values"), _ => println!("Many values"), }; // while loop with predicate and pattern matching using let while let Some(value) = values.pop() { println!("value = {value}"); // using curly braces to format a local variable } }
$ cat main.rs; data-mox-tails="25"
fn main() { let mut values = vec![1, 2, 3, 4]; for value in &values { println!("value = {}", value); } if values.len() > 5 { println!("List is longer than five items"); } // Pattern matching match values.len() { 0 => println!("Empty"), 1 => println!("One value"), 2..=10 => println!("Between two and ten values"), 11 => println!("Eleven values"), _ => println!("Many values"), }; // while loop with predicate and pattern matching using let while let Some(value) = values.pop() { println!("value = {value}"); // using curly braces to format a local variable } }
$ cat main.rs; data-mox-heads="65535"
fn main() { let mut values = vec![1, 2, 3, 4]; for value in &values { println!("value = {}", value); } if values.len() > 5 { println!("List is longer than five items"); } // Pattern matching match values.len() { 0 => println!("Empty"), 1 => println!("One value"), 2..=10 => println!("Between two and ten values"), 11 => println!("Eleven values"), _ => println!("Many values"), }; // while loop with predicate and pattern matching using let while let Some(value) = values.pop() { println!("value = {value}"); // using curly braces to format a local variable } }
<mox:include>
<mox:include xmlns:mox="https://hazm.at/mox" href="file" {xml-stylesheet="stylesheet.xsl"} {target="xpath"}/>
href で指定されたファイルをその位置に挿入する。XInclude と異なり xml-stylesheet 属性が指定されている場合はその値で指定された XSL を適用した結果が挿入される。さらに target 属性で指定された XPath のノードのみを挿入する。
ページの難読化
ページの <head>
要素内に以下のメタデータを指定すると、そのページのすべてのパラグラフ要素 (リード文を除く) が難読化される。
<meta name="x-visibility" content="obfuscated"/>
<meta name="x-obfuscated" content="You are not allowed to view this page."/>
<meta name="x-visibility" content="closed"/>
Facebook コメントの無効化
ページの <head>
要素内に以下のメタデータを指定すると、ページごとに Facebook コメントの有効/無効を切り替えることができる。デフォルトではコメントは有効。
<meta name="x-comments" content="false"/>