Discussion:
BBEdit: Formatieren (Prettify) von tabellenartigen Inhalten
(zu alt für eine Antwort)
Andreas Borutta
2017-03-21 14:23:18 UTC
Permalink
Moin.

Angenommen man hat in BBEdit (macOS) folgende tabellenartige
Inhalte/Daten:

foo bar zot
lorem ipsum doloret

oder

foo; bar; zot;
lorem; ipsum; doloret;

Ich suche einen Weg, automatisch Leerzeichen einfügen zu lassen, so
dass eine tabellenartige Formatierung herauskommt:

foo bar zot
lorem ipsum doloret

foo; bar; zot;
lorem; ipsum; doloret;

Weiß jemand, ob/wie das mit BBEdit geht, ob es für den Zweck eventuell
ein Plugin gibt?

Danke.

Andreas
--
http://borumat.de
http://fahrradzukunft.de
Stefan Ram
2017-03-24 20:17:42 UTC
Permalink
Post by Andreas Borutta
Ich suche einen Weg, automatisch Leerzeichen einfügen zu lassen, so
lorem ipsum doloret
Mit meinem Editor mache ich so etwas, indem ich zunächst
jedes Leerzeichen durch ein horizontales Tabulatorzeichen
ersetzen lasse. Dazu verwende ich einen sehr großen Wert
für den Abstand horizontaler Tabulatorpositionen,
wie beispielsweise 128, damit auch lange Wörter das Format
nicht sprengen.

lorem ipsum doloret

lorem ipsum doloret

Nun kann ich die Tabs wiederum durch entsprechend viele
Leerzeichen ersetzen lassen, so daß die Position der Wörter
sich dabei nicht verändert. Hierfür gibt es eine spezielle
eingebaute Funktion in meinem Editor.

lorem ipsum doloret

Nun muß ich zwischen jeweils zwei Spalten den Leeraum noch
manuell trimmen, damit er nicht unnötig groß ist. Das geht
mit Markieren und Ausschneiden rechteckiger Blöcke vor jeder
Spalte.

lorem ipsum doloret

Und schon habe ich drei ausgerichtete Spalten.

Ich habe eben auch mal schnell ein kleines C++-Programm
geschrieben, das zeigt, wie man eine Ausrichtung von Spalten
mit C++ programmieren könnte. Wenn man dort noch Datei-E/A
hinzufügt, könnte man den Bereich des Editors auch durch
dieses Programm laufen lassen.

#include <iostream>
#include <ostream>
#include <vector>
#include <string>

struct program
{
::std::string source = R"(
Alpha Beta Gamma Delta Epsilon
Zeta Eta Theta Iota Kappa
Lambda My Ny Xi Omikron
Pi Rho Sigma Tau Ypsilon
Phi Chi Psi Omega
)";

/* a position within the source or
one past the end of the source */
size_t pos { 0 };

char current_char()
{ return source.at( pos ); }

bool in_text()
{ return pos < source.length(); }

bool is_trimmable( char const c )
{ return c == ' '; }

bool is_trimmable_or_eol( char const c )
{ return is_trimmable( c )|| c == '\r' || c == '\n'; }

void erase_front()
{ size_t const pos { 0 };
size_t const len { 1 };
source.erase( pos, len ); }

void erase_back()
{ size_t const pos { source.length() - 1 };
size_t const len { 1 };
source.erase( pos, len ); }

void erase_char_at_pos()
{ size_t const len { 1 };
source.erase( pos, len ); }

void trim_start_of_source()
{ while( is_trimmable_or_eol( source.front() ))erase_front(); }

void trim_end_of_source()
{ while( is_trimmable_or_eol( source.back() ))erase_back(); }

void normalize_line_separators()
{ pos = 0; while( pos < source.length() )
{ if( source.at( pos ) == '\r' )erase_char_at_pos();
else ++pos; }
source += '\n'; }

void goto_start_of_source()
{ pos = 0; }

void trim_at_pos()
{ while( is_trimmable( source.at( pos ) ))erase_char_at_pos(); }

void move_pos_to_end_of_line()
{ while( true )
{ if( pos >= source.length() )return;
if( source.at( pos ) == '\n' )return;
if( pos < source.length() )++pos; }}

bool previous_char_is_trimmable()
{ return pos > 0 && is_trimmable( source.at( pos - 1 )); }

void remove_previous_char()
{ --pos;
size_t len { 1 };
source.erase( pos, len ); }

void trim_at_end_of_line()
{ while( previous_char_is_trimmable() )remove_previous_char(); }

void move_pos_to_next_line()
{ while( pos < source.length())
if( source.at( pos++ )== '\n' )return; }

bool pos_is_in_a_line()
{ return pos < source.length(); }

void debug_print()
{ for( size_t i = 0; i < source.length(); ++i )
{ if( i == pos )::std::cout << '[' << source.at( i )<< ']';
else ::std::cout << source.at( i ); }}

void trim_each_line()
{ goto_start_of_source();
while( pos_is_in_a_line() )
{ trim_at_pos();
move_pos_to_end_of_line();
trim_at_end_of_line();
move_pos_to_next_line(); }}

void trim_source()
{ trim_start_of_source();
trim_end_of_source();
normalize_line_separators();
trim_each_line(); }

::std::vector<size_t> width{};

bool in_line_body()
{ return in_text() && current_char() != '\n'; }

void move_to_end_of_word( size_t & p )
{ while( source.at( p )!= ' ' && source.at( p )!= '\n' )++p; }

void move_to_end_of_spaces( size_t & p )
{ while( source.at( p )== ' ' && source.at( p )!= '\n' )++p; }

size_t cell_width()
{ size_t p = pos;
move_to_end_of_word( p );
return p - pos; }

void goto_next_column()
{ move_to_end_of_word( pos );
move_to_end_of_spaces( pos ); }

bool width_recorded( size_t const col )
{ return col < width.size(); }

void record_width( size_t const col, size_t const w )
{ while( !width_recorded( col ))width.push_back( 0 );
width.at( col ) = w; }

void record_widths_of_columns_for_current_line()
{ size_t col = 0;
while( in_line_body() )
{ size_t const w = cell_width();
if( !width_recorded( col ) || w > width.at( col ))
record_width( col, w );
goto_next_column();
++col; }
if( pos < source.length() )++pos; }

void record_widths_of_columns()
{ goto_start_of_source();
while( pos_is_in_a_line() )
{ record_widths_of_columns_for_current_line(); }}

void trim_spaces_here()
{ size_t const next = pos + 1;
while
( pos < source.length() && source.at( pos )== ' ' &&
next < source.length() && source.at( next )== ' ' )
erase_char_at_pos(); }

void insert_spaces_here( size_t const n )
{ for( size_t i = 0; i < n; ++i )
source.insert( pos, 1, ' ' ); }

void adjust( size_t const current, size_t const target )
{ trim_spaces_here();
insert_spaces_here( target - current ); }

void align_columns_for_current_line()
{ size_t col = 0;
while( in_line_body() )
{ size_t const w = cell_width();
move_to_end_of_word( pos );
if( w < width.at( col ))adjust( w, width.at( col ) );
move_to_end_of_spaces( pos );
++col; }
if( pos < source.length() )++pos; }

void align_columns()
{ goto_start_of_source();
while( pos_is_in_a_line() )
{ align_columns_for_current_line(); }}

void align_source()
{ record_widths_of_columns();
align_columns(); }

void run()
{ trim_source();
align_source();
::std::cout << source << '\n'; ::std::cout.flush(); }};

int main() { ::program{}.run(); }

transcript

Alpha Beta Gamma Delta Epsilon
Zeta Eta Theta Iota Kappa
Lambda My Ny Xi Omikron
Pi Rho Sigma Tau Ypsilon
Phi Chi Psi Omega
Andreas Borutta
2017-03-24 23:31:52 UTC
Permalink
Post by Andreas Borutta
Ich suche einen Weg, automatisch Leerzeichen einfügen zu lassen, so
lorem ipsum doloret
Mit meinem Editor mache ich so etwas, indem [...]
Danke für Deine Hinweise Stefan.

Ich hatte gehofft, es gäbe ein Plugin für meinen Editor, welches die
Aufgabe ohne manuelles Zutun erledigt.

Aber das scheint nicht der Fall zu sein.

Gruß, Andreas
--
http://borumat.de
http://fahrradzukunft.de
Dennis Preiser
2017-03-25 09:31:12 UTC
Permalink
Post by Andreas Borutta
Post by Andreas Borutta
Ich suche einen Weg, automatisch Leerzeichen einfügen zu lassen, so
lorem ipsum doloret
Mit meinem Editor mache ich so etwas, indem [...]
Danke für Deine Hinweise Stefan.
Ich hatte gehofft, es gäbe ein Plugin für meinen Editor, welches die
Aufgabe ohne manuelles Zutun erledigt.
Aber das scheint nicht der Fall zu sein.
BBEdit kann Scripte aufrufen. Hier ist das beschrieben:

<http://bbedit-hints.tumblr.com/post/17659257006/2-ways-to-make-pretty-tables-in-bbedit>

Für Dein Beispiel:

| foo; bar; zot;
| lorem; ipsum; doloret;

muss das so aussehen: sed 's/;/;@/g' | column -s '@' -t

und dann kommt das hier raus:

| foo; bar; zot;
| lorem; ipsum; doloret;

Bzw. mit Leerzeichen getrennt: sed 's/ / @/g' | column -s '@' -t

| foo bar zot
| lorem ipsum doloret

->

| foo bar zot
| lorem ipsum doloret

Dennis
Andreas Borutta
2017-03-25 09:56:02 UTC
Permalink
Post by Dennis Preiser
Post by Andreas Borutta
Ich hatte gehofft, es gäbe ein Plugin für meinen Editor, welches die
Aufgabe ohne manuelles Zutun erledigt.
Aber das scheint nicht der Fall zu sein.
<http://bbedit-hints.tumblr.com/post/17659257006/2-ways-to-make-pretty-tables-in-bbedit>
| foo; bar; zot;
| lorem; ipsum; doloret;
| foo; bar; zot;
| lorem; ipsum; doloret;
| foo bar zot
| lorem ipsum doloret
->
| foo bar zot
| lorem ipsum doloret
Funktioniert perfekt.

Ganz herzlichen Dank Dennis!

Das war ein alter Wunsch, sowas geschmeidig erledigen zu können.

Und mit einer kleinen Modifikation kann man sogar Werte verwenden, die
einzelne Leerzeichen enthalten.
Dazu kann man dann doppelte Leerzeichen als Trennzeichen deklarieren:

sed 's/ / @/g' | column -s '@' -t

Was ich noch nicht herausgefunden habe ist, wie der Code lauten muss,
damit auch ein Reformatieren/Normalisieren eines bereits als Tabelle
formatierten Textes klappt.

Beispiel:

foo bar zot
lorem ipsum doloret

->

foo bar zot
lorem ipsum doloret

Aber auch:

foo bar zot
lorem ips doloret

->

foo bar zot
lorem ips doloret



Andreas
--
http://borumat.de
http://fahrradzukunft.de
Dennis Preiser
2017-03-25 11:32:54 UTC
Permalink
Post by Andreas Borutta
Und mit einer kleinen Modifikation kann man sogar Werte verwenden, die
einzelne Leerzeichen enthalten.
Was ich noch nicht herausgefunden habe ist, wie der Code lauten muss,
damit auch ein Reformatieren/Normalisieren eines bereits als Tabelle
formatierten Textes klappt.
Wenn der Feldtrenner zwei oder mehr Leerzeichen ist, dann so:

sed 's/ */ @/g' | column -s '@' -t

also drei mal ' ' und '*'.
Post by Andreas Borutta
foo bar zot
lorem ipsum doloret
->
foo bar zot
lorem ipsum doloret
| foo bar zot
| lorem ipsum doloret
Post by Andreas Borutta
foo bar zot
lorem ips doloret
->
foo bar zot
lorem ips doloret
| foo bar zot
| lorem ips doloret

Dennis
Andreas Borutta
2017-03-25 11:38:50 UTC
Permalink
Post by Andreas Borutta
Und mit einer kleinen Modifikation kann man sogar Werte verwenden, die
einzelne Leerzeichen enthalten.
Was ich noch nicht herausgefunden habe ist, wie der Code lauten muss,
damit auch ein Reformatieren/Normalisieren eines bereits als Tabelle
formatierten Textes klappt.
Danke! Klappt.

Andreas
--
http://borumat.de
http://fahrradzukunft.de
Andreas Borutta
2017-03-25 12:30:39 UTC
Permalink
Post by Andreas Borutta
Post by Andreas Borutta
Und mit einer kleinen Modifikation kann man sogar Werte verwenden, die
einzelne Leerzeichen enthalten.
Was ich noch nicht herausgefunden habe ist, wie der Code lauten muss,
damit auch ein Reformatieren/Normalisieren eines bereits als Tabelle
formatierten Textes klappt.
Danke! Klappt.
Ein wenig Feintuning ist noch nötig.
Das '@' in Mailadressen wird als Trenner interpretiert.

Weiterhin wird das Skript durch ein scharfes S und Umlaute offenbar
aus dem Tritt gebracht.

foo euß bar zot
lorem mll ipsum doloret

->

foo euß bar zot
lorem mll ipsum doloret

statt zu

foo euß bar zot
lorem mll ipsum doloret

Dito für

foo euü bar zot
lorem mll ipsum doloret


Vermutlich hat das mit der Behandlung von Zeichen in der
RegEx-Maschine zu tun, oder?


Andreas
--
http://borumat.de
http://fahrradzukunft.de
Dennis Preiser
2017-03-25 13:47:29 UTC
Permalink
Post by Andreas Borutta
Ein wenig Feintuning ist noch nötig.
Das ist immer problematisch, als Trenner braucht man ein Zeichen,
welches im Text nicht vorkommt.

Zum Beispiel '¶' kommt in Texten sehr selten vor, probier das doch mal
(alt + 3).
Post by Andreas Borutta
Weiterhin wird das Skript durch ein scharfes S und Umlaute offenbar
aus dem Tritt gebracht.
foo euß bar zot
lorem mll ipsum doloret
->
foo euß bar zot
lorem mll ipsum doloret
statt zu
foo euß bar zot
lorem mll ipsum doloret
Dito für
foo euü bar zot
lorem mll ipsum doloret
Vermutlich hat das mit der Behandlung von Zeichen in der
RegEx-Maschine zu tun, oder?
Ich hab kein BBEdit, aber im Terminal oder aus MacVim aufgerufen sieht
das Ergebnis hier gut aus:

| ***@coredump:~% pbpaste | sed 's/ */ @/g' | column -s '@' -t
| foo euß bar zot
| lorem mll ipsum doloret
| ***@coredump:~% pbpaste | sed 's/ */ @/g' | column -s '@' -t
| foo euü bar zot
| lorem mll ipsum doloret

Was ist denn als file encoding eingestellt? Vielleicht gibt es da
Probleme beim Konvertieren.

Dennis
Andreas Borutta
2017-03-25 16:43:38 UTC
Permalink
Post by Dennis Preiser
Post by Andreas Borutta
Ein wenig Feintuning ist noch nötig.
Das ist immer problematisch, als Trenner braucht man ein Zeichen,
welches im Text nicht vorkommt.
Zum Beispiel '¶' kommt in Texten sehr selten vor, probier das doch mal
(alt + 3).
Wenn ich

#!/bin/sh
sed 's/ */ ¶/g' | column -s '¶' -t

in der Textfilterdatei verwende, ergibt sich bei

foo euü bar zot
lorem mll ipsum dolore

dieses:

foo euü bar zot
lorem mll ipsum dolore

Bei

foo eus bar ***@ot
lorem mll ipsum ***@olore

ergibt sich dieses:

foo eus bar ***@ot
lorem mll ipsum ***@olore

Es gibt also noch irgendein Problem mit dem scharfen S und den
Umlauten.
Post by Dennis Preiser
| foo euß bar zot
| lorem mll ipsum doloret
| foo euü bar zot
| lorem mll ipsum doloret
Was ist denn als file encoding eingestellt? Vielleicht gibt es da
Probleme beim Konvertieren.
UTF-8

Vielleicht ist folgende Umwandlung als Indiz noch aufschlussreich?

erika muster Köln ***@olore +4922179543
lorem mll ipsum ***@olore +49123876549

->

erika muster K√ ln ***@olore +4922179543
lorem mll ipsum ***@olore +49123876549



Andreas
--
http://borumat.de
http://fahrradzukunft.de
Dennis Preiser
2017-03-25 17:30:16 UTC
Permalink
Post by Andreas Borutta
Vielleicht ist folgende Umwandlung als Indiz noch aufschlussreich?
->
Seltsam. Bei mir in MacVim funktioniert das:

<http://d--p.de/tmp/2017-03-25_macvim.mov>

Frag doch mal in der Mac-Gruppe. Evtl. eine Eigenart von BBEdit.

Dennis
Andreas Borutta
2017-03-25 17:34:57 UTC
Permalink
Post by Dennis Preiser
Post by Andreas Borutta
Vielleicht ist folgende Umwandlung als Indiz noch aufschlussreich?
->
<http://d--p.de/tmp/2017-03-25_macvim.mov>
Frag doch mal in der Mac-Gruppe. Evtl. eine Eigenart von BBEdit.
In der Mac-Gruppe habe ich schlechte Erfahrungen gemacht.

Vielleicht liest hier ja noch jemand mit, der BBEdit verwendet und das
Problem reproduzieren kann und eine Lösungsidee hat.

