Avatar billede soreno Praktikant
28. marts 2003 - 09:39 Der er 7 kommentarer og
2 løsninger

Fjern tags / konverter tags

Hvordan kan man konvertere disse tags på nemmeste måde ?

<font color="#a020f0"> skal blive til <span class="foo">
<font color="#2e8b57"> skal blive til <span class="bar">
</font> skal blive til </span>

Samt <b> og </b> skal fjernes helt.

Eksempel:
<pre>
<font color="#a020f0">#include </font><font color="#ff00ff">&lt;windows.h&gt;</font>

<font color="#2e8b57"><b>int</b></font> main(<font color="#2e8b57"><b>int</b></font> argc, <font color="#2e8b57"><b>char</b></font> **argv)
{
    <font color="#0000ff">//test af comment</font>
    MessageBox(<font color="#ff00ff">NULL</font>, <font color="#ff00ff">&quot;test&quot;</font>, <font color="#ff00ff">&quot;test&quot;</font>, MB_OK);
    <font color="#804040"><b>return</b></font> <font color="#ff00ff">0</font>;
}
</pre>

Et stykke eksempelkode ville være godt - men hints til hvilke klasser der kan bruges er også ok.
Avatar billede arne_v Ekspert
28. marts 2003 - 09:45 #1
Umiddelbart ligner dit HTML valid XML.

Så en SAX parser burde kunne lave konverteringen.
Avatar billede arne_v Ekspert
28. marts 2003 - 09:45 #2
Skal jeg prøve at lave et lille eksempel ?
Avatar billede arne_v Ekspert
28. marts 2003 - 09:48 #3
Alternativt kan du selvfølgelig også bare loope gennem teksten
og finde taggene.

Hvis du kun skal lave den ene ændring så var det måske alligevel
nemmest.
Avatar billede disky Nybegynder
28. marts 2003 - 09:48 #4
Lav search and replace på det, ingen grund til at rode med XML parsere osv. for dette.
Avatar billede soreno Praktikant
28. marts 2003 - 09:49 #5
Ja, koden vil være well-formed xml.
Jeg vil da gerne se et sax eksempel :-)
Avatar billede arne_v Ekspert
28. marts 2003 - 10:01 #6
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class HtmlC {
    public static void main(String[] args) {
        try {
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            xr.setContentHandler(new MySaxParser());
            xr.parse("C:\\c.xml");
        } catch (FactoryConfigurationError e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class MySaxParser extends DefaultHandler {
    public MySaxParser() {
    }
    public void characters(char buf[], int offset, int len)
        throws SAXException {
        System.out.print(new String(buf, offset, len));
        return;
    }
    public void startElement(
        String namespaceURI,
        String localName,
        String rawName,
        Attributes atts)
        throws SAXException {
        if (rawName.equals("font")) {
            System.out.print("<span class=\"?\">");
        } else if (rawName.equals("b")) {
            // nothing
        } else {
            System.out.print("<" + rawName);
            for(int i = 0; i < atts.getLength(); i++) {
                System.out.print(" " + atts.getLocalName(i) + "=\""+ atts.getValue(i) + "\"");
            }
            System.out.print(">");
        }
        return;
    }
    public void endElement(
        String namespaceURI,
        String localName,
        String rawName)
        throws SAXException {
        if (rawName.equals("font")) {
            System.out.print("</span>");
        } else if (rawName.equals("b")) {
            // nothing
        } else {
            System.out.print("</" + rawName + ">");
        }
        return;
    }
}

giver følgende output:

<pre>
<span class="?">#include </span><span class="?"><windows.h></span>

<span class="?">int</span> main(<span class="?">int</span> argc, <span class="?">char</span> **argv)
{
    <span class="?">//test af comment</span>
    MessageBox(<span class="?">NULL</span>, <span class="?">"test"</span>, <span class="?">"test"</span>, MB_OK);
    <span class="?">return</span> <span class="?">0</span>;
}
</pre>

og det begynder vel at ligne lidt.

Jeg har ikke helt gennesmuet hvordan værdien af class attribut skal findes.
Avatar billede soreno Praktikant
28. marts 2003 - 10:44 #7
color="#a020f0" = class="syntaxInclude"
color="#ff00ff" = class="syntaxValue"
color="#2e8b57" = class="syntaxDatatype"
color="#0000ff" = class="syntaxComment"
color="#804040" = class="syntaxReservedWord"
Avatar billede soreno Praktikant
28. marts 2003 - 10:57 #8
Og så sætter man bare checks ind her:
      if(rawName.equals("font"))
        {
            if(atts.getValue("color").equals("#a020f0"))
            {
                System.out.print("<span class=\"syntaxInclude\">");
            }
            System.out.print("<span class=\"?\">");
        }

?
Avatar billede arne_v Ekspert
28. marts 2003 - 10:58 #9
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class HtmlC {
    public static void main(String[] args) {
        try {
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            xr.setContentHandler(new MySaxParser());
            xr.parse("C:\\c.xml");
        } catch (FactoryConfigurationError e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class MySaxParser extends DefaultHandler {
    public MySaxParser() {
    }
    public void characters(char buf[], int offset, int len)
        throws SAXException {
        System.out.print(new String(buf, offset, len));
        return;
    }
    public void startElement(
        String namespaceURI,
        String localName,
        String rawName,
        Attributes atts)
        throws SAXException {
        if (rawName.equals("font")) {
            System.out.print("<span class=\"" + colorToClass(atts.getValue("color")) + "\">");
        } else if (rawName.equals("b")) {
            // nothing
        } else {
            System.out.print("<" + rawName);
            for(int i = 0; i < atts.getLength(); i++) {
                System.out.print(" " + atts.getLocalName(i) + "=\""+ atts.getValue(i) + "\"");
            }
            System.out.print(">");
        }
        return;
    }
    public void endElement(
        String namespaceURI,
        String localName,
        String rawName)
        throws SAXException {
        if (rawName.equals("font")) {
            System.out.print("</span>");
        } else if (rawName.equals("b")) {
            // nothing
        } else {
            System.out.print("</" + rawName + ">");
        }
        return;
    }
    private static String colorToClass(String color) {
        if(color.equals("#a020f0")) return "syntaxInclude";
        if(color.equals("#ff00ff")) return "syntaxValue";
        if(color.equals("#2e8b57")) return "syntaxDatatype";
        if(color.equals("#0000ff")) return "syntaxComment";
        if(color.equals("#804040")) return "syntaxReservedWord";
        return "?";
    }
}

giver:

<pre>
<span class="syntaxInclude">#include </span><span class="syntaxValue"><windows.h></span>

<span class="syntaxDatatype">int</span> main(<span class="syntaxDatatype">int</span> argc, <span class="syntaxDatatype">char</span> **argv)
{
    <span class="syntaxComment">//test af comment</span>
    MessageBox(<span class="syntaxValue">NULL</span>, <span class="syntaxValue">"test"</span>, <span class="syntaxValue">"test"</span>, MB_OK);
    <span class="syntaxReservedWord">return</span> <span class="syntaxValue">0</span>;
}
</pre>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester