Всякие разные штуки сомнительной полезности сделанные в свободное от работы время.
XML - Serious Business
Запись от wvxvw размещена 24.04.2011 в 21:50
Когда-то давно я хотел написать програму для подсветки синтаксиса в AS3. Чего-то сделал, чего-то не доделал, оставил на полпути потому что E4X оказался слишком сложным, и не захотелось возиться. Сейчас решил вернуться и все-таки сделать. Особенно захотелось это сделать потому, что нет ни одного AS3 редактора, который бы делал это правильно, а иногда хочется, чтобы исходники выглядели красиво.
Да, я знаю, что FDT умеет даже автокомплитить E4X, и тем не менее, он тоже не идеален в плане покраски - а все вот почему: Adobe нигде никогда не публиковала своего стандарта или хотябы каких-нибудь правил, которых они придерживаются в реализации E4X. Единственное, что они предлагают почитать по этому поводу - вот. Да, вы, возможно, знали о его существовании, но заглядывали ли вы когда-нибудь вовнутрь? Реализация Adobe ну, как минимум на четверть не соответствует тому, что там написано. Например, toXMLString() по задумке авторов должна была принимать параметры - отступы и пространства имен, из которых собирать XML. Но это мелочи.
Я стал разбираться с этим документом потому, что в парсере нужно было выяснить, где можно ожидать фигурные скобки. Оказалось, что мнения компилятора и стандарта практически не совпадают. Так, например, по стандарту в CData фигурные скобки должны интерпретироваться как управляющий элемент, внути processing instruction - тоже, и так же внутри комментариев. А оппаньки...
Еще, интересный момент - очевидно изза того, что $ знак можно использовать в названиях сущностей AS3, этот символ вдруг стал валидным для начала XML имени, и это в то время как вполне себе валидный символ : (двоеточие) оказался "вне закона". Вобщем, стою на асфальте, чешу затылок...
Код:
package tests { import flash.display.Sprite; import flash.utils.getQualifiedClassName; public class TestXML extends Sprite { public function TestXML() { super(); this.testE4XImplementation(); } private function testE4XImplementation():void { // http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-357.pdf page 10 // The left curly brace ({) and right curly brace (}) are used to delimit expressions that may be embedded in tags or // element content to dynamically compute portions of the XML initialiser. The curly braces may appear in literal form // inside an attribute value, a CDATA, PI, or XML Comment. In all other cases, the character reference { shall // be used to represent the left curly brace ({) and the character reference } shall be used to represent the // right curly brace (}). var xml:XML = <![CDATA[let's see... {getQualifiedClassName(this)}]]>; // I had no doubt, srsly //<![CDATA[let's see... {getQualifiedClassName(this)}]]> trace(xml.toXMLString()); XML.ignoreProcessingInstructions = false; // ZOMG!!! no autocompletion in Flash Builder 4.5 after this line xml = <?{"foo"} could it be true?>; //<?{"foo"} could it be true?> trace(xml.toXMLString()); xml = <foo>should this work? { "tee-hee" } or maybe not?</foo>; // <foo>should this work? tee-hee or maybe not?</foo> trace(xml.toXMLString()); XML.ignoreComments = false; xml = <!-- unmöglich! { "impossible in German language" } -->; // <!-- unmöglich! { "impossible in German language" } --> trace(xml.toXMLString()); // http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-357.pdf page 11 // XMLName :: // XMLNameStart // XMLName XMLNamePart // XMLNameStart :: // UnicodeLetter // underscore _ // colon : // http://www.w3.org/TR/xml/#NT-NameStartChar // [4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | // [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | // [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | // [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] try { xml = <_this-shouldnt-be-valid />; // <_this-shouldnt-be-valid/> trace(xml.toXMLString()); } catch (error:TypeError) { trace(error.getStackTrace()); } try { xml = <$how-about-this />; // <$how-about-this/> trace(xml.toXMLString()); trace("$".charCodeAt().toString(16)); //24 } catch (error:TypeError) { trace(error.getStackTrace()); } try { xml = <:go-colon-go />; trace(xml.toXMLString()); } catch (error:TypeError) { // TypeError: Error #1090: XML parser failure: element is malformed. // // at tests::TestProto/testE4XImplementation()[/home/wvxvw/Projects/e4xu/src/tests/TestProto.as:75] // at tests::TestProto()[/home/wvxvw/Projects/e4xu/src/tests/TestProto.as:11] trace(error.getStackTrace()); } xml = <öhow-about-this />; // <öhow-about-this/> trace(xml.toXMLString()); xml = <text> la-la-la, { moooaha-ha! } ke-ke-ke </text>; // <text>la-la-la, { moooaha-ha! } ke-ke-ke</text> trace(xml.toXMLString()); } } }
Всего комментариев 10
Комментарии
26.04.2011 01:53 | |
Да-к чем кончится то?! Опять забросишь? Публика то ждет
|
26.04.2011 23:55 | |
Олег, ты шутишь, да?
|
27.04.2011 03:19 | |
Ой блииин... я чет совсем заработался... нда...
Хотя все равно остается открытым вопрос: <foo{ "bar" } /> является валидным, или нет? Не скомпилируется, пробовал, но я не вижу явных ограничений... |
|
Обновил(-а) wvxvw 27.04.2011 в 03:23
|
27.04.2011 11:56 | |
Грядет эра валидного as-кода...
|
28.04.2011 13:23 | |
кстати ... двоеточие не совсем валиден в именах. это разделитель QName.
|
Последние записи от wvxvw
- Dired - текстовый проводник по файловой системе (29.06.2013)
- Навигация по HTML с WASD (09.06.2012)
- JavaScript, все не так плохо (07.06.2012)
- Что такое tarball и чем его пакуют (11.04.2012)
- Критика Presentation Model (18.02.2012)