function SmartyPants in Typogrify 5
Same name and namespace in other branches
- 6 smartypants.php \SmartyPants()
- 7 smartypants.php \SmartyPants()
3 calls to SmartyPants()
- smarty_modifier_smartypants in ./
smartypants.php - Typogrify::filter in ./
typogrify.class.php - typogrify
- _typogrify_process in ./
typogrify.module
3 string references to 'SmartyPants'
File
- ./
smartypants.php, line 72
Code
function SmartyPants($text, $attr = NULL, $ctx = NULL) {
global $smartypants_attr, $sp_tags_to_skip;
# Paramaters:
$text;
# text to be parsed
$attr;
# value of the smart_quotes="" attribute
$ctx;
# MT context object (unused)
if ($attr == NULL) {
$attr = $smartypants_attr;
}
# Options to specify which transformations to make:
$do_stupefy = FALSE;
$convert_quot = 0;
# should we translate " entities into normal quotes?
# 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'' only)
# B : backtick quotes (``double'' 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;
}
else {
if ($attr == "1") {
# Do everything, turn all options on.
$do_quotes = 1;
$do_backticks = 1;
$do_dashes = 1;
$do_ellipses = 1;
}
else {
if ($attr == "2") {
# Do everything, turn all options on, use old school dash shorthand.
$do_quotes = 1;
$do_backticks = 1;
$do_dashes = 2;
$do_ellipses = 1;
}
else {
if ($attr == "3") {
# Do everything, turn all options on, use inverted old school dash shorthand.
$do_quotes = 1;
$do_backticks = 1;
$do_dashes = 3;
$do_ellipses = 1;
}
else {
if ($attr == "-1") {
# Special "stupefy" mode.
$do_stupefy = 1;
}
else {
$chars = preg_split('//', $attr);
foreach ($chars as $c) {
if ($c == "q") {
$do_quotes = 1;
}
else {
if ($c == "b") {
$do_backticks = 1;
}
else {
if ($c == "B") {
$do_backticks = 2;
}
else {
if ($c == "d") {
$do_dashes = 1;
}
else {
if ($c == "D") {
$do_dashes = 2;
}
else {
if ($c == "i") {
$do_dashes = 3;
}
else {
if ($c == "e") {
$do_ellipses = 1;
}
else {
if ($c == "w") {
$convert_quot = 1;
}
else {
# Unknown attribute option, ignore.
}
}
}
}
}
}
}
}
}
}
}
}
}
}
$tokens = _TokenizeHTML($text);
$result = '';
$in_pre = 0;
# Keep track of when we're inside <pre> or <code> tags.
$prev_token_last_char = "";
# 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.
foreach ($tokens as $cur_token) {
if ($cur_token[0] == "tag") {
# Don't mess with quotes inside tags.
$result .= $cur_token[1];
if (preg_match("@{$sp_tags_to_skip}@", $cur_token[1], $matches)) {
$in_pre = isset($matches[1]) && $matches[1] == '/' ? 0 : 1;
}
}
else {
$t = $cur_token[1];
$last_char = substr($t, -1);
# Remember last char of this token before processing.
if (!$in_pre) {
$t = ProcessEscapes($t);
if ($convert_quot) {
$t = preg_replace('/"/', '"', $t);
}
if ($do_dashes) {
if ($do_dashes == 1) {
$t = EducateDashes($t);
}
if ($do_dashes == 2) {
$t = EducateDashesOldSchool($t);
}
if ($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) {
if ($t == "'") {
# Special case: single-character ' token
if (preg_match('/\\S/', $prev_token_last_char)) {
$t = "’";
}
else {
$t = "‘";
}
}
else {
if ($t == '"') {
# Special case: single-character " token
if (preg_match('/\\S/', $prev_token_last_char)) {
$t = "”";
}
else {
$t = "“";
}
}
else {
# Normal case:
$t = EducateQuotes($t);
}
}
}
if ($do_stupefy) {
$t = StupefyEntities($t);
}
}
$prev_token_last_char = $last_char;
$result .= $t;
}
}
return $result;
}