Вопрос

У меня есть Document класс, который отвечает за хранение документа, который в конечном итоге будет сжат и затем распечатан на странице.В этом документе содержится DocType документа.Проблема, с которой я сталкиваюсь, заключается в том, как правильно реализовать отображение Doctype.

Например:Я мог бы создать массив популярных типов документов, которые являются наиболее часто используемыми, а затем, если вы введете 'strict', он автоматически выберет HTML 4.01 Strict.Если известного типа документа нет, можно предположить, что вы вводите пользовательский тип документа, и просто отобразить то, что вы ввели.Это кажется подверженным ошибкам и неуклюжим.

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

Как бы вы справились с этой проблемой?

Это было полезно?

Решение

Это зависит от того, хотите ли вы разрешить ввод пользовательских типов документов.Если вы считаете эту ситуацию исключением, вам, вероятно, следует выдавать исключение, когда кто-то пытается использовать undefined 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 уродливым, и я бы избегал его.

Другие советы

Я думаю, вам следует просто проверить список doctype w3c.http://www.w3.org/QA/2002/04/valid-dtd-list.html

Разрешено ли пользователям вводить пользовательский doctype?

Возможно, создать базовый класс

Док

И распространить его на каждый тип, например:

StrictDoc расширяет Doc и т.д.

И он установит свой собственный тип документа для каждого из них.Если вы хотите добавить к типам doc, просто создайте другой класс, расширяющий Doc.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top