jolicode/jolitypo

网页微排印修复工具。

v1.4.0 2022-12-22 08:29 UTC

README

终于有一个为排版狂热者设计的工具了。

JoliTypo 是一个修复您 HTML 内容中微排印错误的工具。

use JoliTypo\Fixer;

$fixer = new Fixer(['Ellipsis', 'Dash', 'SmartQuotes', 'CurlyQuote', 'Hyphen']);
$fixedContent = $fixer->fix('<p>"Tell me Mr. Anderson... what good is a phone call... if you\'re unable to speak?" -- Agent Smith, <em>Matrix</em>.</p>');
<p>&ldquo;Tell me Mr. Ander&shy;son&hellip; what good is a phone call&hellip; if you&rsquo;re unable to speak?&rdquo;&mdash;Agent Smith, <em>Matrix</em>.</p>

“安德森先生,告诉我……如果你无法说话,电话有什么用?”——史密斯特工,黑客帝国。

它设计为

  • 语言无关(您可以修复 fr_FRfr_CAen_US... 您告诉 JoliTypo 要修复的内容);
  • 易于集成到现代 PHP 项目中(composer 和自动加载);
  • 健壮(使用 \DOMDocument 而不是使用虚拟正则表达式解析 HTML);
  • 足够智能以避免 JavaScript、代码、CSS 处理...(可配置的保护标签列表);
  • 全面测试;
  • 完全开源,可在任何项目中使用(MIT 许可证)。

您可以通过 在线演示 尝试它!

Latest Stable Version

快速使用

只需告诉修复类您要在内容上运行哪个修复器,然后调用 fix()

use JoliTypo\Fixer;

$fixer = new Fixer(["SmartQuotes", "FrenchNoBreakSpace"]);
$fixer->setLocale('fr_FR');
$fixedContent = $fixer->fix('<p>Je suis "très content" de t\'avoir invité sur <a href="http://jolicode.com/">Jolicode.com</a> !</p>');

为了方便使用,您可以在 此处找到为您的语言准备的修复器列表。微排印根本不像一个标准或法律,真正重要的是一致性,因此请随意使用您自己的列表。

请注意,JoliTypo 在 HTML 内容 上效果最佳;它也会在纯文本上工作,但对智能引号的智能处理较少。修复完整的 HTML 文档时,可能会移除潜在的 <head><html><body> 标签。

要修复非 HTML 内容,请使用 fixString() 方法

use JoliTypo\Fixer;

$fixer = new Fixer(["Trademark", "SmartQuotes"]);
$fixedContent = $fixer->fixString('Here is a "protip(c)"!'); // Here is a “protip©”!

CLI 使用

您可以通过下载 PHAR 版本 来运行 JoliTypo 的独立版本。

运行 jolitypo --help 了解如何配置修复器。

安装

要求由 Composer 处理(需要 libxml 和 mbstring)。

composer require jolicode/jolitypo

在 composer 之外的使用也是可能的,只需将 src/ 目录添加到任何 PSR-0 兼容的自动加载器中。

集成

可用修复器

破折号

将数字(日期范围等)之间的简单破折号 - 替换为 en-dash ,并将双破折号 ---- 替换为 em-dash

尺寸

将数字之间的字母 x(《12 x 123》)替换为乘号实体(《×》,真正的数学符号)。

省略号

将三个点 ... 替换为省略号

智能引号

将无脑引号 " " 转换为各种智能引号样式(《“ ”》、《« »》、《„ “》...)。处理多种地区,如英语、阿拉伯语、法语、意大利语、西班牙语、爱尔兰语、德语...

查看 代码 了解更多详细信息,并不要忘记在修复器实例上指定地区。

此修复器替换了旧的 EnglishQuotesFrenchQuotesGermanQuotes

FrenchNoBreakSpace

根据法国排版规范,用非断行空格替换一些经典空格。在 : 前不放置断行空格,在 ;!? 前放置细非断行空格。

NoSpaceBeforeComma

删除 , 前的空格,并确保其后只有一个空格。

连字符(自动连字符分割)

使用 org_heigl/hyphenator 工具,这是一个使 PHP 中实现单词连字符分割的工具。此连字符分割器使用 OpenOffice 的模式文件,这些文件基于为 TeX 创建的模式文件。

此修复程序只提供了一些地区:af_ZA、ca、da_DK、de_AT、de_CH、de_DE、en_GB、en_UK、et_EE、fr、hr_HR、hu_HU、it_IT、lt_LT、nb_NO、nn_NO、nl_NL、pl_PL、pt_BR、ro_RO、ru_RU、sk_SK、sl_SI、sr、zu_ZA。

您可以在官方github仓库上了解更多关于此修复程序的信息。

此修复程序需要在修复程序上设置地区,使用 $fixer->setLocale('fr_FR');。默认为 en_GB

在齐行文本中,正确的连字符分割是强制性的,并且您应该避免使用此 CSS 行在标题中分割单词:hyphens:none;

⚠ 注意,当前的屏幕阅读器无法正确拼写包含 &shy; 标签的单词。因此,应谨慎使用连字符过滤器,否则可能会降低您网站的可用性。

CurlyQuote (Smart Quote)

将直引号 ' 替换为弯引号 。有一个例外需要考虑:英尺和英寸标记(分钟和秒标记)。纯主义者使用双引号 ,此修复程序使用直引号以实现兼容性。了解更多关于 Curly quotes

商标

处理商标符号 、注册商标符号 ® 和版权符号 ©。此修复程序替换了常用的近似值:(r)(c)(TM)。在数字和版权符号之间也放置非断行空格。

