format-code / index.html
soiz1's picture
Update index.html
c506a44 verified
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>js-beautify 設定エディタ</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.15.4/beautify.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.15.4/beautify-css.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.15.4/beautify-html.min.js"></script>
<div id="google_translate_element" style="float:left; margin-left:2px; margin-top:-8px; width:158px; border:0px solid #fff;"></div>
<script type="text/javascript">function googleTranslateElementInit() {new google.translate.TranslateElement({pageLanguage: 'ja', includedLanguages: 'ar,bg,cs,da,de,el,en,es,fa,fi,fr,hi,hu,id,it,iw,ja,ko,ms,nl,no,pl,pt,ro,ru,sl,sv,th,tl,tr,uk,ur,vi,zh-CN,zh-TW', layout:google.translate.TranslateElement.InlineLayout.SIMPLE}, 'google_translate_element');} </script>
<script type="text/javascript" src="https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit" async></script>
<style>
:root {
--primary-color: #4a6fa5;
--secondary-color: #f8f9fa;
--border-color: #dee2e6;
--hover-color: #e9ecef;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
color: #333;
max-width: 1200px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
h1, h2, h3 {
color: var(--primary-color);
}
.container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
.panel {
background: white;
border-radius: 8px;
padding: 20px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.section {
margin-bottom: 25px;
border-bottom: 1px solid var(--border-color);
padding-bottom: 15px;
}
.section:last-child {
border-bottom: none;
}
.form-group {
margin-bottom: 15px;
display: flex;
align-items: center;
}
label {
flex: 1;
margin-right: 10px;
font-size: 14px;
}
input, select {
padding: 8px;
border: 1px solid var(--border-color);
border-radius: 4px;
width: 100px;
}
.checkbox-group {
display: flex;
align-items: center;
}
.checkbox-group input {
width: auto;
margin-right: 5px;
}
.help-icon {
display: inline-block;
width: 18px;
height: 18px;
background-color: var(--primary-color);
color: white;
border-radius: 50%;
text-align: center;
line-height: 18px;
font-size: 12px;
margin-left: 8px;
cursor: help;
position: relative;
}
.tooltip {
position: absolute;
background-color: #333;
color: white;
padding: 8px;
border-radius: 4px;
font-size: 12px;
width: 250px;
z-index: 100;
bottom: 100%;
left: 50%;
transform: translateX(-50%);
margin-bottom: 5px;
visibility: hidden;
opacity: 0;
transition: opacity 0.3s;
}
.help-icon:hover .tooltip {
visibility: visible;
opacity: 1;
}
button {
background-color: var(--primary-color);
color: white;
border: none;
padding: 10px 15px;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
transition: background-color 0.3s;
}
button:hover {
background-color: #3a5a80;
}
textarea {
width: 100%;
height: 300px;
padding: 10px;
border: 1px solid var(--border-color);
border-radius: 4px;
font-family: monospace;
resize: vertical;
}
.tab-container {
display: flex;
margin-bottom: 15px;
}
.tab {
padding: 8px 15px;
background-color: var(--secondary-color);
border: 1px solid var(--border-color);
border-bottom: none;
cursor: pointer;
border-radius: 4px 4px 0 0;
margin-right: 5px;
}
.tab.active {
background-color: white;
border-bottom: 1px solid white;
margin-bottom: -1px;
}
.tab-content {
display: none;
}
.tab-content.active {
display: block;
}
.json-viewer {
background-color: #f8f8f8;
padding: 10px;
border-radius: 4px;
border: 1px solid var(--border-color);
font-family: monospace;
white-space: pre-wrap;
max-height: 300px;
overflow-y: auto;
}
@media (max-width: 768px) {
.container {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<h1>js-beautify 設定エディタ <small>v1.15.4</small></h1>
<div class="container">
<div class="panel">
<h2>設定オプション</h2>
<div class="tab-container">
<div class="tab active" data-tab="common">共通オプション</div>
<div class="tab" data-tab="js">JavaScript</div>
<div class="tab" data-tab="css">CSS</div>
<div class="tab" data-tab="html">HTML</div>
</div>
<div id="common" class="tab-content active">
<div class="section">
<h3>基本設定</h3>
<div class="form-group">
<label>
indent_size (インデントのスペース数)
<span class="help-icon">?
<span class="tooltip">インデントに使用するスペースの数。デフォルトは4。</span>
</span>
</label>
<input type="number" id="indent_size" value="4" min="1" max="8">
</div>
<div class="form-group">
<label>
indent_char (インデント文字)
<span class="help-icon">?
<span class="tooltip">インデントに使用する文字(スペースまたはタブ)。デフォルトはスペース。</span>
</span>
</label>
<select id="indent_char">
<option value=" " selected>スペース</option>
<option value="\t">タブ</option>
</select>
</div>
<div class="form-group">
<label>
indent_with_tabs (タブでインデント)
<span class="help-icon">?
<span class="tooltip">trueにするとタブでインデントします。デフォルトはfalse。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="indent_with_tabs">
</div>
</div>
<div class="form-group">
<label>
editorconfig (.editorconfig 参照)
<span class="help-icon">?
<span class="tooltip">trueにすると.editorconfigファイルを参照します。デフォルトはfalse。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="editorconfig">
</div>
</div>
<div class="form-group">
<label>
eol (改行文字)
<span class="help-icon">?
<span class="tooltip">使用する改行文字(例: "\n")。デフォルトは"\n"。</span>
</span>
</label>
<select id="eol">
<option value="\n" selected>\n (LF)</option>
<option value="\r\n">\r\n (CRLF)</option>
</select>
</div>
<div class="form-group">
<label>
end_with_newline (ファイル末尾に改行追加)
<span class="help-icon">?
<span class="tooltip">trueにするとファイルの最後に改行を追加します。デフォルトはfalse。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="end_with_newline">
</div>
</div>
</div>
<div class="section">
<h3>改行設定</h3>
<div class="form-group">
<label>
preserve_newlines (元の改行保持)
<span class="help-icon">?
<span class="tooltip">trueにすると元の改行を保持します。デフォルトはtrue。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="preserve_newlines" checked>
</div>
</div>
<div class="form-group">
<label>
max_preserve_newlines (改行の最大保持数)
<span class="help-icon">?
<span class="tooltip">連続する改行の最大保持数。デフォルトは10。</span>
</span>
</label>
<input type="number" id="max_preserve_newlines" value="10" min="1" max="100">
</div>
<div class="form-group">
<label>
indent_empty_lines (空行にもインデント付加)
<span class="help-icon">?
<span class="tooltip">trueにすると空行にもインデントを追加します。デフォルトはfalse。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="indent_empty_lines">
</div>
</div>
</div>
<div class="section">
<h3>スペース設定</h3>
<div class="form-group">
<label>
space_in_paren (括弧内スペース)
<span class="help-icon">?
<span class="tooltip">trueにすると括弧内にスペースを追加します。デフォルトはfalse。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="space_in_paren">
</div>
</div>
<div class="form-group">
<label>
space_in_empty_paren (空括弧内スペース)
<span class="help-icon">?
<span class="tooltip">trueにすると空の括弧内にスペースを追加します。デフォルトはfalse。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="space_in_empty_paren">
</div>
</div>
<div class="form-group">
<label>
space_after_anon_function (無名関数の後にスペース)
<span class="help-icon">?
<span class="tooltip">trueにすると無名関数の後にスペースを追加します。デフォルトはfalse。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="space_after_anon_function">
</div>
</div>
<div class="form-group">
<label>
space_after_named_function (名前付き関数の後にスペース)
<span class="help-icon">?
<span class="tooltip">trueにすると名前付き関数の後にスペースを追加します。デフォルトはfalse。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="space_after_named_function">
</div>
</div>
</div>
<div class="section">
<h3>その他の設定</h3>
<div class="form-group">
<label>
jslint_happy (JSLint互換フォーマット)
<span class="help-icon">?
<span class="tooltip">trueにするとJSLint互換のフォーマットになります。デフォルトはfalse。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="jslint_happy">
</div>
</div>
<div class="form-group">
<label>
unescape_strings (文字列のエスケープ解除)
<span class="help-icon">?
<span class="tooltip">trueにすると文字列のエスケープを解除します。デフォルトはfalse。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="unescape_strings">
</div>
</div>
<div class="form-group">
<label>
wrap_line_length (1行の最大長)
<span class="help-icon">?
<span class="tooltip">1行の最大文字数。0は無制限。デフォルトは0。</span>
</span>
</label>
<input type="number" id="wrap_line_length" value="0" min="0" max="500">
</div>
<div class="form-group">
<label>
comma_first (カンマを行頭に移動)
<span class="help-icon">?
<span class="tooltip">trueにするとカンマを行頭に移動します。デフォルトはfalse。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="comma_first">
</div>
</div>
</div>
</div>
<div id="js" class="tab-content">
<div class="section">
<h3>JavaScript 設定</h3>
<div class="form-group">
<label>
brace_style ({} のスタイル)
<span class="help-icon">?
<span class="tooltip">"collapse" (デフォルト), "expand", "end-expand", "none" のいずれか</span>
</span>
</label>
<select id="js_brace_style">
<option value="collapse" selected>collapse</option>
<option value="expand">expand</option>
<option value="end-expand">end-expand</option>
<option value="none">none</option>
</select>
</div>
<div class="form-group">
<label>
unindent_chained_methods (チェーンメソッドのインデント抑制)
<span class="help-icon">?
<span class="tooltip">trueにするとチェーンメソッドのインデントを抑制します。デフォルトはfalse。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="unindent_chained_methods">
</div>
</div>
<div class="form-group">
<label>
break_chained_methods (チェーンメソッドを改行)
<span class="help-icon">?
<span class="tooltip">trueにするとチェーンメソッドを改行します。デフォルトはfalse。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="break_chained_methods">
</div>
</div>
<div class="form-group">
<label>
keep_array_indentation (配列のインデントを保持)
<span class="help-icon">?
<span class="tooltip">trueにすると配列のインデントを保持します。デフォルトはfalse。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="keep_array_indentation">
</div>
</div>
<div class="form-group">
<label>
operator_position (演算子の配置)
<span class="help-icon">?
<span class="tooltip">"before-newline" (デフォルト), "after-newline", "preserve-newline" のいずれか</span>
</span>
</label>
<select id="operator_position">
<option value="before-newline" selected>before-newline</option>
<option value="after-newline">after-newline</option>
<option value="preserve-newline">preserve-newline</option>
</select>
</div>
</div>
</div>
<div id="css" class="tab-content">
<div class="section">
<h3>CSS 設定</h3>
<div class="form-group">
<label>
brace_style ({} の配置)
<span class="help-icon">?
<span class="tooltip">CSS用の{}配置スタイル</span>
</span>
</label>
<select id="css_brace_style">
<option value="collapse" selected>collapse</option>
<option value="expand">expand</option>
</select>
</div>
<div class="form-group">
<label>
selector_separator_newline (セレクタ間の改行)
<span class="help-icon">?
<span class="tooltip">trueにするとセレクタ間で改行します。デフォルトはtrue。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="selector_separator_newline" checked>
</div>
</div>
<div class="form-group">
<label>
newline_between_rules (ルール間の改行)
<span class="help-icon">?
<span class="tooltip">trueにするとCSSルール間で改行します。デフォルトはtrue。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="newline_between_rules" checked>
</div>
</div>
</div>
</div>
<div id="html" class="tab-content">
<div class="section">
<h3>HTML 設定</h3>
<div class="form-group">
<label>
indent_inner_html (&lt;body&gt;内のインデント)
<span class="help-icon">?
<span class="tooltip">trueにするとbodyタグ内をインデントします。デフォルトはfalse。</span>
</span>
</label>
<div class="checkbox-group">
<input type="checkbox" id="indent_inner_html">
</div>
</div>
<div class="form-group">
<label>
indent_scripts (スクリプトのインデント方法)
<span class="help-icon">?
<span class="tooltip>"normal", "keep", "separate" のいずれか</span>
</span>
</label>
<select id="indent_scripts">
<option value="normal" selected>normal</option>
<option value="keep">keep</option>
<option value="separate">separate</option>
</select>
</div>
<div class="form-group">
<label>
wrap_attributes (属性の折り返し)
<span class="help-icon">?
<span class="tooltip>"auto", "force", "force-aligned", "force-expand-multiline", "aligned-multiple", "preserve", "preserve-aligned" のいずれか</span>
</span>
</label>
<select id="wrap_attributes">
<option value="auto" selected>auto</option>
<option value="force">force</option>
<option value="force-aligned">force-aligned</option>
<option value="force-expand-multiline">force-expand-multiline</option>
<option value="aligned-multiple">aligned-multiple</option>
<option value="preserve">preserve</option>
<option value="preserve-aligned">preserve-aligned</option>
</select>
</div>
<div class="form-group">
<label>
wrap_attributes_min_attrs (折り返し最小属性数)
<span class="help-icon">?
<span class="tooltip">この数以上の属性がある場合に折り返します。デフォルトは2。</span>
</span>
</label>
<input type="number" id="wrap_attributes_min_attrs" value="2" min="1" max="10">
</div>
<div class="form-group">
<label>
extra_liners (改行追加対象タグ)
<span class="help-icon">?
<span class="tooltip">これらのタグの前後に改行を追加します。カンマ区切りで指定。</span>
</span>
</label>
<input type="text" id="extra_liners" value="head,body,/html">
</div>
</div>
</div>
<button id="generate-json">設定を生成</button>
<button id="reset-settings">リセット</button>
</div>
<div class="panel">
<h2>設定プレビュー</h2>
<div class="section">
<h3>生成された設定JSON</h3>
<div id="json-preview" class="json-viewer">設定を生成してください...</div>
</div>
<div class="section">
<h3>コードテスト</h3>
<label for="test-code">テストコード:</label>
<textarea id="test-code" placeholder="ここにテストコードを入力..."></textarea>
<div class="form-group">
<label for="test-type">コードタイプ:</label>
<select id="test-type">
<option value="js">JavaScript</option>
<option value="css">CSS</option>
<option value="html">HTML</option>
</select>
<button id="test-beautify">整形テスト</button>
</div>
<label for="test-result">結果:</label>
<textarea id="test-result" readonly></textarea>
</div>
</div>
</div>
<script>
// タブ切り替え
document.querySelectorAll('.tab').forEach(tab => {
tab.addEventListener('click', () => {
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));
tab.classList.add('active');
document.getElementById(tab.dataset.tab).classList.add('active');
});
});
// 設定生成
document.getElementById('generate-json').addEventListener('click', () => {
const options = {
indent_size: parseInt(document.getElementById('indent_size').value),
indent_char: document.getElementById('indent_char').value,
indent_with_tabs: document.getElementById('indent_with_tabs').checked,
editorconfig: document.getElementById('editorconfig').checked,
eol: document.getElementById('eol').value,
end_with_newline: document.getElementById('end_with_newline').checked,
preserve_newlines: document.getElementById('preserve_newlines').checked,
max_preserve_newlines: parseInt(document.getElementById('max_preserve_newlines').value),
indent_empty_lines: document.getElementById('indent_empty_lines').checked,
space_in_paren: document.getElementById('space_in_paren').checked,
space_in_empty_paren: document.getElementById('space_in_empty_paren').checked,
jslint_happy: document.getElementById('jslint_happy').checked,
space_after_anon_function: document.getElementById('space_after_anon_function').checked,
space_after_named_function: document.getElementById('space_after_named_function').checked,
unescape_strings: document.getElementById('unescape_strings').checked,
wrap_line_length: parseInt(document.getElementById('wrap_line_length').value),
comma_first: document.getElementById('comma_first').checked,
operator_position: document.getElementById('operator_position').value,
js: {
brace_style: document.getElementById('js_brace_style').value,
unindent_chained_methods: document.getElementById('unindent_chained_methods').checked,
break_chained_methods: document.getElementById('break_chained_methods').checked,
keep_array_indentation: document.getElementById('keep_array_indentation').checked
},
css: {
brace_style: document.getElementById('css_brace_style').value,
selector_separator_newline: document.getElementById('selector_separator_newline').checked,
newline_between_rules: document.getElementById('newline_between_rules').checked
},
html: {
indent_inner_html: document.getElementById('indent_inner_html').checked,
indent_scripts: document.getElementById('indent_scripts').value,
wrap_attributes: document.getElementById('wrap_attributes').value,
wrap_attributes_min_attrs: parseInt(document.getElementById('wrap_attributes_min_attrs').value),
extra_liners: document.getElementById('extra_liners').value.split(',').map(s => s.trim())
}
};
document.getElementById('json-preview').textContent = JSON.stringify(options, null, 2);
});
// リセット
document.getElementById('reset-settings').addEventListener('click', () => {
// 共通オプション
document.getElementById('indent_size').value = 4;
document.getElementById('indent_char').value = ' ';
document.getElementById('indent_with_tabs').checked = false;
document.getElementById('editorconfig').checked = false;
document.getElementById('eol').value = '\n';
document.getElementById('end_with_newline').checked = false;
document.getElementById('preserve_newlines').checked = true;
document.getElementById('max_preserve_newlines').value = 10;
document.getElementById('indent_empty_lines').checked = false;
document.getElementById('space_in_paren').checked = false;
document.getElementById('space_in_empty_paren').checked = false;
document.getElementById('jslint_happy').checked = false;
document.getElementById('space_after_anon_function').checked = false;
document.getElementById('space_after_named_function').checked = false;
document.getElementById('unescape_strings').checked = false;
document.getElementById('wrap_line_length').value = 0;
document.getElementById('comma_first').checked = false;
document.getElementById('operator_position').value = 'before-newline';
// JSオプション
document.getElementById('js_brace_style').value = 'collapse';
document.getElementById('unindent_chained_methods').checked = false;
document.getElementById('break_chained_methods').checked = false;
document.getElementById('keep_array_indentation').checked = false;
// CSSオプション
document.getElementById('css_brace_style').value = 'collapse';
document.getElementById('selector_separator_newline').checked = true;
document.getElementById('newline_between_rules').checked = true;
// HTMLオプション
document.getElementById('indent_inner_html').checked = false;
document.getElementById('indent_scripts').value = 'normal';
document.getElementById('wrap_attributes').value = 'auto';
document.getElementById('wrap_attributes_min_attrs').value = 2;
document.getElementById('extra_liners').value = 'head,body,/html';
document.getElementById('json-preview').textContent = '設定をリセットしました。再度生成してください...';
});
// 整形テスト
document.getElementById('test-beautify').addEventListener('click', () => {
const code = document.getElementById('test-code').value;
const type = document.getElementById('test-type').value;
if (!code.trim()) {
alert('テストコードを入力してください');
return;
}
try {
const options = JSON.parse(document.getElementById('json-preview').textContent);
let result;
switch (type) {
case 'js':
result = js_beautify(code, options);
break;
case 'css':
result = css_beautify(code, options);
break;
case 'html':
result = html_beautify(code, options);
break;
default:
result = '無効なコードタイプ';
}
document.getElementById('test-result').value = result;
} catch (e) {
alert('まず設定を生成してください');
console.error(e);
}
});
</script>
</body>
</html>