Не позволяйте JSPX создавать самозакрывающиеся теги (<div></div>! = <Div />) - PullRequest
6 голосов
/ 11 октября 2010

JSPX имеет прекрасный побочный эффект поворота:

<div class="magic"></div>

В

<div class="magic" />

Для многих браузеров это приводит к столпотворению и беспорядку с макетом, даже если это допустимый XHTML. Следовательно, я прибег к использованию отличного скрипта, чтобы найти все возможные плохие HTML со следующим регулярным выражением:

def m = html =~ /<(\w+)[^>]*?><\/(\w+)>/
def bad = m.findAll { it[1] == it[2]  };

Есть ли способ заставить процессор JSPX XML не закрывать теги самостоятельно?

Ответы [ 5 ]

10 голосов
/ 15 ноября 2010

Я использую <div><jsp:text/></div>

3 голосов
/ 11 октября 2010

AFAIK, элегантного решения для этого не существует (читай: настраивается на уровне контейнера).Проверьте « элемент сценария jspx на GlassFish v3 » на наличие возможных обходных путей.

2 голосов
/ 09 января 2011

Вы также можете создать пользовательскую библиотеку тегов или инкапсулировать вашу <div></div> в CDATA.Подробнее здесь: Как создать корректный HTML с JSPX?(не XHTML)

2 голосов
/ 11 октября 2010

Вы можете попытаться указать содержимое внутри элемента, которое не повлияет на визуализацию HTML, но предотвратит сериализацию XHTML как самозакрывающегося элемента; как комментарий, инструкция обработки или неразрывный символ пробела (&#x200B;).

1 голос
/ 20 октября 2010

Как отметил Neeme, похоже, нет решения этой проблемы. Однако я написал Groovy-скрипт, в котором вы можете использовать вызов Maven (GMaven) для проверки возможных тегов XHTML, которые будут закрыты самостоятельно.

Этот сценарий, вероятно, нуждается в улучшенных сообщениях об ошибках и не обрабатывает все случаи, но до сих пор устранял проблему.

#!/usr/bin/env groovy


def srcdir = project.properties['srcdir'];
def badFiles = [];

def checkFile(badFiles, file) {
    def htmlLines = file.readLines();
    def found = [];
    int i = 0;
    for (html in htmlLines) {
        ++i;
        //print html;
        def m = html =~ /<(\w+)[^>]*?><\/(\w+)>/
        def bad = m.findAll { it[1] == it[2]  };
        if (bad)
            found.add(['bad' : bad, 'line' : i]);
    }
    if (found) {
        badFiles << file;
        println "File had bad HTML: " + file.canonicalPath;
        println found;
    }

}

def ant = new AntBuilder();
scanner = ant.fileScanner {
    fileset(dir:srcdir) {
        include(name:"**/*.jspx")
    }
}

for (f in scanner) {
    //println "Checking file: " + f.canonicalPath;
    checkFile(badFiles, f);
}
if (badFiles) { 
    println "Bad files: " + badFiles;
    fail('Bad files: ' + badFiles);
}
...