改行禁止スペースで文章末のウィドウを防止
このウィドウ防止ツールは、見出し、リード文、カード、キャプションなど、丁寧な組版が求められる文章の視覚的なリズムを整えます。各段落の最後の2語の間に改行禁止スペースを挿入し、ブラウザーやレイアウトエンジンがその組を同じ行に配置しやすくします。段落区切り、文言、句読点、既存の空白はそのまま保持されます。処理は決定的かつ冪等であるため、同じコンテンツを自動公開フローで複数回処理しても、変更が重複して蓄積することはありません。
無料で実行
末尾の改行禁止スペースが組版を改善する理由
ウィドウとは、段落や見出しの末尾で1語だけ、またはごく短い行だけが取り残された状態です。整ったカード、ヒーロー領域、編集記事のブロックでも、不自然で偶発的な印象を与えることがあります。特に端末に応じて幅が変化するレスポンシブレイアウトでは目立ちます。このツールは、広く用いられる簡潔な組版対策を施します。最後の語の直前にある通常の空白文字をUnicodeの改行禁止スペースへ置き換え、ブラウザーなどが改行位置を決める際に最後の2語をひとまとまりとして扱えるようにします。文章の書き換え、要約、句読点の変更は行いません。段落を区切る空行は元の位置に残り、最後の語の前に複数の空白がある場合も、置換対象の1文字を除いて維持されます。適切な語の組がない段落には手を加えません。すでに改行禁止スペースがある場合は再置換しないため、何度処理しても結果は変わらず、不可視文字が増え続けることもありません。
文章の準備と結果の確認方法
その他の部分が最終的に表示される形のまま、内容をtextフィールドへ入力してください。段落は1行以上の空行で区切ります。これらの区切りは出力でも完全に保持されます。変換処理は各段落の最終行を調べ、空白ではない最後の要素を特定します。その直前が通常のスペースまたはタブであれば、その空白列の最後の1文字を改行禁止スペースにします。最後の語に付いた句点、疑問符、引用符、閉じ括弧はそのまま残るため、特別な指定は不要です。処理後は返された文章を目的のシステムへコピーし、実際に利用する各画面幅でプレビューしてください。改行禁止スペースは折り返しに影響しますが、コンテナーが極端に狭い場合や末尾の語が非常に長い場合まで美しい配置を保証するものではありません。エディター、CMS、テンプレートエンジン、データベースがUnicodeを保持し、後工程で通常の空白へ正規化しないこともご確認ください。
公開ワークフローでの活用方法
この機能は、原稿の承認後から表示前までの間に行う、最終的で決定的な整形工程に適しています。CMS連携では記事の公開時に見出しと概要を処理でき、静的サイトジェネレーターではビルド中に選択したフィールドへ適用できます。メール制作ではテンプレートへ挿入する前に見出しを保護でき、デザインシステムでは画面幅によって折り返されやすいカードタイトルに利用できます。ただし、ソースコード、整形済みテキスト、URL、空白自体に意味があるデータへ一律に適用せず、対象を選んでください。配信先がUnicodeに対応していれば返された文章をそのまま保存し、後続形式が明示的に必要とする場合だけ改行禁止スペースを適切なエスケープ表現へ変換します。APIは1リクエストあたり$0.002で、ブラウザー版では同じ決定的なロジックをローカル実行できます。ネットワーク、モデル、乱数、時刻に依存しないため、同一の入力からは常に同一の出力が得られます。
活用例
レスポンシブ見出しを整える
デスクトップやモバイルで表示幅が狭くなっても、ヒーロー見出しやカード見出しの最後の2語を同じ行に保ちやすくします。
CMS向け原稿を準備する
公開フロー内で、タイトル、リード文、キャプション、販促フィールドへ一貫したウィドウ対策を適用します。
メールの組版を改善する
見出しや短い段落をメールテンプレートへ挿入する前に、末尾の語の組を保護します。
よくある質問
このツールは何を変更しますか?
対象となる各段落で、最後の語の直前にある通常の空白文字1つをUnicodeの改行禁止スペースへ変換します。
段落区切りは保持されますか?
はい。空行による段落区切りと文章の内容は、いずれも完全に保持されます。
同じ文章を2回処理できますか?
はい。処理は冪等であり、すでに改行禁止スペースで保護された文章は再度変更されません。
短い最終行を必ずすべて解消できますか?
いいえ。最後の2語はまとまりますが、実際の折り返しはフォント、コンテナー幅、レイアウトエンジンによって決まります。
APIの料金はいくらですか?
APIは1リクエストあたり$0.002です。ブラウザー版では同じロジックをローカルで実行します。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/str/prevent-widows \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"A clear headline should never leave one word behind.\n\nThis second paragraph is protected too."}'const res = await fetch("https://api.kit.forhosting.com/str/prevent-widows", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "A clear headline should never leave one word behind.\n\nThis second paragraph is protected too."
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/str/prevent-widows",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "A clear headline should never leave one word behind.\n\nThis second paragraph is protected too."
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/str/prevent-widows", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"A clear headline should never leave one word behind.\\n\\nThis second paragraph is protected too."}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"A clear headline should never leave one word behind.\n\nThis second paragraph is protected too."}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/str/prevent-widows", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"text": "A clear headline should never leave one word behind.\n\nThis second paragraph is protected too."
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.prevent_widows",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_chars | 200000 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |