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

快速使用

只需告诉 Fixer 类 你想要在内容上运行哪个 Fixer,然后调用 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>');

为了方便使用,你可以在 这里找到针对你语言的 Fixer 列表。微排印不是标准或法律,真正重要的是一致性,所以你可以自由地使用自己的列表。

请注意,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 以了解如何配置 Fixer。

安装

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

composer require jolicode/jolitypo

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

集成

可用的修复器

破折号

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

尺寸

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

省略号

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

智能引号

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

查看代码获取更多详细信息,并不要忘记在Fixer实例中指定地区。

此Fixer替换了旧版的EnglishQuotesFrenchQuotesGermanQuotes

FrenchNoBreakSpace

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

NoSpaceBeforeComma

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

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

使用org_heigl/hyphenator,这是一个在PHP中启用单词连字符的工具。此连字符使用来自OpenOffice的模式文件,这些模式文件基于为TeX创建的模式文件。

此Fixer仅提供一些地区: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的信息。

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

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

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

花括号引号(智能引号)

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

商标

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

单位(以前称为数字)

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

创建自己的Fixer非常简单,如果您提供的Fixer不符合您的排版规则,请随时扩展它们。

按地区提供Fixer建议

en_GB

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

fr_FR

这些规则适用于大多数“排版简编:适用于新闻业的排版”的建议,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相同,根据Typefacts维基百科

$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>");

定义自己的Fixer

如果您想将自己的Fixer添加到列表中,您必须实现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>");

添加自己的Fixer / 贡献一个Fixer

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

贡献指南

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

如果您添加了一个新的Fixer,请提供有关您想修复的排版规则的源代码和参考。

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

  • Windows XP:不能使用细非断空格,所有其他空格都被忽略,但看起来并不差(普通空格)。
  • Mac OS Snow Leopard:没有非断空格、半非断空格、ems和en-dash,但看起来并不差(普通空格)。

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

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

您能做什么来帮忙?

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

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

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

许可证

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

替代品和其他实现

已经有很多像这样的工具(包括好的)。遗憾的是,有些只适用于一种语言,有些在整个HTML代码上运行正则表达式(这是不好的),有些未经过测试,有些捆绑在CMS或库中,有些没有使用适当的自动加载,有些没有开放的bug跟踪器...您可以自己看看

术语表与参考文献

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