jolicode/jolitypo 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

jolicode/jolitypo

Composer 安装命令:

composer require jolicode/jolitypo

包简介

Microtypography fixer for the web.

README 文档

README

JoliTypo
JoliTypo – Web Microtypography fixer
Finally a tool for typography nerds.

PHP Version Require Monthly Downloads

Introduction

JoliTypo is a tool fixing Microtypography glitches inside your HTML content. When your CMS outputs " " instead of “ ” or ... instead of , JoliTypo can help.

use JoliTypo\Fixer;

// Create a Fixer, specify the fixes
$fixer = new Fixer(['Ellipsis', 'Dash', 'SmartQuotes', 'CurlyQuote', 'Hyphen']);

// Get HTML content with correct microtypography
$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>

“Tell me Mr. Anderson… what good is a phone call… if you’re unable to speak?”—Agent Smith, Matrix.

It's designed to be:

  • language agnostic (you can fix fr_FR, fr_CA, en_US... you tell JoliTypo what to fix);
  • easy to integrate into modern PHP projects (composer and autoload);
  • robust (makes use of \DOMDocument instead of parsing HTML with dummy regexp);
  • smart enough to avoid JavaScript, Code, CSS processing... (configurable protected tags list);
  • fully tested;
  • fully open and usable in any project (MIT License).

You can try it with the online demo!

Quick usage

Just tell the Fixer class which Fixer you want to run on your content and then, call fix():

use JoliTypo\Fixer;

$fixer = new Fixer(['SmartQuotes', 'SpaceBeforePunctuation']);
$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>');

For your ease of use, you can find ready to use list of Fixer for your language here. Micro-typography is nothing like a standard or a law, what really matters is consistency, so feel free to use your own lists.

Note

Please be advised that JoliTypo works best on HTML content; it will also work on plain text, but will be less smart about smart quotes. When fixing a complete HTML document, potential <head>, <html> and <body> tags may be removed.

To fix non HTML content, use the fixString() method:

use JoliTypo\Fixer;

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

CLI usage

You can run a standalone version of JoliTypo by downloading the PHAR version

Run jolitypo --help to know how to configure the Fixer.

Installation

Requirements are handled by Composer (libxml and mbstring are required).

composer require jolicode/jolitypo

Usage outside composer is also possible, just add the src/ directory to any PSR-0 compatible autoloader.

Integrations

🚨 There are no WordPress plugin anymore, feel free to build one!

Available Fixers

Dash

Replaces the simple dash - by a ndash between numbers (dates ranges...) and the double -- by a mdash .

Dimension

Replaces the letter x between numbers (12 x 123) by a times entity (×, the real mathematical symbol).

Ellipsis

Replaces the three dots ... by an ellipsis .

SmartQuotes

Converts dumb quotes " " to all kinds of smart style quotation marks (“ ”, « », „ “...). Handles a good variety of locales, like English, Arabic, French, Italian, Spanish, Irish, German...

See the code for more details, and do not forget to specify a locale on the Fixer instance.

This Fixer replaces legacy EnglishQuotes, FrenchQuotes and GermanQuotes.

SpaceBeforePunctuation

Locale-aware fixer for spacing before punctuation marks. Handles:

  • French (fr, fr_FR, fr_BE, fr_CH): Adds non-breaking space before : and thin non-breaking space before ;, !, ?
  • Canadian French (fr_CA): No space before punctuation (follows English conventions)
  • Swiss German (de_CH): Uses French-style guillemets with thin spaces
  • All other locales: Removes any incorrect space before punctuation

This fixer requires a locale to be set on the Fixer with $fixer->setLocale('fr_FR');.

FrenchNoBreakSpace (deprecated)

Warning

This fixer is deprecated. Use SpaceBeforePunctuation instead.

Replaces some classic spaces by non-breaking spaces following the French typographic code. No break space are placed before :, thin no break space before ;, ! and ?.

NoSpaceBeforeComma

Removes space before , and makes sure there is only one space after.

Hyphen (automatic hyphenation)

Makes use of org_heigl/hyphenator, a tool enabling word-hyphenation in PHP. This Hyphenator uses the pattern-files from OpenOffice which are based on the pattern-files created for TeX.

There are only some locales available for this 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.

You can read more about this fixer on the official github repository.

This Fixer requires a Locale to be set on the Fixer with $fixer->setLocale('fr_FR');. Default to en_GB.

Proper hyphenation is mandatory in justified text and you should avoid word breaking in titles with this line of CSS: hyphens:none;.

⚠ Be aware that the current screen readers are unable to spell correctly the words containing &shy; tags. The Hyphen filter should therefore be used with caution or you might reduce your website's accessibility.

