代码之家  ›  专栏  ›  技术社区  ›  Tyler Carter

输入doctypes

  •  0
  • Tyler Carter  · 技术社区  · 16 年前

    我有一个 Document 类,该类负责保存最终将被gzip处理并打印到页上的文档。在该文档中保存文档的doctype。我面临的问题是如何正确实现显示doctype。

    例如:我可以创建一个最常用的doctypes数组,如果输入“strict”,它将自动选择 HTML 4.01 Strict . 如果没有已知的doctype,则可以假定您正在输入自定义doctype,并只显示输入的内容。这似乎是一个容易出错和笨拙的问题。

        $document->setDoctype("strict");
    
        ..... in a class far, far, away........
        function setDocType($type)
        {
            if(in_array($type, $this->doctypes))
             {
                 $this->doctype = $this->doctypes[$type];
             }
             else
             {
                 $this->doctype = $type;
             }
        }
    

    另一种方法是每次只需输入整个doctype。

    $document->setDoctype('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">');
    

    你将如何处理这个问题?

    3 回复  |  直到 16 年前
        1
  •  1
  •   RaYell    16 年前

    这取决于是否允许输入自定义doctypes。如果您将这种情况视为异常,那么当有人尝试使用未定义的doctype时,您可能会抛出异常。您还可以提供定义自定义doctype的方法,并在设置实际doctype之前强制使用该方法。

    我会这样做:

    class Document {
        private $doctypes = array(
            'html4' => '...',
            'xhtml1strict' => '...'
        );
    
        private $doctype = null;
    
        public function addCustomDocType($name, $definition) {
            if (empty($this->doctypes[$name])) {
                $this->doctypes[$name] = $definition;
            } else {
                throw new Exception('Definition already exists');
            }
        }
    
        public function setDocType($name) {
            if (!empty($this->doctypes[$name])) {
                $this->doctype = $this->doctypes[$name];
            } else {
                throw new Exception('Doctype not found');
            }
        }
    }
    

    第二个必须输入doctype定义的解决方案是imo难看的,我将避免它。

        2
  •  1
  •   Thinker    16 年前

    我认为您应该签出doctype w3c列表。 http://www.w3.org/QA/2002/04/valid-dtd-list.html

        3
  •  0
  •   Daniel    16 年前

    是否允许用户输入自定义doctype?

    也许创建一个基类

    doc

    并扩展到每种类型,例如:

    StrictDoc扩展了Doc 等。

    它将为每个文档设置自己的文档类型。如果要添加到文档类型,只需创建另一个扩展文档的类。

    推荐文章