我有一个Document类是负责保持最终将被gzip压缩,然后印刷到页面的文档。在该文件中保存文档的DOCTYPE。我现在面临的问题是如何正确地执行显示所述文档类型。

例如:我可以创建流行的文档类型,如果你输入“严格”是最常用的,然后数组,它会自动挑选HTML 4.01 Strict。如果没有一个已知的DocType,它可以假设你在自定义的DocType正在进入,并且只显示你输入的内容。这似乎是一个容易出错,clumbsy。

    $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">');
你会

如何处理这个问题?

有帮助吗?

解决方案

这取决于如果你想允许进入的自定义文档类型。如果您认为情况异常,当有人试图使用未定义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难看,我会避免它。

其他提示

我觉得你应该只检出DOCTYPE W3C名单。 http://www.w3.org/QA/2002/ 04 /有效-DTD的list.html

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

也许创建一个基类

文档

和它延伸到每种类型的,例如:

StrictDoc延伸督 等

,它会为每一个自己的文档类型。如果你想添加到文档类型,只需创建一个扩展文件的类。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top