Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > HTML парсер. нестандартные действия тегов


Автор: Predatorro 25.5.2012, 21:29
Задача состоит в том, чтобы при парсинге 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 или что-то другое? Как сделать тень и подчёркивание? Задание нужно реализовать в кратчайшие сроки. Помогите.

Автор: ReFLeXive 27.5.2012, 08:07
Гугл говорит, что JEditorPane не полностью поддерживает спецификацию CSS, поэтому, скорей всего, у вас и не кажет ничего. попробуйте в ваших стилях сделать что-нибудь очень простое (цвет поменять, шрифт, размер и т.д.). Так вы удостоверитесь, работает ли у вас CSS.
Посмотрите еще вот это: http://docs.oracle.com/javase/6/docs/api/javax/swing/text/html/StyleSheet.html

Автор: Predatorro 27.5.2012, 12:57
Код

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. Но я пока не совсем точно представляю как это работает. Если кто-то подобное делал опишите процесс. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)