Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> HTML парсер. нестандартные действия тегов, стили не отображаются в JEditorPane 
:(
    Опции темы
Predatorro
Дата 25.5.2012, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 25.5.2012

Репутация: нет
Всего: нет



Задача состоит в том, чтобы при парсинге HTML-странички назначить новые действия тегам.
Тегу <b> -тень текста
Тегу <u> -волнистое подчёркивание
Я попробовал реализовать тень для текста при помощи разных стилей


<html>
<head> 
<title>EPTest file</title> 
<!-- 
<meta http-equiv="Content-type" 
content="text/html;charset=iso-8859-1" /> 
--> 
<style type="text/css"> 
body { 
text-align: center; 
border: 2px solid #ff0000; 
background-color: #ffddff;
box-shadow: 0 0 7px #666; 

h2 { 
color: blue; 
border-bottom: 1px solid #cc66ee;


b {
text-shadow:#00fefe 1px 1px 1px;

.h1 {
text-align: left;
font-size: 12px;
line-height: 36px;
font-family: Georgia, serif;
font-weight: bold;
position: relative;
color: #999;
}
.h1 span {
position: absolute;
top: -4px;
left: -3px;
padding-right: 3px;
color: #000;
}
img {
box-shadow: -18px 0 20px -20px #333, 18px 0 20px -20px #333;
</style> 
</head> 
</head> 
<body 
bgcolor="#fefefe" leftmargin="100" topmargin="100"
rightmargin="100" bottommargin="97" font-family="serif" font-size="20">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
<br />
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in 
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa 
qui officia deserunt mollit anim id est laborum.

<br /> <br />

<p align="#ff0000">
In 
<b>
Mathematics</b>
<p class="h1">TEXT and SHADOW. Пример текста с тенью.
<span>TEXT and SHADOW. Пример текста с тенью.</span></p> 
Hello 
<img src="image.jpg" width="100" height="100" /></body>
</html>

Но такие стили JEditorPane не отображает. В браузере этот текст отображается замечательно. Это проблема поддержки css или что-то другое? Как сделать тень и подчёркивание? Задание нужно реализовать в кратчайшие сроки. Помогите.
PM MAIL   Вверх
ReFLeXive
Дата 27.5.2012, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 30.3.2009
Где: г. Уфа

Репутация: нет
Всего: 1



Гугл говорит, что JEditorPane не полностью поддерживает спецификацию CSS, поэтому, скорей всего, у вас и не кажет ничего. попробуйте в ваших стилях сделать что-нибудь очень простое (цвет поменять, шрифт, размер и т.д.). Так вы удостоверитесь, работает ли у вас CSS.
Посмотрите еще вот это: java StyleSheet
PM MAIL   Вверх
Predatorro
Дата 27.5.2012, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 25.5.2012

Репутация: нет
Всего: нет



Код

styleSheet.addRule("body {color:#FF00; font-family:times; margin: 4px; }");


такая конструкция работает, пробовал. А вот такая:

Код

styleSheet.addRule("b { style=\"text-shadow:#00FF00 1px 1px 1px\"}");


нет((
Сейчас придумал два выхода
1. В ParserCallback находить контент заключённый в определённый тег. Потом переведя весь текст в строку найти этот контент посредством indexOf, который вернет нам сдвиг(offset). Удалить контент из документа используя remove(). А затем вставить картинку с тенями сделанную на основании этого текста. Тут есть две загвоздки. Во-первых indexOf может вернуть индекс другого слова встретившегося в тексте но на самом деле не заключённого в теги.
Кроме того для корректного преобразования необходимо точно знать о размере, цвете,  типе текста. У меня всю эту инфу вытянуть не получается.

Вот код
Код

String word = "";
    String color = "";
    String bgColor = "";

    public void render() {


        HTMLEditorKit.ParserCallback callback =
                new HTMLEditorKit.ParserCallback() {
                    private String text;
                    private boolean f = false;

                    @Override
                    public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
                        if (HTML.Tag.B == t) {
                            f = true;
                            color = (String) a.getAttribute(HTML.Attribute.COLOR);
                        }
                        if (HTML.Tag.BODY == t) {
                            bgColor = a.getAttribute(HTML.Attribute.BGCOLOR).toString();
                        }
                    }

                    @Override
                    public void handleEndTag(HTML.Tag t, int pos) {
                        if (HTML.Tag.B == t) {
                            f = false;
                        }
                    }

                    public void handleText(char[] data, int pos) {
                        if (f == true) {
                            word = String.valueOf(data);
                            System.out.println("Position:" + pos + " Text:" + String.valueOf(data));
                        }
                    }
                };


        Reader reader = null;
        try {
            reader = new FileReader(ParserFrame.getPath());
            new ParserDelegator().parse(reader, callback, false);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


        try {
            Document d = sourcePane.getDocument();
            String content = d.getText(0, d.getLength()).toLowerCase();
            content = content.toLowerCase();
            String wordLow = word.toLowerCase();
            int offset = content.indexOf(wordLow);
            System.out.println(offset);
            sourcePane.getDocument().remove(offset, wordLow.length());
            sourcePane.getDocument().insertString(offset, "Yeah!!!", null);
        } catch (BadLocationException e) {
            e.printStackTrace();
        }

        imageFromText(word);

        BufferedImage bimage = new BufferedImage(pageWidth,
                pageHeight,
                BufferedImage.TYPE_INT_RGB);
        Graphics g = sourcePane.getGraphics();


        String subPath = parent.getPath().replaceAll("/+[^/]+html", "");
        File myPath = new File(subPath + "/render");
        myPath.mkdir();
        for (int i = 0; i < pages.size(); i++) {

            pages.get(i).paint(bimage.getGraphics());

            try {
                ImageIO.write(bimage, "PNG", new File(subPath + "/render/" + (i + 1) + ".png"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public BufferedImage imageFromText(String text) {
        int w = 90;
        int h = 20;
        Font font = new Font("Serif", Font.PLAIN, 20);
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();
        adjustGraphics(g);

        //start off all white:
        g.setPaint(Color.WHITE);
        g.fillRect(0, 0, w, h);

        //draw "shadow" text: to be blurred next
        TextLayout textLayout = new TextLayout(text, font, g.getFontRenderContext());
        g.setPaint(new Color(128, 128, 255));
        textLayout.draw(g, 15, 105);
        g.dispose();

        //blur the shadow: result is sorted in image2
        float ninth = 1.0f / 9.0f;
        float[] kernel = {ninth, ninth, ninth, ninth, ninth, ninth, ninth, ninth, ninth};
        ConvolveOp op = new ConvolveOp(new Kernel(3, 3, kernel), ConvolveOp.EDGE_NO_OP, null);
        BufferedImage image2 = op.filter(image, null);

        //write "original" text on top of shadow
        Graphics2D g2 = image2.createGraphics();
        adjustGraphics(g2);
        g2.setPaint(Color.RED);
        textLayout.draw(g2, 10, 100);

        try {
            ImageIO.write(image2, "PNG", new File("D:/Programming/Samsung/blur.png"));
        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        return image2;
    }

    private void adjustGraphics(Graphics2D g) {
        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
                RenderingHints.VALUE_FRACTIONALMETRICS_ON);
    }


Добавлено через 6 минут и 52 секунды
Второй способ - переопределять HTMLViewFactory и следующие за фабрикой классы: XXXView (InlineView, TableView...) -> возможно GlyphView. Но я пока не совсем точно представляю как это работает. Если кто-то подобное делал опишите процесс. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0865 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.