Andreas
--
http://borumat.de
http://fahrradzukunft.de
Andreas Borutta
2017-04-03 09:41:04 UTC
Permalink
Post by Andreas Borutta
Vielleicht liest hier ja noch jemand mit, der BBEdit verwendet und das
Problem reproduzieren kann und eine Lösungsidee hat.
Ich habe vor einer Woche das Problem auf Stackoverflow und in der
offiziellen Google-Groups für BBEdit geschildert.

Bisher weiß niemand eine Lösung. Vermutlich gibt es keine.

Andreas
--
http://borumat.de
http://fahrradzukunft.de
Andreas Borutta
2017-04-06 06:42:32 UTC
Permalink
Post by Andreas Borutta
Post by Andreas Borutta
Vielleicht liest hier ja noch jemand mit, der BBEdit verwendet und das
Problem reproduzieren kann und eine Lösungsidee hat.
Ich habe vor einer Woche das Problem auf Stackoverflow und in der
offiziellen Google-Groups für BBEdit geschildert.
Bisher weiß niemand eine Lösung. Vermutlich gibt es keine.
In der BBEDit-Gruppe bei Google-Groups konnte das Problem reproduziert
werden.

https://groups.google.com/d/msg/bbedit/yuLz48rIyoc/ydRgG1oXBAAJ

Vermutlich ist es ein Bug in BBEdit.

Als Lösung kann man eine Datei "~/.profile" mit folgendem Inhalt
erzeugen:

export LANG="de_DE.UTF-8"
export LC_ALL="de_DE.UTF-8"

Dann werden auch Inhalte mit Umlauten richtig behandelt.

Details könnt ihr in der verlinkten Diskussion nachlesen.


Andreas
--
http://borumat.de
http://fahrradzukunft.de
Stefan Ram
2017-03-25 17:30:46 UTC
Permalink
Post by Andreas Borutta
in der Textfilterdatei verwende, ergibt sich bei
lorem mll ipsum dolore
Es könnte sein, daß die Textdatei eine Kodierung verwendet,
die zwei Oktette für manche Sonderzeichen verwendet (wie
beispielsweise UTF-8 für »ü«). Es könnte sein, daß das Program
»column« immer ein /Oktett/ als ein Zeichen ansieht, so daß
dort ein »ü« als /zwei/ Zeichen interpretiert wird.

Um mit den beschriebenen Problemen umzugehen, kann man
die vorkommenden problematischen Sonderzeichen, wie »ü«
und »@« zunächst in sonst unbenutzte Sonderzeichen aus
ISO-8859-1 umwandeln. Beispielsweise könnte man die Datei
erst einmal von UTF-8 nach ISO-8859-1 umwandeln und dann
noch »@« (aus E-Mail-Adressen) in das vermutlich unbenötigte
»þ«. Nach der Anwendung von »column« kann man es dann wieder
zurückwandeln.

In »comp.lang.c++« hat Ben Bacarisse übrigens zwischenzeitlich
ein C++-Programm gepostet, welche die Aufteilung auf
mehrere Spalten auf eine viel elegantere und kürzere Weise
erledigt als mein Programm. C++-Programmierer könnten also
auch sein Programm als Basis einer Lösung verwenden. Da Java
aber Codierungen von Textdateien besser unterstützt als C++,
wäre Java vielleicht besser geeignet. Allerdings müßte dann
jedes Mal die JVM gestartet werden, also würde der Aufruf
langsamer sein als bei einem C++-Programm. Vielleicht gibt es
eine Bibliothek für C++, die Codierungen unterstützt.
Wahrscheinlich kann man das Problem aber am einfachsten in
einer Skriptsprache wie Python oder Perl lösen, wenn man es
selber programmieren will.
Andreas Borutta
2017-03-25 17:36:41 UTC
Permalink
Post by Stefan Ram
Post by Andreas Borutta
in der Textfilterdatei verwende, ergibt sich bei
lorem mll ipsum dolore
Es könnte sein, daß die Textdatei eine Kodierung verwendet,
die zwei Oktette für manche Sonderzeichen verwendet (wie
beispielsweise UTF-8 für »ü«). Es könnte sein, daß das Program
»column« immer ein /Oktett/ als ein Zeichen ansieht, so daß
dort ein »ü« als /zwei/ Zeichen interpretiert wird.
Danke für den Hinweis.

Vielleicht liest hier später noch jemand mit, der BBEdit verwendet und
dazu etwas sagen kann.

Andreas
--
http://borumat.de
http://fahrradzukunft.de
Loading...