StyleSheets может содержать имена с пробелами, поэтому, например, «classOne classTwo» является допустимым идентификатором - все, что вам нужно сделать, это объединить ссылочные стили в новый стиль под объединенным именем, и ваш текст будет отображаться правильно.
Это можно сделать, расширив класс TextField и вручную объединив все ссылочные стили в атрибутах class
вашего htmlText
в новую таблицу стилей, которая затем передается в super.styleSheet
вместо исходногоодин:
package
{
import flash.text.StyleSheet;
import flash.text.TextField;
public class MyWildTextField extends TextField
{
private var _combinedStyleSheet:StyleSheet = new StyleSheet();
private var _styleSheet : StyleSheet;
override public function set htmlText( text:String ) : void {
combineStyles(text);
super.styleSheet = _combinedStyleSheet;
super.htmlText = text;
}
private function combineStyles( text:String ):void {
for each (var name : String in styleSheet.styleNames)
_combinedStyleSheet.setStyle(name, styleSheet.getStyle(name));
var styles:Array = extractStyleNames( text );
for each( var style:String in styles) addCombinedStyle( style );
}
private function extractStyleNames( text:String ):Array {
var xml:XML = XML( text );
var styles:Array = [];
var allNodes:XMLList = xml..*;
var allAttributes:XMLList = allNodes.attributes();
styles = addStyleNames (allAttributes, styles);
styles = addStyleNames (xml.attributes(), styles);
return styles;
}
private function addCombinedStyle( style:String ):void {
if(style.indexOf( " " ) > -1)
_combinedStyleSheet.setStyle( "."+style, getCombinedStyle( style ) );
}
private function addStyleNames (attributes:XMLList, arr:Array) : Array {
for each( var node:XML in attributes)
if(node.name() == "class")
arr.push( node.valueOf().toString() );
return arr;
}
private function getCombinedStyle( style:String ):Object {
var combined:Object = {};
for each( var name:String in style.split( " " ))
combined = addStyleProperties( combined, name );
return combined;
}
private function addStyleProperties( combined:Object, name:String ):Object {
var style:Object = styleSheet.getStyle( "."+name );
for( var prop:String in style)
combined[prop] = style[prop];
return combined;
}
override public function get styleSheet () : StyleSheet {
return _styleSheet;
}
override public function set styleSheet ( styleSheet:StyleSheet ) : void {
_styleSheet = styleSheet;
}
}
}