RText software | |
---|---|
Schermata di RText raffigurante il codice sorgente scritto in Java di una classe appartenente al progetto stesso. | |
Genere | Editor di testo |
Sviluppatore | Fifesoft, collaboratori su GitHub |
Ultima versione | 2.5.8 (13 settembre 2015 | )
Sistema operativo | Microsoft Windows Linux macOS |
Linguaggio | Java |
Licenza | BSD License (in una versione modificata) (licenza libera) |
Lingua | Multilingua |
Sito web | bobbylight.github.io/RText |
RText è un editor di testo per programmatori ed un software libero, pubblicato rispettando le specifiche di una versione modificata del protocollo BSD License, per Windows, macOS, Linux, OS/2, Unix e OpenVMS.[1] Il programma è disponibile in inglese ed è stato tradotto anche in diversi idiomi, tra cui quello cinese della Cina continentale (usa i caratteri semplificati), spagnolo, spagnolo argentino, portoghese europeo, tedesco, francese, italiano, russo, taiwanese (fa uso dei caratteri tradizionali), olandese, giapponese, coreano, polacco, turco, ungherese ed indonesiano.
Il programma è stato creato da Fifesoft ed è stato programmato per lo più dal suo fondatore, Robert Futrell. I contributi esterni sono aumentati da quando il codice sorgente viene condiviso tramite il software di controllo di versione distribuito Git su GitHub. Le funzionalità di registrazione ed esecuzione delle macro sono state aggiunte a partire dalla versione 0.8.9.2.
Le funzionalità più rilevanti di RText sono le seguenti:
Il codice sorgente è attualmente ospitato dai Server di SourceForge, Maven e GitHub.
RText è un software che segue la filosofia FOSS, supporta l'autocompletamento, la ricerca/sostituzione tramite espressioni regolari, il code folding, i segnalibri, l'evidenziazione delle parentesi e l'indentazione.[3] Supporta anche l'aggiunta di macro e plugin. Di base sono già inclusi alcuni plugin ritenuti essenziali dal fondatore, scritti dallo stesso sviluppatore del progetto (permettono, per esempio, di esplorare il File System).
RText ha un'interfaccia personalizzabile ed è possibile aprire più documenti all'interno della stessa istanza del programma tramite l'uso delle linguette. Presenta stili, font e colori a tema propri di editor di testo evoluti. Il tradizionale Blocco note incluso in bundle con il sistema operativo Windows, al contrario, non permette di scegliere il colore del font e dello sfondo. Sono presenti alcuni temi che recuperano la tradizionale modalità sfondo nero/caratteri bianchi o grigi.
Inoltre gli utenti possono definire l'evidenziazione della sintassi e l'autocompletamento per qualunque altro linguaggio, tramite un sistema di definizione basato su JFlex (The Fast Scanner Generator for Java) che rende RText estensibile, se si ha familiarità con il linguaggio di programmazione Java.
Altre caratteristiche sono:
Nella barra di stato della finestra principale è presente l'indicatore della quantità di memoria occupata dall'applicazione nell'area di memoria heap.
Supporta diversi linguaggi di programmazione e di marcatura[3].
Al momento sono:
Il progetto è basato su un componente, l'area testuale RSyntaxTextArea, anch'esso open source e scritto in Java, e non ricorre in alcun caso all'invocazione delle API Win32, quindi non impiega Microsoft Foundation Classes (MFC) o librerie simili, il che assicura la portabilità del programma in ambito multipiattaforma, in quanto nativo Java. È distribuito rispettando le specifiche di una versione modificata del protocollo BSD License.
Dato che RSyntaxTextArea supporta internamente la ricerca di testo con espressioni regolari su più righe, RText permette tale modalità di ricerca. RSyntaxTextArea è un'estensione della più diffusa JTextArea contenuta nel package Swing di Java. Tra le caratteristiche aggiunte compaiono:
setTabSize
di JTextArea.Se lo sfondo di una RTextArea (classe estesa da RSyntaxTextArea) fosse impostato con un determinato colore, la sua proprietà opaque
(opaco) verrebbe impostata a true
(vero) per ragioni prestazionali. Viceversa, se lo sfondo fosse impostato con un'immagine, allora la proprietà opaque
sarebbe valorizzata con false
(falso). Tutto ciò peggiora le prestazioni ma, se così non fosse, l'utente vedrebbe comparire dei difetti grafici sullo schermo, nella zona occupata dall'area testuale, mentre scorre un documento usando i tasti direzionali (lo stesso problema non si verifica premendo i tasti Pagina Su/Giù). Fifesoft ha sconsigliato di modificare il valore della proprietà opaque
, giacché viene fatto dalle logiche in essere, quando opportuno.
Fifesoft raccomanda di inglobare l'area testuale internamente ad un'istanza di RTextScrollPane, anziché nel più noto JScrollPane (componente contenuto nel package Swing di Java), qualora si decidesse di includere RSyntaxTextArea in un programma sviluppato autonomamente, dato che questa classe consente l'aggiunta dei numeri della linea e dei segnalibri all'area di testo.
Le macro vengono programmate alternativamente nel linguaggio di scripting orientato agli oggetti ed agli eventi JavaScript, sfruttando l'interprete JavaScript Rhino, oppure nel linguaggio di programmazione ad oggetti per la piattaforma Java Groovy.
L'esempio che segue mostra lo script JavaScript di una macro che apre un file. Il nome del file da aprire viene ricavato sulla base della selezione nel foglio di lavoro attivo dell'editor RText; se disponibile, il file viene aperto in un nuovo foglio di lavoro di RText:
textArea.beginAtomicEdit();
try {
var fileName = textArea.selectedText;
if (fileName==null || fileName.length()==0) {
javax.swing.JOptionPane.showMessageDialog(rtext,
"Couldn't open file: No selection.\n" +
"A file name must be selected in the active editor to open a file.",
"Error", javax.swing.JOptionPane.ERROR_MESSAGE);
}
else {
var isUrl = fileName.startsWith("http://");
var file = new java.io.File(fileName);
if (!file.isAbsolute()) {
var parentDir = new java.io.File(textArea.fileFullPath).parentFile;
file = new java.io.File(parentDir, fileName);
}
// Easter egg - if this is a URL, open it in a browser
if (isUrl) {
java.awt.Desktop.getDesktop().browse(new java.net.URL(fileName).toURI());
}
else if (file.isFile()) {
rtext.openFile(file.absolutePath);
}
else if (file.isDirectory()) {
var chooser = rtext.fileChooser;
chooser.currentDirectory = file;
rtext.getAction(org.fife.rtext.RTextActionInfo.OPEN_ACTION).actionPerformed(null);
}
else {
javax.swing.JOptionPane.showMessageDialog(rtext,
"File does not exist:\n" + file.absolutePath, "Error",
javax.swing.JOptionPane.ERROR_MESSAGE);
}
}
} finally {
textArea.endAtomicEdit();
}
Lo stesso esempio programmato in linguaggio Groovy:
import java.awt.*
import javax.swing.*
import org.fife.rtext.*
textArea.beginAtomicEdit()
try {
def fileName = textArea.selectedText
if (fileName==null || fileName.length()==0) {
JOptionPane.showMessageDialog(rtext,
"""Couldn't open file: No selection.
A file name must be selected in the active editor to open a file.""",
"Error", JOptionPane.ERROR_MESSAGE)
}
else {
def isUrl = fileName.startsWith("http://")
def file = new File(fileName)
if (!file.isAbsolute()) {
def parentDir = new File(textArea.fileFullPath).parentFile
file = new File(parentDir, fileName)
}
// Easter egg - if this is a URL, open it in a browser
if (isUrl) {
Desktop.desktop.browse(new URL(fileName).toURI())
}
else if (file.isFile()) {
rtext.openFile(file.absolutePath)
}
else if (file.isDirectory()) {
def chooser = rtext.fileChooser
chooser.currentDirectory = file
rtext.getAction(RTextActionInfo.OPEN_ACTION).actionPerformed(null)
}
else {
JOptionPane.showMessageDialog(rtext,
"File does not exist:\n" + file.absolutePath, "Error",
JOptionPane.ERROR_MESSAGE)
}
}
} finally {
textArea.endAtomicEdit()
}
L'esempio che segue mostra lo script JavaScript di una macro che sostituisce qualsiasi testo selezionato con una versione di quel testo formattato in HTML:
function replaceMultipleSpaces(text) {
var p = java.util.regex.Pattern.compile(" +");
var m = p.matcher(text);
var sb = new java.lang.StringBuffer();
while (m.find()) {
var spaces = m.group();
m.appendReplacement(sb, spaces.replace(" ", " "));
}
m.appendTail(sb);
return sb.toString();
}
textArea.beginAtomicEdit();
try {
var text = textArea.selectedText;
if (text==null || text.length()==0) {
javax.swing.JOptionPane.showMessageDialog(rtext,
"Error: No selection.\n" +
"Text must be selected to HTML-ify.",
"Error", javax.swing.JOptionPane.ERROR_MESSAGE);
}
else {
text = text.replace("&", "&").replace("\"", """).
replace("<", "<").replace(">", ">").
replace("\t", "	").replace("\n", "<br />\n");
if (text.contains(" ")) { // Replace multiple spaces with sequences
text = replaceMultipleSpaces(text);
}
var start = textArea.getSelectionStart();
textArea.replaceSelection(text);
textArea.setSelectionStart(start);
textArea.setSelectionEnd(start+text.length());
}
} finally {
textArea.endAtomicEdit();
}
L'esempio che segue mostra lo script JavaScript di una macro che ordina tutte le righe nel foglio di lavoro attivo di RText:
var removeDuplicates = true; // Change to "false" if you want to keep duplicates
function join(lines) {
var sb = new java.lang.StringBuffer();
if (lines!=null && lines.length>0) {
for (var i=0; i<lines.length; i++) {
//System.out.println(lines[i]);
sb.append(lines[i]).append('\n');
}
}
return sb.toString();
}
// Note: You'll want to consider wrapping your scripts inside calls to
// beginAtomicEdit() and endAtomicEdit(), so the actions they perform can
// be undone with a single Undo action.
textArea.beginAtomicEdit();
try {
var lines = textArea.text.split("\n");
if (removeDuplicates) {
var ts = new java.util.TreeSet();
for (var i=0; i<lines.length; i++) {
ts.add(lines[i]);
}
lines = ts.toArray();
}
java.util.Arrays.sort(lines);
textArea.text = join(lines);
} finally {
textArea.endAtomicEdit();
}
Lo stesso esempio programmato in linguaggio Groovy:
final def removeDuplicates = true // Change to "false" if you want to keep duplicates
// Note: You'll want to consider wrapping your scripts inside calls to
// beginAtomicEdit() and endAtomicEdit(), so the actions they perform can
// be undone with a single Undo action.
textArea.beginAtomicEdit()
try {
def lines = textArea.text.split("\n")
if (removeDuplicates) {
def ts = new TreeSet()
lines.each {
ts.add(it)
}
lines = ts.toArray()
}
Arrays.sort(lines)
textArea.text = lines.join("\n")
} finally {
textArea.endAtomicEdit()
}