AS3 htmlText в TLFTextField с ошибками тегов CSS <a> и <h>

Во-первых, я знаю, что as3 не любит css или html, и что на этом форуме только около миллиарда вопросов об этом, но после поиска и поиска я не могу найти ничего похожего на то, что я испытываю. Пожалуйста, прости меня, если это болезненно очевидно, чтобы ответить / уже был дан ответ.

Ситуация

  • У меня есть проект, сделанный во Flash CS6 с кодировкой на временной шкале (я знаю, что это плохо, но уже слишком поздно менять)
  • Проект импортирует страницу WordPress, которая была экспортирована в RSS-канал и импортирована во flash как файл XML.
  • Текстовое поле TLF (я могу заставить его работать с классическими текстовыми полями, но хочу попытаться заставить его работать с TLF по разным причинам), и загруженный лист CSS применяется с помощью.stylesheet =, а текст устанавливается с помощью.htmlText =

Проблемы

Есть несколько глюков при рендеринге текста. Я знаю, что Flash не поддерживает все теги CSS, но даже базовые не совсем работают. Точные проблемы:

  • Заголовок, за которым следует заголовок (то есть

    ), объединяется с предыдущим заголовком (поэтому оба формата отформатированы как

    ), добавление тега

    между ними, кажется, исправляет это, но добавляет Разрыв строки:/

  • Теги, выделенные полужирным шрифтом и курсивом, оказываются трудными, замена и на и заставляет их работать самостоятельно, но когда они смешиваются вместе (как это), они вообще перестают работать
  • Это моя главная проблема: ссылки всегда отображаются синим цветом, независимо от того, что говорит CSS, несмотря на правильность:hover (исправьте это, и я мог бы жить со всем остальным)

Я думаю, что проблема заключается в моем коде где-то, так что вот as3:

import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.text.TextField;
import flash.events.ProgressEvent;
import fl.text.TLFTextField;

var fonts:Array = Font.enumerateFonts();
for each (var font:Font in fonts)
{
    trace( font.fontName+":"+font.fontType );
}

var rss_xml:XML = new XML();
var test_txt:TLFTextField = new TLFTextField  ;
with (test_txt)
{
    antiAliasType = AntiAliasType.ADVANCED;
    width = 940;
    height = 600;
    x = 0;
    y = 0;
    autoSize = TextFieldAutoSize.LEFT;
    wordWrap = true;
    embedFonts = true;
}
var sulsc_style:StyleSheet = new StyleSheet();
var css_loader:URLLoader = new URLLoader();

css_loader.load(new URLRequest("sulsc_style.css"));
css_loader.addEventListener(Event.COMPLETE, onCSSComplete);
function onCSSComplete(e:Event):void
{
    sulsc_style.parseCSS(e.target.data);
    rss_xml.ignoreWhitespace = false;
    var rss_loader:URLLoader = new URLLoader(new URLRequest("http://news.sulsc.org/feed"));
    rss_loader.addEventListener(Event.COMPLETE,rss_loaded);
    l.mode = "manual";
    rss_loader.addEventListener(ProgressEvent.PROGRESS,rss_load);
}

function rss_load(e:ProgressEvent):void
{
    //trace(e.bytesLoaded/(113*1024));
    l.setProgress(e.bytesLoaded,(113*1024));
}

function rss_loaded(e:Event):void
{
    removeChild(l);
    l = null;
    rss_xml = XML(e.target.data);
    rss_xml.ignoreWhiteSpace = true;
    var rss_raw:String = String(rss_xml);
    rss_raw = rss_raw.split(":encoded").join("");
    rss_raw = rss_raw.split("\n").join("");
    rss_raw = rss_raw.split("</h1><h2>").join("</h1><p/><h2>");
    rss_raw = rss_raw.split("</h2><h3>").join("</h2><p/><h3>");
    rss_raw = rss_raw.split("</h3><h4>").join("</h3><p/><h4>");
    rss_raw = rss_raw.split("</h4><h5>").join("</h4><p/><h5>");
    rss_raw = rss_raw.split("<strong>").join("<b>");
    rss_raw = rss_raw.split("</strong>").join("</b>");
    rss_raw = rss_raw.split("<em>").join("<i>");
    rss_raw = rss_raw.split("</em>").join("</i>");
    rss_xml = XML(rss_raw);
    test_txt.styleSheet = sulsc_style;
    test_txt;
    test_txt.htmlText = rss_xml.channel.item.(guid == "http://news.sulsc.org/?page_id=656").content;
    addChild(test_txt);
}

Вот XML, который он читает:

<h1>Heading 1</h1><p/><h2>Heading 2</h2><p/><h3>Heading 3</h3><p/><h4>Heading 4</h4><p><a title="SULSC" href="http://www.sulsc.org">Isolated link.</a></p><p>Paragraph. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nibh risus, elementum in tempor non, <a title="SULSC" href="http://www.sulsc.org">normal link</a>. Donec consequat arcu in nulla rhoncus aliquam. Fusce eu leo nunc, eget tempus risus. Aliquam imperdiet, sem non euismod blandit, nisi sapien pharetra leo, ac facilisis velit purus nec <i><b>bold italic</b></i>. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales vulputate interdum. <del>Strikethrough</del> congue, purus ut rhoncus porttitor, erat velit iaculis libero, nec commodo leo dui eget ante. Vivamus volutpat sollicitudin vulputate.</p><blockquote><p>Block quote. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nibh risus, elementum in tempor non, malesuada ac nisl. Donec consequat arcu in nulla rhoncus aliquam. Fusce eu leo nunc, eget tempus risus. Aliquam imperdiet, sem non euismod blandit, nisi sapien pharetra leo, ac facilisis velit purus nec tellus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales vulputate interdum. Vestibulum congue, purus ut rhoncus porttitor, erat velit iaculis libero, nec commodo leo dui eget ante. Vivamus volutpat sollicitudin vulputate.</p></blockquote><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nibh risus, elementum in tempor non, malesuada ac nisl. Donec consequat arcu in nulla rhoncus aliquam. Fusce eu leo nunc, eget tempus risus. <i>Italic</i> imperdiet, sem non euismod blandit, nisi sapien pharetra leo, ac facilisis velit purus nec tellus. <b>BOLD</b> aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. <a href="http://sulsc.org">Link</a> sodales vulputate interdum. Vestibulum congue, <a href="http://sulsc.org"><b><i>BOLD ITALIC LINK</i></b></a> ut rhoncus porttitor, erat velit iaculis libero, nec commodo leo dui eget ante. Vivamus volutpat sollicitudin vulputate.</p><ol><li>Numbered list</li><li>Number two</li><li>Number three</li></ol>

И вот CSS, который применяется:

/*
leading is line height
*/
p, ol, ul, li, body {
    font-family: Fontin Sans Rg;
    font-size: 12pt;
    color: #666666;
    text-align: justify;
}
h1 {
    font-family: Nilland;
    font-size: 30pt;
    text-align:left;
    color: #999999;
}
h2 {
    font-family: Nilland;
    font-size: 20pt;
    color: #ff9900;
    margin-left:25px;
    letter-spacing: 1px;
}
h3 {
    font-family: GeosansLight;
    font-size: 16pt;
    text-align:left;
    color: #999999;
    margin-left:50px;
    letter-spacing: 1px;
}
h4, h5, h6 {
    font-family: GeosansLight;
    font-size: 14pt;
    text-align:left;
    color: #999999;
    margin-left:75px;
    letter-spacing: 1px;
}
ol, ul, li {
    margin-left: 50px;
}
b-quote,blockquote {
    font-family: Fontin Sans Rg;
    font-style:italic;
    color:#999999;
    margin-left: 100px;
    margin-right: 100px;
}
a, {
    text-decoration: underline;
    color: #666666;
}
a:hover {
    color: #FF9900;
    text-decoration: underline;
}

В сочетании они производят это:

Если у вас есть идея, что я делаю не так, пожалуйста, дайте мне знать, но я новичок в этом вопросе, поэтому я буду признателен за условия непрофессионала (:

3 ответа

Решение

Использование ссылки: в CSS устанавливает стиль ссылки во flash.

Вставка тега абзаца с определенным стилем (который не имеет высоты строки) эффективно устраняет проблему с заголовками.

Не понял жирный и курсив, но это не главное беспокойство. Если кто-нибудь, дайте мне знать!

Вот текущий рабочий код для тех, кто заинтересован:

import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.text.TextField;
import flash.events.ProgressEvent;
import fl.text.TLFTextField;

var fonts:Array = Font.enumerateFonts();
for each (var font:Font in fonts)
{
    trace( font.fontName+":"+font.fontType );
}

var rss_xml:XML = new XML();
var test_txt:TLFTextField = new TLFTextField  ;
with (test_txt)
{
    antiAliasType = AntiAliasType.ADVANCED;
    width = 940;
    height = 600;
    x = 0;
    y = 0;
    autoSize = TextFieldAutoSize.LEFT;
    wordWrap = true;
    embedFonts = true;
}
var sulsc_style:StyleSheet = new StyleSheet();
var css_loader:URLLoader = new URLLoader();

css_loader.load(new URLRequest("sulsc_style.css"));
css_loader.addEventListener(Event.COMPLETE, onCSSComplete);
function onCSSComplete(e:Event):void
{
    sulsc_style.parseCSS(e.target.data);
    rss_xml.ignoreWhitespace = false;
    var rss_loader:URLLoader = new URLLoader(new URLRequest("http://news.sulsc.org/feed"));
    rss_loader.addEventListener(Event.COMPLETE,rss_loaded);
    l.mode = "manual";
    rss_loader.addEventListener(ProgressEvent.PROGRESS,rss_load);
}

function rss_load(e:ProgressEvent):void
{
    //trace(e.bytesLoaded/(113*1024));
    l.setProgress(e.bytesLoaded,(113*1024));
}

function rss_loaded(e:Event):void
{
    removeChild(l);
    l = null;
    rss_xml = XML(e.target.data);
    rss_xml.ignoreWhiteSpace = true;
    var rss_raw:String = String(rss_xml);
    rss_raw = rss_raw.split(":encoded").join("");
    rss_raw = rss_raw.split("\n").join("");
    rss_raw = rss_raw.split('<p style="text-align: right;">').join('<p class="right">');
    rss_raw = rss_raw.split('<p style="text-align: center;">').join('<p class="centre">');
    rss_raw = rss_raw.split('<p style="text-align: left;">').join('<p class="left">');
    rss_raw = rss_raw.split('<p style="text-align: justify;">').join('<p class="just">');
    var heading_replace:RegExp = new RegExp("(</h[0-9]>)(<h[0-9]>)","g9");
    var underline_replace:RegExp = new RegExp('<span style="text-decoration: underline;">(.*?)</span>',"gi");
    var bold_replace:RegExp = new RegExp('<strong>(.*?)</strong>',"gi");
    var italic_replace:RegExp = new RegExp('<em>(.*?)</em>',"gi");
    rss_raw = rss_raw.replace(heading_replace,'$1<p class="space"></p>$2');
    rss_raw = rss_raw.replace(underline_replace,'<u>$1</u>');
    rss_raw = rss_raw.replace(bold_replace,'<b>$1</b>');
    rss_raw = rss_raw.replace(italic_replace,'<i>$1</i>');
    rss_xml = XML(rss_raw);
    test_txt.styleSheet = sulsc_style;
    test_txt.htmlText = rss_xml.channel.item.(guid == "http://news.sulsc.org/?page_id=400").content;
    addChild(test_txt);
}

и CSS:

/*
flash doesn't support:
-bold and italic
-strikethrough
*/
p, ol, ul, li, body {
    font-family: Fontin Sans Rg;
    font-size: 12pt;
    color: #666666;
    text-align: justify;
    padding-bottom: 12px;
    padding-top: 6px;
}
h1 {
    font-family: Nilland;
    font-size: 30pt;
    text-align:left;
    color: #999999;
}
h2 {
    font-family: Nilland;
    font-size: 20pt;
    color: #ff9900;
    margin-left:25px;
    letter-spacing: 1px;
}
h3 {
    font-family: GeosansLight;
    font-size: 16pt;
    text-align:left;
    color: #999999;
    margin-left:50px;
    letter-spacing: 1px;
}
h4, h5, h6 {
    font-family: GeosansLight;
    font-size: 14pt;
    text-align:left;
    color: #999999;
    margin-left:75px;
    letter-spacing: 1px;
}
ol, ul, li {
    margin-left: 50px;
    line-height:5px
}
b-quote,blockquote {
    font-family: Fontin Sans Rg;
    font-style:italic;
    color:#999999;
    margin-left: 100px;
    margin-right: 100px;
    padding-bottom: 12px;
}
a:link {
    text-decoration: underline;
    color: #666666;
}
a:hover {
    color: #FF9900;
    text-decoration: underline;
}
/* DO NOT DELETE THESE */
.space { 
    line-height:1px;
    padding-bottom: 0px;
    padding-top:0px;
}
.right {
    text-align:right;
}
.centre {
    text-align:center;
}
.left {
    text-align:left;
}
.just {
    text-align:justify;
}

Что делает:

За работой

Спасибо за вашу помощь!

Как вы сказали, у Flash есть свои проблемы с StyleSheets. Может быть, вы должны попробовать установить стиль прямо в as3! Всегда работал для меня!

var style:StyleSheet = new StyleSheet();

var hover:Object = new Object();
hover.color = "#FF9900";

var link:Object = new Object();
link.fontWeight = "bold";
link.textDecoration= "underline";
link.color = "#00FF00"; //green

style.setStyle("a:link", link);
style.setStyle("a:hover", hover);

html_txt.styleSheet = style;

Это проблема со связью! Для других я должен был бы проверить это сам, я обновлю ответ, когда я делаю! Но вы можете попробовать установить все атрибуты стиля в as3.

По вопросу, выделенному жирным шрифтом / курсивом, мы обнаружили, что для их обработки нам необходимо иметь совершенно отдельные шрифты / классы. Поэтому вам нужно будет экспортировать каждый из шрифтов обычного курсива и полужирного стиля, а затем обернуть соответствующие разделы в теги шрифта. Мы используем и для поиска / замены добавляем parentClassName_italic к тегу шрифта, а затем указываем на экспортированный шрифт в CSS. Настоящая лаваш, но вот, пожалуйста.

Другие вопросы по тегам