Syntax-Highlighting abspeichern

Blackhole16

Bekanntes Mitglied
Guten Tag community,

Es geht wieder um meinen Texteditor den ich schreibe (was für ein Wunder :p). Aber diesmal um das Abspeichern.

Ich habe verschiedene Varianten, wie ich den Text formatiere: Schriftart, Schriftgröße, Schriftfarbe, Schrifthintergrundfarbe, Italic, Bold, Underlined und alles gemixt. All dies mache ich mit SimpleAttributeSet und StyleConstants.
Nun zu meinem eigentlichen Problem, dem Abspeichern. Ich habe überlegt, dass ich es so in der Art mache, beispielsweise erstmal nur an der Schriftart:
Ich dachte, dass es so in der Art [c]SchritfArt#ZeichnnummerAnfang:Zeichennummerende|nochmalAnfang:nochmalEnde|oderEinfachNurEiner|...[/c] Ich habe eine Funktion dafür geschrieben, di soweit auch super läuft, nur ist die 1. ziemlich lang und 2. eben bisher nur für die FontFamily.
Hier jetzt mein Code dazu:

Java:
	public String getFormatting() {
		String formatting = "";
		String textGet, value;
		ArrayList fontFamily = new ArrayList();
		ArrayList italic = new ArrayList();
		ArrayList bold = new ArrayList();
		ArrayList underline = new ArrayList();
		ArrayList fontSize = new ArrayList();
		ArrayList fgColor = new ArrayList();
		ArrayList bgColor = new ArrayList();
		
		int location = getCaretPosition();
		for (int i = 0; i < getText().length(); i++) {
			setCaretPosition(i);
			AttributeSet sas = getCharacterAttributes();
			textGet = StyleConstants.getFontFamily(sas) + "#";
		  	if (!fontFamily.contains(textGet)) {
		  		fontFamily.add(textGet);
		  		fontFamily.add(getCaretPosition() + "");
		  	} else {
		  		value = fontFamily.get(fontFamily.indexOf(textGet)+1) + "";
		  		int numberBefore = -1;
		  		try {
		  			int j = 1;
		  			while (true) {
		  				if (numberBefore == -1) {
		  					numberBefore = Integer.parseInt(value.charAt(value.length() - j) + "");
		  				} else {
		  					numberBefore = Integer.parseInt(value.charAt(value.length() - j) + "" + numberBefore);
		  				}
		  				j++;
		  			}
		  		} catch (Exception e) {}
		  		
		  		int numberBeforeLength = 1;
		  		
		  		if (numberBefore >= 10)
		  			numberBeforeLength = 2;
		  		else if (numberBefore >= 100)
		  			numberBeforeLength = 3;
		  		else if (numberBefore >= 1000)
		  			numberBeforeLength = 4;
		  		else if (numberBefore >= 10000)
		  			numberBeforeLength = 3; 
		  		
		  		if (numberBefore == i-1) {
		  			try {
			  			if (value.charAt(value.length() - (numberBeforeLength + 1)) == ':') {
			  				value = value.substring(0, value.length() - numberBeforeLength) + i;
			  			} else {
			  				value = value + ":" + i;
			  			}
		  			} catch (IndexOutOfBoundsException e) {
		  				value = value + ":" + i;
		  			}
		  		} else {
		  			value += "|" + i;
		  		}
		  		fontFamily.set(fontFamily.indexOf(textGet)+1, value);
		  	}
		}
		for (int i = 0; i < fontFamily.size(); i++) {
			formatting += fontFamily.get(i);
			if (i%2 == 1) {
				formatting += ";";
			}
		}
		setCaretPosition(location);
		return formatting;
	}

Ich weiß, es ist nicht sehr elegant. War auch ersteinmal nur so eine Idee
Ist mein Code soweit in Ordnung? Kann man das auch noch besser machen?
Wie kann ich, wenn ich es jetzt auch für die 6 weiteren Formatierungen mache, Codevervielfachung vermeiden? Ich würde das nämlich ganz elegant 6X copy-and-pasten :p

Sagt auch einfach mal so eure Meinung dazu oder wie es anders machen könnte.

mfg
BH16
 

timbeau

Gesperrter Benutzer
Ich weiß nicht, ob es nicht sinnvoller ist eine XML-Datei zu erstellen. Hast du dann einen Text wie:
"Ich mag Spaghetti, mit Soße"

Wir das zu sowas wie:

[XML]<txt>
<sub>
<style>
<style-bold>false</style-bold>
<style-italic>false</style-italic>
...
<text>Ich mag</text>
</sub>
<sub>
<style>
<style-bold>false</style-bold>
<style-italic>true</style-italic>
...
<text>Spaghetti</text>
</sub>
</txt>[/XML]
 

Final_Striker

Top Contributor
Kann man das auch noch besser machen?

Java:
      } catch (Exception e) {}
So etwas vermeiden.

Java:
   } catch (IndexOutOfBoundsException e) {
Macht man in der Regel nicht, da es sich hier um einen Fehler im Code handelt, welcher verhindert werden kann.


Ansonsten würde ich das eher als XML abspeichern als als Text.
 
Zuletzt bearbeitet:

HoaX

Top Contributor
Es es sich wirklich um eine Sytax handelt, welche du da farblich verschönerst, dann brauchst du das nicht abzuspeichern. Denn wenn du eine korrekte Sprachdefinition hast, dann kannst du das ganze beim Laden ja wiederherstellen.
 

irgendjemand

Top Contributor
würde hier auch das bereits gesagte eigentlich nur wiederholen

Java:
catch(Exception e) { }
davon abgesehen das man nicht dierekt Exception catchen sollte fehlt hier mindestens das Throwable.printStackTrace() ...
also gleich zwei fehler in einer zeile die gerade während der entwicklung zu stunden der fehlersuche führen können einfach nur weil man den fehler schluckt

Java:
catch(IndexOutOfBoundsException e)
ist eine RuntimeException ... und die sollte man eigentlich auch nicht fangen da das auftreten ein zeichen dafür ist das der programmierer irgendwas falsch gemacht hat ...

als beispiel vllt mit der beliebten NPE

anstatt
Java:
try
{
//...
} catch(NullPointerException npe)
zu schreiben sollte man lieber
Java:
if(resource==null)
verwenden ...


ansonsten wie ich es auch bereits in der PN erwähnte : es kommt drauf an WAS für "formatierungen" du speichern willst
wenn es syntaxhighlightning sein soll würde ich das definitiv NICHT mit speichern sondern beim laden jedes mal neu drüber legen ...
klingt jetzt erstmal nach etwas mehr arbeit und weniger performance ... ist aber deutlich besser da du dann 1) das source-file immer noch normal verwenden kannst und 2) bei änderungen nur "live" die anzeige ändern musst ... und nicht das gesamte file ...
wenn es sowas wie "RTF" sein soll ... dann muss natürlich die formatierung mitgespeichert werden ... ist ja der sinn solcher formate ...
 

AquaBall

Top Contributor
Übrigens ganz ein anderes Thema: Du hast vermutlichen einen Fehler in:
Java:
   int numberBeforeLength = 1;
   if (numberBefore >= 10)
      numberBeforeLength = 2;
   else if (numberBefore >= 100)
      numberBeforeLength = 3;
   else if (numberBefore >= 1000)
      numberBeforeLength = 4;
   else if (numberBefore >= 10000)
      numberBeforeLength = 3;
Letzte Zeile sollte wahrscheinlich:
Code:
numberBeforeLength = [SIZE="5"][SIZE="3"][U]5[/U][/SIZE][/SIZE];
heißen.

Außerdem könntest du für die ganze Litanei schreiben:
Java:
numberBeforeLength =(int)Math.Log10(numberBefore );
 

Blackhole16

Bekanntes Mitglied
Ich weiß nicht, ob es nicht sinnvoller ist eine XML-Datei zu erstellen. Hast du dann einen Text wie:
"Ich mag Spaghetti, mit Soße"

Wir das zu sowas wie:

Das mit dem XML ist eine gute idee, dazu werde ich mal was durchlesen. Mal sehen, wie das meine Probleme löst. *OMG NOCH EINE PRACHE ANSCHAUEN-.-* ;)

So etwas vermeiden.
bei mir ist es 1. die IndexOutOfBoundsException UND die NumberFormatException. Da beide bei mir gewollt passieren, dachte ich, wäre es praktischer einfach die Oberklasse exception abzufangen, um den code kürzer zu halten ;)


Es es sich wirklich um eine Sytax handelt, welche du da farblich verschönerst, dann brauchst du das nicht abzuspeichern. Denn wenn du eine korrekte Sprachdefinition hast, dann kannst du das ganze beim Laden ja wiederherstellen.

AUUUUUUUUUUUU BITTER!!!!! Sry, Wordbedeutung falsch angewendet :oops:
Ich meine so etwas in der Art wie in Word.

Sonst hast du natürlich vollkommen recht....

würde hier auch das bereits gesagte eigentlich nur wiederholen

ansonsten wie ich es auch bereits in der PN erwähnte : es kommt drauf an WAS für "formatierungen" du speichern willst
wenn es syntaxhighlightning sein soll würde ich das definitiv NICHT mit speichern sondern beim laden jedes mal neu drüber legen ...
siehe oben, *PEINLICH* :eek:
wenn es sowas wie "RTF" sein soll ... dann muss natürlich die formatierung mitgespeichert werden ... ist ja der sinn solcher formate ...
Ja so möchte ich das machen. Aber wie im 1. post: ist mein weg so in ordnung? ich meine, er funzt zwar, aber besonders an dich gerichtet: Wie kann ich diesen code so umschreiben, dass ich es auch mit den anderen 6 ohne codedublizierung (was du ja immer ankreidest :) ) geht.

Übrigens ganz ein anderes Thema: Du hast vermutlichen einen Fehler in:
Letzte Zeile sollte wahrscheinlich:
Code:
numberBeforeLength = [SIZE="5"][SIZE="3"][U]5[/U][/SIZE][/SIZE];
heißen.

Ja, sieht so aus :oops: Copy-and-Paste und dann nur teilweise geändert, ein Fehler, an dem ich wieder EWIG gesucht hätte :D thx

Außerdem könntest du für die ganze Litanei schreiben:
[c]numberBeforeLength =(int)Math.Log10(numberBefore );
[/c]
ja, ok, mir war klar, dass es da einen eleganteren weg gibt, aber er fiel mir gerade nicht ein. Werde ich ntürlich so ändern :)

Danke schonmal bisher für eure Antworten, und sry, dass ich das falsch benutzt habe. Hier also nochmal:

Es handelt sich um so eine Veränderung wie in Word :)

