Portal > Foren > Java > Allgemeine Java-Programmierung > Zeilenumbrüche von Code aus Textdatei erkennen
Antwort
 
Themen-Optionen
Alt 25.10.2005, 21:02 Nach oben    #1
pir187
Gast
 
Beiträge: n/a
Standard Zeilenumbrüche von Code aus Textdatei erkennen

Hallo Forum,

ich sitze hier schon den ganzen Tag an einem Projekt, das nicht ganz unwichtig für meinen Studienabschluß ist.

Ich möchte eine Komponente schreiben, die einen vorgegebenen Text anhand von Signalwörtern in verschiedenen Farben highlighten kann. Das klappt schon prima, wenn der Text komplett in einer Zeile steht bzw. ich manuell '\n' in den Text einfüge. Dann klappt die "Worterkennung" und das Wort wird, wenn es im entsprechenden Vector steht, richtig formatiert.

Zur Erklärung:

die Klasse "HighlightedDocument", die das formatierbare Dokument darstellen soll, ist von DefaultStyledDocument abgeleitet. Diese Klasse beinhaltet eine Hashtable. Darin werden Vektoren gespeichert, deren Inhalte alle in derselben Art und Weise formatiert werden sollen. Die Vektoren werden in meinem Fall in der Klasse initialisiert, die eine Instanz von HighlightedDocument enthält. (Dies wird später noch anders geregelt, zum Entwickeln der Funktionalität jedoch reicht das so aus.)

Bsp.:
Code:
Vector red=new Vector();
red.add("Das");

Vector bold=new Vector();
bold.add("Testtext");
Die Klasse "HighlightedDocument" besitzt eine Methode, die den übergebenen Vektor in die Hashtable "categories" einfügt.

Außerdem ist die Methode
Code:
insertString(int offset, String text, AttributeSet a)
von DefaultStyledDocument überschrieben worden.
In ihr passiert folgendes:



  • super.insertString(...) wird gerufen -> neuer Text wird in Dokumentenmodell eingefügt.
  • Position des aktuellen Wortes ("formatStart") = 0
  • Text wird Zeichen für Zeichen ("z") geprüft: z ist Buchstabe, dann Index erhöhen; z ist Leerzeichen/Tabulator, dann Wort aus Dokument entfernen, von "formatStart" an mit Länge (index-formatStart) mit Werten aus Hashtable/Vektor vergleichen, wenn gefunden, entsprechende Formatierung anwenden und wieder in Dokument einfügen, Index erhöhen, formatStart=index; z ist Spezialzeichen (';', '{', '}' u.s.w.), dann voriges Wort formatieren, Spezialzeichen formatieren, Index erhöhen.
Mein Problem ist nun folgendes:
wenn ich in einen Testtext manuell ein '\n' einfüge, wird der Zeilenumbruch richtig in der JTextPane, die die Instanz von HighlightedDocument enthält, dargestellt. Neue Zeilen werden entsprechend beachtet und umgebrochen.

Da das HighlightedDocument aber (oder vor allem) auch zur Anzeige längerer Quellcodes genutzt werden soll, will ich die Texte nicht manuell eingeben müssen, sondern per URL-Verbindung in das Dokument laden. Das klappt auch prima. Dabei werden jedoch die Zeilenumbrüche ignoriert, d.h., die Formatierung (Einzüge) werden ignoriert. Die farbliche Formatierung funktioniert weiter wie bisher.

Im Zuge des oben genannten Vorganges des Abarbeitens (siehe Aufzählung) des Dokumenteninhaltes will ich nun die Zeilenumbrüche erhalten. Die Quellcodedateien sind alle vorwiegend auf UNIX-Systemen gehalten, deshalb sollte LF (line feed) bzw. "\n" (Entsprechung lt. JAVA-API) doch der richtige Suchinhalt für das Pattern sein, oder?

Ich nutze Pattern-Matching, um die Erkennung der einzelnen Zeichen zu bewerkstelligen.