CurlyQuote (Smart Quote)

Replaces straight quotes ' with curly ones . There is one exception to consider: foot and inch marks (minutes and second marks). Purists use prime , this fixer uses straight quotes for compatibility. Read more about Curly quotes.

Trademark

Handles trade­mark symbol , a registered trade­mark symbol ®, and a copy­right symbol ©. This fixer replaces commonly used approximations: (r), (c) and (TM). A non-breaking space is put between numbers and copyright symbols too.

Unit (formerly Numeric)

Adds a non-breaking space between a numeral and its unit. Like this: 12_h, 42_฿ or 88_%. It was named Numeric before release 1.0.2, but BC is kept for now.

It is really easy to make your own Fixers, feel free to extend the provided ones if they do not fit your typographic rules.

Fixer recommendations by locale

en_GB

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

fr_FR

Those rules apply for most of the recommendations of "Abrégé du code typographique à l'usage de la presse", ISBN: 9782351130667.

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

fr_CA

Mostly the same as fr_FR, but the space before punctuation points is not mandatory.

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

de_DE

Mostly the same as en_GB, according to Typefacts and Wikipedia.

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

More to come (contributions welcome!).

Locale support for spacing and quotes

JoliTypo supports locale-specific rules for spacing before punctuation and quotation marks:

Locale Space Before : ; ! ? Quote Style
fr_FR, fr_BE, fr_CH YES (nbsp/nnbsp) « text »
fr_CA NO « text »
de_DE, de_AT NO „text“
de_CH NO «text»
en_* NO “text”
es_, it_, pt_* NO «text»
pl_, cs_, sk_, hu_, ro_, bg_ NO „text“
ru_, uk_, be_* NO «text»
sv_, fi_ NO "text"
nl_, tr_ NO "text"

See LocaleConfig::QUOTE_STYLES_BY_LOCALE for the complete list of supported languages.

Documentation

Default usage

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

Define your own Fixer

If you want to add your own Fixer to the list, you have to implement JoliTypo\FixerInterface. Then just give JoliTypo their fully qualified name, or even instance:

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

Configure the protected tags

Protected tags is a list of HTML tag names that the DOM parser must avoid. Nothing in those tags will be fixed.

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

Add your own Fixer / Contribute a Fixer

  • Write tests;
  • A Fixer is run on a piece of text, no HTML to deal with;
  • Implement JoliTypo\FixerInterface;
  • Send your Pull request.

Contribution guidelines

  • You MUST write code in english;
  • you MUST follow PSR2 and Symfony coding standard (run composer cs on your branch);
  • you MUST run the tests (run composer test);
  • you MUST comply to the MIT license;
  • you SHOULD write documentation.

If you add a new Fixer, please provide sources and references about the typographic rule you want to fix.

Compatibility & OS support restrictions

  • Windows XP : Thin No-Break Space can't be used, all other spaces are ignored, but they do not look bad (normal space).
  • Mac OS Snow Leopard : no no-break space, half no-break space, ems and en-dash but doesn't look bad (normal space).

BUT if you use a font (@font-face maybe) that contains all those glyphs, there will be no issues.

There is a known issue preventing JoliTypo to work correctly with APC versions older than 3.1.11.

What can you do to help?

We need to be able to use this tool everywhere, you can help by providing:

  • Wordpress plugin (to replace or complete wptexturize)
  • Dotclear plugin ...

Also, there is a Todo list 😘

License

This piece of code is under MIT License. See the LICENSE file.

Alternatives and other implementations

There is already quite a bunch of tools like this one (including good ones). Sadly, some are only for one language, some are running regexp on the whole HTML code (which is bad), some are not tested, some are bundled inside a CMS or a Library, some are not using proper auto-loading, some do not have an open bug tracker... Have a look by yourself:

Glossary & References

Thanks to theses online resources for helping a developer understand typography:

Typography rules by language:



JoliCode is sponsoring this project

jolicode/jolitypo 适用场景与选型建议

jolicode/jolitypo 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 1.1M 次下载、GitHub Stars 达 348, 最近一次更新时间为 2013 年 05 月 21 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「typography」 「quote」 「ellipsis」 「fixer」 「smartquote」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 jolicode/jolitypo 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 jolicode/jolitypo 我们能提供哪些服务?
定制开发 / 二次开发

基于 jolicode/jolitypo 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 1.1M
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 351
  • 点击次数: 31
  • 依赖项目数: 7
  • 推荐数: 0

GitHub 信息

  • Stars: 348
  • Watchers: 31
  • Forks: 27
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2013-05-21