jolicode / jolitypo
网页微排印修复工具。
Requires
- php: >=7.4
- ext-mbstring: *
- lib-libxml: *
- org_heigl/hyphenator: ^2.6 || ^3.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.3.2
- symfony/framework-bundle: ^4.4 || ^5.0 || ^6.0
- symfony/phpunit-bridge: ^5.4.8 || ^6.0
- symfony/twig-bundle: ^4.4 || ^5.0 || ^6.0
- symfony/yaml: ^4.4 || ^5.0 || ^6.0
Conflicts
- ext-apc: 3.1.11
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>“Tell me Mr. Ander­son… what good is a phone call… if you’re unable to speak?”—Agent Smith, <em>Matrix</em>.</p>
“安德森先生,告诉我……如果你无法说话,电话有什么用?”——史密斯特工,黑客帝国。
它设计为
- 语言无关(您可以修复
fr_FR
、fr_CA
、en_US
... 您告诉 JoliTypo 要修复的内容); - 易于集成到现代 PHP 项目中(composer 和自动加载);
- 健壮(使用
\DOMDocument
而不是使用虚拟正则表达式解析 HTML); - 足够智能以避免 JavaScript、代码、CSS 处理...(可配置的保护标签列表);
- 全面测试;
- 完全开源,可在任何项目中使用(MIT 许可证)。
您可以通过 在线演示 尝试它!
快速使用
只需告诉修复类您要在内容上运行哪个修复器,然后调用 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 兼容的自动加载器中。
集成
- (内置) Symfony Bundle
- (内置) Twig 扩展
- (内置) CLI
- Wordpress 插件
- Drupal 模块
- Joomla 插件
- MODX Extra
可用修复器
破折号
将数字(日期范围等)之间的简单破折号 -
替换为 en-dash –
,并将双破折号 ----
替换为 em-dash —
。
尺寸
将数字之间的字母 x(《12 x 123》)替换为乘号实体(《×》,真正的数学符号)。
省略号
将三个点 ...
替换为省略号 …
。
智能引号
将无脑引号 " "
转换为各种智能引号样式(《“ ”》、《« »》、《„ “》...)。处理多种地区,如英语、阿拉伯语、法语、意大利语、西班牙语、爱尔兰语、德语...
查看 代码 了解更多详细信息,并不要忘记在修复器实例上指定地区。
此修复器替换了旧的 EnglishQuotes
、FrenchQuotes
和 GermanQuotes
。
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;
。
⚠ 注意,当前的屏幕阅读器无法正确拼写包含 ­
标签的单词。因此,应谨慎使用连字符过滤器,否则可能会降低您网站的可用性。
CurlyQuote (Smart Quote)
将直引号 '
替换为弯引号 ’
。有一个例外需要考虑:英尺和英寸标记(分钟和秒标记)。纯主义者使用双引号 ′
,此修复程序使用直引号以实现兼容性。了解更多关于 Curly quotes。
商标
处理商标符号 ™
、注册商标符号 ®
和版权符号 ©
。此修复程序替换了常用的近似值:(r)
、(c)
和 (TM)
。在数字和版权符号之间也放置非断行空格。
单位(以前称为数值)
在数字和其单位之间添加非断行空格。例如:12_h
、42_฿
或 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 相同,根据 Typefacts 和 Wikipedia。
$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 或库中,有些没有使用适当的自动加载,有些没有公开的缺陷跟踪器... 请自行查看
- http://michelf.ca/projets/php-smartypants/
- http://michelf.ca/projets/php-smartypants/typographer/
- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/
- https://github.com/Cerdic/textwheel/blob/master/typographie/fr.php
- https://github.com/spip/SPIP/blob/master/ecrire/typographie/fr.php
- https://github.com/dg/texy/blob/master/Texy/modules/TexyTypographyModule.php
- https://github.com/scoates/lexentity
- https://github.com/nofont/Typesetter.js
- https://github.com/judbd/php-typography(php-typography 的分支,您可以在以下链接测试它:http://www.roxane-company.com/typonerd/)
- http://mdash.ru/
- https://blot.im/typeset/(服务器端 JavaScript 预处理器)
术语表与参考文献
感谢以下在线资源帮助开发者理解排版
- [FR] http://typographisme.net/post/Les-espaces-typographiques-et-le-web
- http://daringfireball.net/projects/smartypants/
- [FR] http://www.uzine.net/article1802.html
- [FR] http://dascritch.net/post/2011/05/09/Les-espacements-unicodes
- http://www.punctuationmatters.com/ 必读
- http://practicaltypography.com/
- [FR] "Abrégé du code typographique à l'usage de la presse",ISBN: 9782351130667
- https://en.wikipedia.org/wiki/Non-English_usage_of_quotation_marks