function SmartyPants in Typogrify 7
Same name and namespace in other branches
- 5 smartypants.php \SmartyPants()
- 6 smartypants.php \SmartyPants()
SmartyPants.
Parameters
string $text: Text to be parsed.
string $attr: Value of the smart_quotes="" attribute.
string $ctx: MT context object (unused).
3 calls to SmartyPants()
- smarty_modifier_smartypants in ./
smartypants.php - Wrapper methode for SmartyPants.
- Typogrify::filter in ./
typogrify.class.php - typogrify
- _typogrify_process in ./
typogrify.module - Processing function to apply the Typogrify filters.
1 string reference to 'SmartyPants'
- _typogrify_settings in ./
typogrify.module - Typogrify filter settings form.
File
- ./
smartypants.php, line 105 - SmartyPants - Smart punctuation for web sites
Code
function SmartyPants($text, $attr = NULL, $ctx = NULL) {
if ($attr == NULL) {
global $_typogrify_smartypants_attr;
$attr = $_typogrify_smartypants_attr;
}
// Options to specify which transformations to make.
$do_stupefy = FALSE;
// Should we translate " entities into normal quotes?
$convert_quot = 0;
// Parse attributes:
// 0 : do nothing
// 1 : set all
// 2 : set all, using old school en- and em- dash shortcuts
// 3 : set all, using inverted old school en and em- dash shortcuts
//
// q : quotes
// b : backtick quotes (``double'' and ,,double`` only)
// B : backtick quotes (``double'', ,,double``, ,single` and `single')
// d : dashes
// D : old school dashes
// i : inverted old school dashes
// e : ellipses
// w : convert " entities to " for Dreamweaver users.
if ($attr == "0") {
// Do nothing.
return $text;
}
elseif ($attr == "1") {
// Do everything, turn all options on.
$do_quotes = 2;
$do_backticks = 1;
$do_dashes = 1;
$do_ellipses = 1;
}
elseif ($attr == "2") {
// Do everything, turn all options on, use old school dash shorthand.
$do_quotes = 2;
$do_backticks = 1;
$do_dashes = 2;
$do_ellipses = 1;
}
elseif ($attr == "3") {
// Do everything, turn all options on,
// use inverted old school dash shorthand.
$do_quotes = 2;
$do_backticks = 1;
$do_dashes = 3;
$do_ellipses = 1;
}
elseif ($attr == "-1") {
// Special "stupefy" mode.
$do_stupefy = 1;
}
else {
$chars = preg_split('//', $attr);
foreach ($chars as $c) {
if ($c == "q") {
$do_quotes = 1;
}
elseif ($c == "Q") {
$do_quotes = 2;
}
elseif ($c == "b") {
$do_backticks = 1;
}
elseif ($c == "B") {
$do_backticks = 2;
}
elseif ($c == "d") {
$do_dashes = 1;
}
elseif ($c == "D") {
$do_dashes = 2;
}
elseif ($c == "i") {
$do_dashes = 3;
}
elseif ($c == "e") {
$do_ellipses = 1;
}
elseif ($c == "w") {
$convert_quot = 1;
}
}
}
if ($do_quotes == 2) {
$doc_lang = $ctx['langcode'];
}
else {
$doc_lang = 'en';
}
$tokens = _TokenizeHTML($text);
$result = '';
// Keep track of when we're inside <pre> or <code> tags.
$in_pre = 0;
// This is a cheat, used to get some context
// for one-character tokens that consist of
// just a quote char. What we do is remember
// the last character of the previous text
// token, to use as context to curl single-
// character quote tokens correctly.
$prev_token_last_char = '';
foreach ($tokens as $cur_token) {
if ($cur_token[0] == 'tag') {
// Don't mess with quotes inside tags.
$result .= $cur_token[1];
if (preg_match(SMARTYPANTS_TAGS_TO_SKIP, $cur_token[1], $matches)) {
$in_pre = isset($matches[1]) && $matches[1] == '/' ? 0 : 1;
}
else {
// Reading language from span.
if (preg_match('/<span .*(xml:)?lang="(..)"/', $cur_token[1], $matches)) {
$span_lang = $matches[2];
}
elseif ($cur_token[1] == '</span>') {
unset($span_lang);
}
}
}
else {
$t = $cur_token[1];
// Remember last char of this token before processing.
$last_char = mb_substr($t, -1);
if (!$in_pre) {
$quotes = typogrify_i18n_quotes(isset($span_lang) ? $span_lang : $doc_lang);
$t = ProcessEscapes($t);
if ($convert_quot) {
$t = preg_replace('/"/', '"', $t);
}
if ($do_dashes) {
if ($do_dashes == 1) {
$t = EducateDashes($t);
}
elseif ($do_dashes == 2) {
$t = EducateDashesOldSchool($t);
}
elseif ($do_dashes == 3) {
$t = EducateDashesOldSchoolInverted($t);
}
}
if ($do_ellipses) {
$t = EducateEllipses($t);
}
// Note: backticks need to be processed before quotes.
if ($do_backticks) {
$t = EducateBackticks($t);
if ($do_backticks == 2) {
$t = EducateSingleBackticks($t);
}
}
if ($do_quotes) {
$t = EducateBackticks($t);
if ($t == "'") {
// Special case: single-character ' token.
if (preg_match('/\\S/', $prev_token_last_char)) {
$t = $quotes[3];
}
else {
$t = $quotes[2];
}
}
elseif ($t == '"') {
// Special case: single-character " token.
if (preg_match('/\\S/', $prev_token_last_char)) {
$t = $quotes[1];
}
else {
$t = $quotes[0];
}
}
else {
// Normal case:
$t = EducateQuotes($t, $quotes);
}
}
if ($do_stupefy) {
$t = StupefyEntities($t);
}
}
$prev_token_last_char = $last_char;
$result .= $t;
}
}
return $result;
}