Rendering Klartext als HTML pflegen whitespace – ohne <pre>
Jede beliebige text-Datei voll druckbaren Zeichen, wie kann ich das ins HTML-Format konvertiert, das wäre gerendert genau das gleiche (mit den folgenden Anforderungen)?
- Sich nicht auf alle, aber die Standard-HTML-whitespace-Regeln
- Keine
<pre>
tag - Keine CSS -
white-space
Regeln
- Keine
-
<p>
- tags sind in Ordnung, aber nicht erforderlich (<br />
s und/oder<div>
s sind in Ordnung) -
Leerzeichen werden beibehalten, genau.
Angesichts der folgenden Zeilen von Eingabe (ignorieren fehlerhafter auto-syntax-highlighting):
Line one Line two, indented four spaces
Einem browser Rendern soll die Ausgabe genau die gleiche, die Aufrechterhaltung der Einrückung der zweiten Zeile und die Lücke zwischen "eingerückt" und "Räume". Natürlich bin ich nicht eigentlich auf der Suche nach nicht-proportional-Ausgang, und die Schrift ist orthogonal zu den Algorithmus/markup.
Gegeben, die zwei Zeilen als eine vollständige input-Datei, Beispiel die korrekte Ausgabe wäre dann:
Line one<br /> Line two, indented four spaces
-
Weichen Umbruch im browser ist wünschenswert. Das heißt, der resultierende HTML-Code sollte nicht erzwingen, dass der Benutzer scrollen, auch wenn der Eingabe-Linien sind breiter als Ihre viewport (vorausgesetzt, die einzelnen Wörter sind immer noch die Verengung, als sagte viewport).
Ich bin auf der Suche nach vollständig definiert Algorithmus. Bonus-Punkte für die Umsetzung in python oder javascript.
(Bitte nicht nur die Antwort, dass ich mit sollte <pre>
- tags oder CSS - white-space
Regel, als die meinen Anforderungen Rendern dieser Optionen unhaltbar. Bitte auch nicht posten ungetestet und/oder naive Vorschläge wie "ersetzen Sie alle Leerzeichen mit
." Nach alle, ich bin zuversichtlich, dass eine Lösung technisch möglich ist — es ist ein Interessantes problem, nicht Sie denken?)
- Was ist Los mit "ersetzen Sie alle Leerzeichen mit "? Frage nur, ist es das erste, was mir in den Sinn kam - natürlich würden Sie auch ersetzen müssen Zeilenumbrüche mit
<br>
und expandiere tabs irgendwie. - "es ist ein Interessantes problem, meinst du nicht?" - nicht wirklich. Es ist ein problem, das bereits gelöst, für Sie in mehr als einer Hinsicht.
- wahrscheinlich, weil diese nicht zulassen, browser-wrap lange Zeilen
- Sind Sie nur besorgt mit Leerzeichen an den Anfang der Zeile, oder wollen Sie bewahren die Positionierung des Textes innerhalb der Zeile? Oder, in anderen Worten, gibt es Spalten in Ihrem text, den Sie beibehalten möchten?
- Ich bin extrem neugierig, was mögliche Beschränkungen verbieten konnte all die offensichtlichen und legitime Lösungen, die es gibt.
- Überall in der Zeile, Leerzeichen und bewahrt werden sollte — mit der Ausnahme, dass der browser sollte in der Lage sein, um soft-Zeilenumbruch", um genau zu sein.
- Zum Beispiel, wenn Sie mit
contentEditable
einigen Browsern (Firefox) komplett choke, wenn der content hat keine, aber die Standard -white-space
interpretation. - Warum dann nicht einfach <pre> - tags?
- Da der text in
<pre>
tags nicht soft-wrap, und Sie hätte wahrscheinlich das gleiche Problem, bei Firefox untercontentEditable
- Modus. - Ich habe eine harte Zeit, die nicht Lesen von Ihrem Kommentar als unnötig douche-y und anmaßend.
- H. - Ihr problem selbst ist unnötig (und langweilig imo). Das besagt meiner Meinung nach aber nicht douche-y. Nehmen Sie nicht die Dinge so persönlich.
- problem ist unnötig." Sie weiß nicht, dass. Der naive Lösungen, die ich oben erwähnt sind unhaltbar, die aufgrund von Einschränkungen oben angedeutet. Wenn die Lösung ist so offensichtlich, bitte beantworten!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Lösung zu tun, während immer noch so dass der browser wrap lange Zeilen ist zu ersetzen, jede Sequenz von zwei Leerzeichen durch ein Leerzeichen und eine non-break space.
Browser korrekt gerendert, alle Räume (normal und nicht zu brechen sind), während noch umbrechen langer Zeilen (durch normale Leerzeichen).
Javascript:
so viel wie möglich, und es scheint zu funktionieren! jsfiddle.net/nayyP/3Verwenden zero-width space (
​
) um die Leerzeichen beizubehalten und ermöglichen den text zu wickeln. Die grundlegende Idee ist, paar jeder Raum oder eine Folge von Leerzeichen durch ein zero-width space. Dann ersetzen Sie jedes Leerzeichen mit einem non-breaking space. Sie wollen auch zum codieren von html und fügen Sie Zeilenumbrüche.Wenn Sie kümmern sich nicht um unicode-Zeichen, ist es trivial. Sie können einfach verwenden Sie
string.replace()
:Wenn es ok ist für den weißen Raum zu wickeln, paar jeder Raum mit einer zero-width space, wie oben. Ansonsten, zu halten, weißen Raum zusammen, jedes paar Sequenz von Räumen mit einer zero-width space:
Kodieren unicode-Zeichen, es ist ein wenig komplexer. Sie benötigen zum Durchlaufen der Zeichenkette:
Nun, einfach ein Kommentar schreiben. Ohne Verwendung von monospace-Schriftarten, werden Sie verlieren einige der Formatierung. Überlegen Sie, wie diese Textzeilen mit einer monospace-schriftart, die form Spalten:
Ohne die Monospace-schriftart, verlieren Sie die Spalten:
ten sieben Räume
elf vier Räume
Scheint es, dass der Algorithmus, um das zu beheben, wäre sehr Komplex.
ñ
Sie müssen verwenden Sie Ihre Charakter-codes (dhñ
). Es ist nicht feesible, um den Zeichen-code in einem Aufrufreplace()
, so dass der string zu Durchlaufen um sich mit den Zeichen eins nach dem anderen.Content-Type: text/html; charset=utf-8
sollte genug sein.Während dies nicht ganz alle Ihre Anforderungen zu erfüllen — für eine Sache, die es nicht handhaben tabs, ich habe das folgende Schmuckstück, das fügt eine
wordWrap()
Methode, um JavascriptString
s, auf ein paar Gelegenheiten zu tun etwas ähnlich, was Sie beschreiben — so könnte es ein guter Ausgangspunkt, um zu kommen mit etwas, das auch die zusätzlichen Dinge, die Sie wollen.Ich möchte auch anmerken, dass es scheint mir, als wenn, im Allgemeinen, Sie wollen, um zu verwenden, eine Monospace-schriftart, wenn die tabs sind betroffen, denn die Breite von Worten würde variieren mit der Proportionalschrift verwendet (die die Ergebnisse von der Verwendung von Tabulatoren Schrift sehr abhängig).
Update: Hier ist eine etwas besser lesbare version mit freundlicher Genehmigung von einem online -javascript - verschönerer:
Ist sehr einfach, wenn Sie die jQuery-Bibliothek in Ihr Projekt.
Nur eine Zeile ,Fügen
asHTml
Erweiterung um String-Klasse und :DEMO :http://jsfiddle.net/abdennour/B6vGG/3/