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 许可证)。
你可以通过 在线演示 来尝试它!
快速使用
只需告诉 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替换了旧版的EnglishQuotes
、FrenchQuotes
和GermanQuotes
。
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;
进行标题中的单词断行。
⚠请注意,当前屏幕阅读器无法正确拼读包含­
标签的单词。因此,应谨慎使用连字符过滤器,否则可能会降低您网站的可访问性。
花括号引号(智能引号)
将直引号'
替换为花括号引号’
。有一个例外需要考虑:英尺和英寸标记(分钟和秒标记)。纯粹主义者使用尖括号′
,此修复程序使用直引号以实现兼容性。更多关于花括号引号的信息。
商标
处理商标符号™
、注册商标符号®
和版权符号©
。此修复程序替换了常用近似值:(r)
、(c)
和(TM)
。在数字和版权符号之间也放置非断行空格。
单位(以前称为数字)
在数字和其单位之间添加非断行空格。例如:12_h
、42_฿
或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
$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跟踪器...您可以自己看看
- 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