mfg
BH16
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Tommy135 Syntax Highlighting Allgemeine Java-Themen 3
P JTextPane mit Java (eclipse) Syntax Highlighting Allgemeine Java-Themen 4
padde479 jEdit Syntax Highlighting Allgemeine Java-Themen 3
Elyt Compiler-Fehler Datei kann nicht erstellt werden. Die Syntax für den Dateinamen etc. ist falsch. Allgemeine Java-Themen 2
W JavaCC to create my only syntax Allgemeine Java-Themen 5
B Syntax-Erkennungs Problem Allgemeine Java-Themen 2
H Syntax ProcessBuilder Allgemeine Java-Themen 7
T Parseerror bei richtiger Syntax Allgemeine Java-Themen 5
M Syntax Highlighter für MS Word? Allgemeine Java-Themen 2
H Pattern.compile Syntax Allgemeine Java-Themen 15
S Mail Adressen Syntax prüfen Allgemeine Java-Themen 22
C Syntax printf Allgemeine Java-Themen 5
S Eine Collection von Objekten mit LDAP Syntax filtern Allgemeine Java-Themen 5
D Kompakte Syntax für Funktionen Allgemeine Java-Themen 7
G Syntax für den Dateinamen Allgemeine Java-Themen 1
R Syntax Error, der keiner sein sollte Allgemeine Java-Themen 12
G Java Syntax Allgemeine Java-Themen 7
T Syntax Error Allgemeine Java-Themen 9
F Plugin damit M$ Word Java syntax versteht? Allgemeine Java-Themen 12
D Die <> Syntax Allgemeine Java-Themen 8
W Syntax - Frage Allgemeine Java-Themen 6
G Syntax-Fehler beim aufrufen von generischen Klassenmethoden Allgemeine Java-Themen 4
V syntax problem Allgemeine Java-Themen 6
S Syntax Error, insert "AssignmentOperator Expression&amp Allgemeine Java-Themen 3
F log4j XML-Syntax Allgemeine Java-Themen 4
B Syntax error on token ,VariableDeclaratorId expected after. Allgemeine Java-Themen 3
G Syntax Übersicht Suche Allgemeine Java-Themen 7
A gültige syntax einer ip-adresse? Allgemeine Java-Themen 2
S java syntax zusammenfassung Allgemeine Java-Themen 1
S Highlighting der gerade ausgeführten Codezeilen Allgemeine Java-Themen 10
T Keyword Highlighting in HTML Allgemeine Java-Themen 5
F Arraylist vollständig abspeichern und laden Allgemeine Java-Themen 1
G Excel File öffnen, in Zelle schreiben, abspeichern Allgemeine Java-Themen 6
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
J Input/Output Word Datei einlesen, verarbeiten und abspeichern Allgemeine Java-Themen 3
F String in OpenOffice Ods datei abspeichern? Allgemeine Java-Themen 8
L Daten ohne Datenbank richtig abspeichern Allgemeine Java-Themen 5
D Variablen java.io.File zum vergleichen abspeichern Allgemeine Java-Themen 1
G Baumstruktur abspeichern Allgemeine Java-Themen 9
A Java - Beim Abspeichern Redundanzen vermeiden! Allgemeine Java-Themen 6
E Bild abspeichern Allgemeine Java-Themen 5
B Input/Output Inventar/Ausrüstung abspeichern (in DB?) Allgemeine Java-Themen 2
R ArrayList byte[] abspeichern Allgemeine Java-Themen 4
I Abspeichern einer txt-Datei Allgemeine Java-Themen 7
L Abspeichern von OutputStream Allgemeine Java-Themen 6
W sql Query abspeichern selber variabele hilfe...? Allgemeine Java-Themen 16
X Anwendungsdaten abspeichern ? Allgemeine Java-Themen 12
T abspeichern und laden von objekten in JFrame Allgemeine Java-Themen 2
simcen X509Certificate abspeichern Allgemeine Java-Themen 2
R PDF einlesen und als Bild abspeichern Allgemeine Java-Themen 8
D readChar; wort abspeichern :( Allgemeine Java-Themen 5
L Wie kann ich eine HashMap abspeichern? Allgemeine Java-Themen 3
M Sound in datei abspeichern Allgemeine Java-Themen 3
N Graphics2D als Bild abspeichern Allgemeine Java-Themen 6
V Wie kann ich ein Bild in einem Zip Archiv abspeichern? Allgemeine Java-Themen 3
J Viel Text mit " im Quellcode abspeichern Allgemeine Java-Themen 7
S Projekt als Jar abspeichern! wie? Allgemeine Java-Themen 6
J Verzeichnis aus meinem JAR auslesen und abspeichern. Allgemeine Java-Themen 2
R Datei einlesen, Strings hinzufügen, abspeichern Allgemeine Java-Themen 4
S Text in eine txt-Datei schreiben und abspeichern! Allgemeine Java-Themen 8
N Graphik abspeichern Allgemeine Java-Themen 4
F Image als GIF oder JPEG abspeichern Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben