You are here

function SmartyPants in Typogrify 5

Same name and namespace in other branches
  1. 6 smartypants.php \SmartyPants()
  2. 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'
smartypants.php in ./smartypants.php
unicode-conversion.php in ./unicode-conversion.php
_typogrify_settings in ./typogrify.module

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('/&quot;/', '"', $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 = "&#8217;";
            }
            else {
              $t = "&#8216;";
            }
          }
          else {
            if ($t == '"') {

              # Special case: single-character " token
              if (preg_match('/\\S/', $prev_token_last_char)) {
                $t = "&#8221;";
              }
              else {
                $t = "&#8220;";
              }
            }
            else {

              # Normal case:
              $t = EducateQuotes($t);
            }
          }
        }
        if ($do_stupefy) {
          $t = StupefyEntities($t);
        }
      }
      $prev_token_last_char = $last_char;
      $result .= $t;
    }
  }
  return $result;
}