Meine Methode zum Erkennen eines Zeilenumbruchs sieht testweise so aus:
Code:
 public boolean isLineTerminator(int position)
	{
		String current;
		
		try
		{
			current=getText(position, 1);
			if (Pattern.matches("\n", current))
				return true;
			else
				return false;
		}
		catch (BadLocationException ble)
		{
			return false;
		}
	}
Wenn "true" zurück geliefert wird, also ein "\n" erkannt wurde, wird die Methode "replaceLineTerminator(int position)" für dieses eben erkannte Zeichen gerufen:

Code:
 	public void replaceLineTerminator(int position)
	{
		try
		{
			remove(position, 1);
			super.insertString(position, "<- separator ->", null);
		}
		catch (BadLocationException ble)
		{
			ble.printStackTrace();
		}
	}
Komischerweise funktioniert dies, wenn ich ein "\n" in einen kleinen Testtext (ein String-Objekt) einfüge. Dann wird anstelle des "\n" ein "<- separator ->" ohne Umbruch geschrieben.
Lasse ich jedoch einen längeren JAVA-Quellcode untersuchen, der per URL-Verbindung geholt wurde, wird "<- separator ->" nicht eingefügt, alle Zeilenumbrüche werden ignoriert!

Die Quellcodedatei habe ich mit Notepad++ kontrolliert, ihre Umbrüche werden nachweislich durch "line feed" ("\n") dargestellt.






Wen jemand eine Idee hat, wieso Umbrüche in einem kurzen String erkannt und im Dokument korrekt dargestellt werden, aus einer Quellcodedatei kommend jedoch nicht beachtet werden, könnte er mir diese hier bitte einmal verraten.
Danke schon einmal im Voraus, ich bin für jede Hilfe dankbar.
MfG, pir187
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.10.2005, 21:30 Nach oben    #2
pir187
Gast
 
Beiträge: n/a
Standard Problem gelöst!!!

Vor lauter Verzeiflung habe ich gerade einen Test gemacht, um zu schauen, ob die Quelldatei überhaupt richtig übertragen wird.

Code:
try
{
	URL url = new URL("http", "localhost", 80, "/source.txt");
	InputStream in = url.openStream();
	BufferedReader read = new BufferedReader(new InputStreamReader(in));
	String line=null;
	StringBuffer buffer=new StringBuffer();
			
	while ((line=read.readLine()) != null)
	{
		buffer.append(line);
	}
	textToHighlight=buffer.toString();
	System.err.println(textToHighlight);
}
catch (FileNotFoundException fnfe)
{
	fnfe.printStackTrace();
}
catch (IOException ioe)
	{
		ioe.printStackTrace();
}
Das Ergebnis ist, daß der Text schon falsch im Programm ankommt. Es werden keine Zeilenumbrüche übertragen. Also funktioniert mein HighlightingDocument anscheinend richtig, denn die Daten sind ja falsch. Zeilenumbrüche, die nicht vorhanden sind, können auch nicht dargestellt werden. Ist klar.

UPDATE:

Ich habe den Fehler gefunden. Er lag in meiner Routine zum Speichern des gelesenen Streams:

Code:
...
while ((line=read.readLine()) != null)
{
	buffer.append(line);
}
...
habe ich in

Code:
while ((line=read.readLine()) != null)
{
	buffer.append(line);
	buffer.append("\n");
}
geändert. Nun klappt alles!
MfG, pir187 *dernunschlafengehenkann*
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[PHP] Gästebuch auf Textdatei basierend Jann Hendrik Tutorials 4 11.01.2006 07:50
Netbeans generierter Code bacarni Tools, Server, Betriebssysteme 2 15.09.2005 12:26
PHP Code wird nicht ausgeführt ! Dark Knight PHP-Programmierung 22 13.09.2005 14:12
Internet-Explorer aktualisiert Code nicht Gottzilla Desktop-Applikationen und Grafik 5 07.03.2005 17:28


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:39 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44