<?php
// $Header: /cvsroot/html2ps/css.list-style-type.inc.php,v 1.13 2006/09/07 18:38:14 Konstantin Exp $

// FIXME: supported only partially
define('LST_NONE',0);
define('LST_DISC',1);
define('LST_CIRCLE',2);
define('LST_SQUARE',3);
define('LST_DECIMAL',4);
define('LST_DECIMAL_LEADING_ZERO',5);
define('LST_LOWER_ROMAN',6);
define('LST_UPPER_ROMAN',7);
define('LST_LOWER_LATIN',8);
define('LST_UPPER_LATIN',9);

class CSSListStyleType extends CSSSubFieldProperty {
  // CSS 2.1: default value for list-style-type is 'disc'
  function default_value() { return LST_DISC; }

  function parse($value) {
    if (preg_match('/\bnone\b/',$value))    { return LST_NONE; };
    if (preg_match('/\bdisc\b/',$value))    { return LST_DISC; };
    if (preg_match('/\bcircle\b/',$value))  { return LST_CIRCLE; };
    if (preg_match('/\bsquare\b/',$value))  { return LST_SQUARE; };
    if (preg_match('/\bdecimal-leading-zero\b/',$value)) { return LST_DECIMAL_LEADING_ZERO; }
    if (preg_match('/\bdecimal\b/',$value)) { return LST_DECIMAL; };
    if (preg_match('/\blower-roman\b/',$value)) { return LST_LOWER_ROMAN; }
    if (preg_match('/\bupper-roman\b/',$value)) { return LST_UPPER_ROMAN; }
    if (preg_match('/\blower-latin\b/',$value)) { return LST_LOWER_LATIN; }
    if (preg_match('/\bupper-latin\b/',$value)) { return LST_UPPER_LATIN; }
    if (preg_match('/\blower-alpha\b/',$value)) { return LST_LOWER_LATIN; }
    if (preg_match('/\bupper-alpha\b/',$value)) { return LST_UPPER_LATIN; }

    // Unsupported CSS values:
    // According to CSS 2.1 specs 12.6.2, a user agent that does not recognize a numbering system should use 'decimal'.
    if (preg_match('/\bhebrew\b/',$value)) { return LST_DECIMAL; };
    if (preg_match('/\bgeorgian\b/',$value)) { return LST_DECIMAL; };
    if (preg_match('/\barmenian\b/',$value)) { return LST_DECIMAL; };
    if (preg_match('/\bcjk-ideographic\b/',$value)) { return LST_DECIMAL; };
    if (preg_match('/\bhiragana\b/',$value)) { return LST_DECIMAL; };
    if (preg_match('/\bkarakana\b/',$value)) { return LST_DECIMAL; };
    if (preg_match('/\bhiragana-iroha\b/',$value)) { return LST_DECIMAL; };
    if (preg_match('/\bkatakana-iroha\b/',$value)) { return LST_DECIMAL; };
    if (preg_match('/\blower-greek\b/',$value)) { return LST_DECIMAL; };

    return null;
  }

  function format_number($type,$num) {
    // NOTE: according to CSS 2.1 specs 12.6.2, "This specification does not define how alphabetic systems wrap 
    // at the end of the alphabet. For instance, after 26 list items, 'lower-latin' rendering is undefined. 
    // Therefore, for long lists, we recommend that authors specify true numbers.".
    // In our case we chose just to wrap over the beginning of alphabet (so, 'a' will again appear after 'z')
    //
    // Also, we're hoping that encoding we're using contains character codes in alphabetic order
    // It is true for ASCII, but there's some other crazy encodings... :-)
    //
    // Also, I really do not understand _WHY_ PHP is spewing a lot of notice messages complaining about 
    // undefined constants if I'm using the equivalent 'switch' construct instead of 'if'
    switch ($type) {
    case LST_DECIMAL:
      return $num; 
    case LST_DECIMAL_LEADING_ZERO:
      return sprintf("%02d",$num); 
    case LST_LOWER_LATIN:
      return chr(ord('a')+($num-1) % 26); 
    case LST_UPPER_LATIN:
      return chr(ord('A')+($num-1) % 26); 
    case LST_LOWER_ROMAN:
      return strtolower(arabic_to_roman($num)); 
    case LST_UPPER_ROMAN:
      return arabic_to_roman($num); 
    default:
      return "";
    }
  }

  function get_property_code() {
    return CSS_LIST_STYLE_TYPE;
  }

  function get_property_name() {
    return 'list-style-type';
  }
}

?>