单位(以前称为数值)

在数字和其单位之间添加非断行空格。例如:12_h42_฿88_%。在 1.0.2 版本之前,它被称为 Numeric,但现在保留 BC。

制作自己的修复程序真的很容易,如果您提供的修复程序不符合您的排版规则,请随时扩展它们。

按地区推荐的修复程序

en_GB

$fixer = new Fixer(['Ellipsis', 'Dimension', 'Unit', 'Dash', 'SmartQuotes', 'NoSpaceBeforeComma', 'CurlyQuote', 'Hyphen', 'Trademark']);
$fixer->setLocale('en_GB');

fr_FR

这些规则适用于 "Abrégé du code typographique à l'usage de la presse" 的大多数推荐,ISBN: 9782351130667。

$fixer = new Fixer(['Ellipsis', 'Dimension', 'Unit', 'Dash', 'SmartQuotes', 'FrenchNoBreakSpace', 'NoSpaceBeforeComma', 'CurlyQuote', 'Hyphen', 'Trademark']);
$fixer->setLocale('fr_FR');

fr_CA

主要与 fr_FR 相同,但句点前的空格不是强制的。

$fixer = new Fixer(['Ellipsis', 'Dimension', 'Unit', 'Dash', 'SmartQuotes', 'NoSpaceBeforeComma', 'CurlyQuote', 'Hyphen', 'Trademark']);
$fixer->setLocale('fr_CA');

de_DE

主要与 en_GB 相同,根据 TypefactsWikipedia

$fixer = new Fixer(['Ellipsis', 'Dimension', 'Unit', 'Dash', 'SmartQuotes', 'NoSpaceBeforeComma', 'CurlyQuote', 'Hyphen', 'Trademark']  );
$fixer->setLocale('de_DE');

更多内容即将推出(欢迎贡献!)。

文档

默认用法

$fixer        = new Fixer(['Ellipsis', 'Dimension', 'Dash', 'SmartQuotes', 'CurlyQuote', 'Hyphen']);
$fixedContent = $fixer->fix("<p>Some user contributed HTML which does not use proper glyphs.</p>");

$fixer->setRules(['CurlyQuote']);
$fixedContent = $fixer->fix("<p>I'm only replacing single quotes.</p>");

$fixer->setRules(['Hyphen']);
$fixer->setLocale('en_GB'); // I tell which locale to use for Hyphenation and SmartQuotes
$fixedContent = $fixer->fix("<p>Very long words like Antidisestablishmentarianism.</p>");

定义自己的修复程序

如果您想将您自己的修复程序添加到列表中,您必须实现 JoliTypo\FixerInterface。然后只需提供 JoliTypo 的完全限定名称,或者甚至实例

// by FQN
$fixer        = new Fixer(['Ellipsis', 'Acme\\YourOwn\\TypoFixer']);
$fixedContent = $fixer->fix("<p>Content fixed by the 2 fixers.</p>");

// or instances, or both
$fixer        = new Fixer(['Ellipsis', 'Acme\\YourOwn\\TypoFixer', new Acme\\YourOwn\\PonyFixer("Some parameter")]);
$fixedContent = $fixer->fix("<p>Content fixed by the 3 fixers.</p>");

配置受保护的标签

受保护的标签是 DOM 解析器必须避免的 HTML 标签列表。这些标签中的内容将不会被修复。

$fixer        = new Fixer(['Ellipsis']);
$fixer->setProtectedTags(['pre', 'a']);
$fixedContent = $fixer->fix("<p>Fixed...</p> <pre>Not fixed...</pre> <p>Fixed... <a>Not Fixed...</a>.</p>");

添加自己的修复程序 / 贡献修复程序

  • 编写测试;
  • 修复程序在一个文本片段上运行,无需处理 HTML;
  • 实现 JoliTypo\FixerInterface
  • 发送您的拉取请求。

贡献指南

  • 您必须用英文编写代码;
  • 您必须遵循 PSR2 和 Symfony 编码标准(在您的分支上运行 composer cs);
  • 您必须运行测试(运行 composer test);
  • 您必须遵守 MIT 许可证;
  • 您应该编写文档。

如果您添加了新的修复程序,请提供有关您想要修复的排版规则的来源和参考资料。

兼容性与操作系统支持限制

  • Windows XP:不能使用窄不换行空格,所有其他空格都被忽略,但看起来不差(正常空格)。
  • Mac OS Snow Leopard:没有不换行空格、半不换行空格、ems 和 en-dash,但看起来不差(正常空格)。

但是,如果您使用包含所有这些符号的字体(可能是 @font-face),则不会出现问题。

存在一个已知的 问题,阻止 JoliTypo 正确与 3.1.11 旧版本的 APC 版本一起工作。

您能做些什么来帮忙?

我们需要能够无处不在地使用这个工具,您可以通过提供以下方式来帮忙:

  • Wordpress 插件(替换或补充 wptexturize
  • Dotclear 插件...

此外,还有一个 待办事项列表 😙

许可协议

此代码片段受 MIT 许可协议保护。请参阅 LICENSE 文件。

替代方案和其他实现

已经存在很多类似这样的工具(包括好的工具)。遗憾的是,有些工具仅适用于一种语言,有些在整段 HTML 代码上运行正则表达式(这很不好),有些未经过测试,有些捆绑在 CMS 或库中,有些没有使用适当的自动加载,有些没有公开的缺陷跟踪器... 请自行查看

术语表与参考文献

感谢以下在线资源帮助开发者理解排版