Всякие разные штуки сомнительной полезности сделанные в свободное от работы время.
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
Комментарии
|
|
|
Да-к чем кончится то?! Опять забросишь? Публика то ждет
![]() |
|
|
|
Олег, ты шутишь, да?
![]() |
|
|
|
Ой блииин... я чет совсем заработался...
нда...Хотя все равно остается открытым вопрос: <foo{ "bar" } /> является валидным, или нет? Не скомпилируется, пробовал, но я не вижу явных ограничений... |
|
|
Обновил(-а) wvxvw 27.04.2011 в 03:23
|
|
|
|
Грядет эра валидного as-кода...
|
|
|
|
кстати ... двоеточие не совсем валиден в именах. это разделитель QName.
|
Последние записи от wvxvw
- Dired - текстовый проводник по файловой системе (29.06.2013)
- Навигация по HTML с WASD (09.06.2012)
- JavaScript, все не так плохо (07.06.2012)
- Что такое tarball и чем его пакуют (11.04.2012)
- Критика Presentation Model (18.02.2012)














