ESA 2012.A2 Zeichen-Ketten, String-Codierungen, Tool Erstellung

Informatik ist die Wissenschaft von der systematischen Verarbeitung von codierten Informationen ( siehe z.B. de.wikipedia: Informatik ). Weltweit sind Zeichen-Codierungen, Zeichen-Ketten und Zeichen-Darstellungen von grundlegender Bedeutung. Sinn ( Pragmatik ) entsteht im Interpretieren.

Das zu erstellende Toolchen 2 kann "Zeichen-Manipulationen" genannt werden und soll in vielfältiger Weise Zeichen anzeigen, mit Stringfunktionen veränder und anwendungsbezogen manipulieren können. Zeichen-Manipulationen können bei Fragen zur Codierung von Schriftzeichen und deren Darstellungen und den eingebauten ECMAScript-String-Funktionen recht hilfreich ein.

Dieser Seite hier enthält auch eingestreute Code-Beispiele, die lediglich als Hinweis gedacht sind, diese können als ungeprüfte Hinweise durchaus fehlerhaft und verbesserbar sein.

Diese Aufgabe 2 baut auf dem vorher erstellten "Grundtool" auf und beinhaltet

  1. die Weiterentwicklung der Tool-Oberfläche aus Aufgabe 1 zu einem "Zeichen-Manipulationen"-Toolchen. Als Merkregel gilt:
  2. die Erstellung einer Browser-Vorschau für den Quelltext von "TA0"
  3. die Erstellung von wieder-verwendbaren ECMAScript-Bibliotheken aus globalen Daten-Funktions-Sammlungen. Konkret werden erstellt:
  4. die interaktive Generierung von Unicode-Böcke
  5. die Umwandeln von Zeichenketten, wie z.B. String in Zahlen und umgekehrt
  6. das Sortieren von Text-Zeilen (numerisch und alphanumerisch)

Genaueres kommt weiter unten.

Zu 1: Content-Übertragung zwischen Textareas Texte austauschen

Zwischen die textarea's "TA0" und "TA1" wird eine horizontale Zeile mit 3 a-Tags eingefügt, die
a) mit dem "TA0"-Content den "TA1"-Content überschreiben,
b) den "TA0"-Content und den "TA1"-Content vertauschen,
c) mit dem "TA1"-Content den "TA0"-Content überschreiben. Als innerHTML der a-Tags werden die folgenden Unicode-Zeichen ( ↓   ↑↓   ↑ )verwendet, etwa:

<a href="javascript:void(0);" onclick="set_string('TA1',get_string('TA0'));"> ↓ </a>&nbsp;
<a href="javascript:void(0);" onclick="???"> ↑↓ </a>&nbsp;
<a href="javascript:void(0);" onclick="???"> ↑ </a>&nbsp;
Zu 1: Sichtbarkeiten ein/aus-schalten Wie wird toggle() das gemacht?

Die Steuerung der Sichtbarkeiten ist ein mächtiges Desing-Verfahren, das insbesondere bei modless Dialogen verwendet wird. Auch wenn ein Element (DOM-Objekt) unsichtbar ist, so bleiben doch die Daten des Objektes erhalten.

Zwischenduch befragende mentale Hinweise: Bei Events, die durchaus zeitversetzt auftreten, ist auf eine interne "Restrukturierung" zu achten! Was meint das wohl? Auf welchen Objektzustand greift dann eine Funktion zu?

Hat z.B. ein (div-) Element id='ziel_id', so soll durch einen Klick auf [+] ( "+ = mehr = sichtbar gewünscht" ) in ein [-] ( "- = weniger = unsichtbar gewünscht" ) gewandelt werden.
Das vorher unsichtbare Element id='ziel_id' wird mit [+] - Klick sichtbar geschalten.
Das vorher sichtbare Element id='ziel_id' wird mit [-] - Klick unsichtbar geschalten. Es wird ein a-Tag mit onclick verwendet, etwa

<a href="javascript:void(0)" onclick="toggle(['ziel_id',this])"><em>[+]</em>on/off-Umschaltung</a>

Die nachfolgende Funktion toggle(['ziel_id',this]) ermöglicht die Umschaltung (sichtbar/unsichtbar). Werden stets die default-Werte visu = 'block'; s1 = '[-]'; s2 = '[+]'; verwendet, so können bei dem Aufruf diese Parameter weggelassen werden, etwa toggle(['ziel_id', this])

Für a_delegate wird ein Array verwendet, um auch mehrere a-Tags, die an verschiedenen Stellen des Bildschirmes die 'ziel_id' umschalten könnten, benachrichtigen zu können. In diesem Fall erhalten diese a-Tags eine eigene id, wie z.B. toggle(['ziel_id','a_id0','a_id1','a_id2'])

Hier ist eine Funktion (selbsterklärend):

function toggle(a_delegate, visu, s1, s2) { 
  var i, a, arr = [ ];
  for( i = 0; i < a_delegate.length; i += 1) { a = a_delegate[i]; 
    if(typeof a === 'string') { a = document.getElementById(a_delegate[i]); }
    if( a ) { arr.push(a); } else { alert("ERR: toggle(["+a+"? ...]"); return; }
  }
  visu = visu || 'block'; s1 = s1 || '[-]'; s2 = s2 || '[+]'; // default-Werte
  for( i = 1; i < arr.length; i += 1) { s = arr[i].innerHTML; 
    if (s.indexOf(s2) === -1) {            // s2 ist nicht in s
      arr[i].innerHTML = s.replace(s1,s2); if(i === 1) {arr[0].style.display = 'none';}     
    } else {                               // s2 ist in s
      arr[i].innerHTML = s.replace(s2,s1); if(i === 1) { arr[0].style.display = visu;}
    }
  }
}

Die Funktionen toggle() und popup() kommen (später) in die visu-Bibliothek.

Zu 1: Sichtbar/Unsichtbar schalten der "TA1" Wie wird toggle() verwendet?

Vor "TA1" kommt das a-Tag:

<a class="float_right" href="javascript:void(0)" onclick="toggle(['TA1',this])"><em>TA1[-]</em></a>
Zu 1: zwei-stufiges Menu Wie wird das mit toggle() gemacht?

Bei dieser Aufgabe gibt es zahlreiche Funktionalitäten und damit zahlreiche Menü-Auswahlmöglichkeiten. Damit die Übersicht nicht verloren geht, wird ein Haupt-Menü umd mehrere Unter-Menüs verwendet. Haupt-Menü etwa

Vorschau [+] Code-Muster [+] Uni-Code [+] Uni-Zeichen [+] Funktionen [+] Zeichen [+] Sortieren

das die Sub-Menüs sichtbar/unsichtbar schaltet. Zu jedem Haupt-Menü-Punkt gehört ein Tag

<a href="javascript:void(0)" onclick="toggle(['ziel_id',this])"><em>[+]</em>ziel-name</a>

Zu 1: Was steht dann etwa im HTML-body? Wie sieht <div id="nav">...</div> au?

Hier kommt ein ungeprüftes Code Snippet, das lediglich der Orientierung dient.

Code Snippet: lediglich zur Orientierung
  1. <div id="nav">
  2.   <div class="w99 blau"><dfn> Menu-Auswahl</dfn>
  3.     <a href="javascript:void(0)" onclick="popup (get_string('TA0'));"> Vorschau  </a>
  4.     <a href="javascript:void(0)" onclick="toggle(['MENU_MUSTER',     this])">   <em>[+]</em> Code-Muster </a>
  5.     <a href="javascript:void(0)" onclick="toggle(['MENU_UNICODE',    this])">   <em>[+]</em> Uni-Code    </a>
  6.     <a href="javascript:void(0)" onclick="toggle(['MENU_UNIZEICHEN', this])">   <em>[+]</em> Uni-Zeichen </a>
  7.     <a href="javascript:void(0)" onclick="toggle(['MENU_FUNKTIONEN', this])">   <em>[+]</em> Funktionen  </a>
  8.     <a href="javascript:void(0)" onclick="toggle(['MENU_ZEICHEN_TRANSF',this])"><em>[+]</em>Zeichen-Transf</a>
  9.     <a href="javascript:void(0)" onclick="toggle(['MENU_SORTIEREN',  this])">   <em>[+]</em> Sortieren   </a>
  10.  
  11.   </div><div id="MENU_MUSTER" style="display:none"><dfn>Code-Muster-Auswahl</dfn>
  12.    <a href="javascript:void(0)" onclick="set_string('TA0',unescape('%3Ch1%3E%20Policy ...'));">Policy ↓</a>
  13.    <a href="javascript:void(0)" onclick="alert('???');">???HTML 5</a>
  14.  
  15.   </div><div id="MENU_UNICODE" style="display:none"><dfn>Uni-Code-Wahl</dfn>
  16.     <a href="javascript:void(0)" onclick="set_string('TA0',build_unicode(0x0001,0x007F));">Basis-Lateinisch </a>
  17.     <a href="javascript:void(0)" onclick="set_string('TA0',build_unicode(0x0080,0x00FF));">Lat-1, Ergänzung </a>
  18.     <a href="javascript:void(0)" onclick="set_string('TA0',build_unicode(0x0100,0x017F));">Lat-1, erweitert-A </a>
  19.     <a href="javascript:void(0)" onclick="set_string('TA0',build_unicode(0x0180,0x024F));">Lat-1, erweitert-B </a>
  20.  
  21.   </div><div id="MENU_UNIZEICHEN" style="display:none"><dfn>Uni-Zeichen-Wahl</dfn>
  22.     <a href="javascript:void(0)" onclick="set_unicode_zeichen('DIV_CONTENT',0x0001,0x007F,'');">Basis-Lateinisch </a>
  23.  
  24.   </div><div id="MENU_FUNKTIONEN" style="display:none"><dfn>Funktionen-Auswahl</dfn>
  25.     <a href="javascript:void(0)" onclick="alert('???');">???</a>
  26.     <a href="javascript:void(0)" onclick="alert('???');">???</a>
  27.  
  28.   </div><div id="MENU_ZEICHEN_TRANSF" style="display:none"><dfn>Zeichen-Transformation</dfn>
  29.     <a href="javascript:void(0)" onclick="alert('???');">???</a>
  30.     <a href="javascript:void(0)" onclick="alert('???');">???</a>
  31.  
  32.   </div><div id="MENU_SORTIEREN" style="display:none"><dfn>Sortiere</dfn>
  33.     <a href="javascript:void(0)" onclick="alert('???');">???</a>
  34.     <a href="javascript:void(0)" onclick="alert('???');">???</a>
  35.   </div>
  36. </div>
Zu 1: Design und Styles? Wie CSS einsetzen?

Bei zahlreichen HTML-CSS-Design-Aufgaben (wie z.B. hier) ist ein Arbeiten mit "float" günstig, z.B. wenn inline-Text-Punkt (jeder) in einen Rahlen fester Längen soll, oder wenn Marker ganz recht sichtbar ein sollen. Hier grobe, ungeprüfte Vorschläge:

form, div {clear: both;}
div > em {float: left; width: 100px; 
          vertical-align: text-bottom; 
          margin: 1px; padding: 3px 1px; 
          font: 14px/15px 'Courier New',monospace !important;
}
div a em { float: left; background-color: #191999; color:#fff; 
           font: 14px/17px 'Courier New',monospace !important;
}
dfn {float: right;}

.float_left { float: left;}
.float_right { float: right;}
.float_clear { clear: both !important;}

.pre_uni_zeichen { font-size:24px; 
 font:bold 24px/26px 'Courier New',monospace;
 min-width:25px; line-height:25px;
 vertical-align:middle; text-align:center;
 margin:1px; border:3px inset #ccf;
 background-color:#191999; color:#fff;
}
Zu 2: Erstellung einer Browser-Vorschau Wie wird popup() entwickelt?

Der Multiline-Text von "TA0" soll mit popup(get_string('TA0')) als Browser-Vorschau in einem popup-Fenster erscheinen. Ein script-Tag wird ausgeführt. Styles werden interprtiert. Ein HTML-Seiten-Quelltext erscheint als Browseransicht. Die Funktion popup() ist zu schreiben und kann dann etwa so aufgerufen werden:

<a href="javascript:void(0)" onclick="popup(get_string('TA0'));"> Vorschau </a>

Die Funktionen toggle() und popup() gehören in die visu-Bibliothek.

Die Funktion popup() kann in 2 Arten aufgerufen werden. a) wenn der str-Quelltext mit popup(str) als Browser-Vorschau angezeigt werden soll, oder b) wenn eine url-Seite im popup-Fenster popup(null,url) angezeigt werden soll.

Die globale Variable var hwin; ist außerhalb der popup-Funktion, damit bei einem öffnenden popup-Fenster das vorherige popup-Fenster geschlossen wird. Es gibt somit stets höchstens ein Popup-Fenster.

Code Snippet: Browservorschau
  1. var hwin = null;
  2.  
  3. function popup (str, url, o) { //aufruf: .popup(str) oder .popup(null,url)
  4.   url = url || null; o = o || { top: 0, left: 150, width: 800, height: 600 };
  5.   flags=["toolbar=no,dependent=yes,location=no,directories=no,",
  6.          "status=no,menubar=no,scrollbars=yes,resizable=yes,top=",
  7.           o.top, ",left=", o.left, ",width=", o.width, ",height=", o.height].join('');
  8.   if (hwin && !hwin.closed) { hwin.close(); }
  9.   hwin = null;
  10.   if (url) { hwin = win.open(url, "popup", flags);
  11.   } else if (!str) { return;
  12.   } else { hwin = win.open("", "popup", flags); hwin.document.write(str);
  13.   }
  14.   if (hwin) {
  15.     if (hwin.opener)   { hwin.opener = win.self; }
  16.     if (hwin.focus)    { hwin.focus(); }
  17.     if (hwin.document) { hwin.document.close(); }
  18.   }
  19. }
Hinweis zu 3: Wandle globale Funktionen in Bibliotheksfunktionen Allgemeine Beschreibung

Es gibt zahlreiche Möglichkeiten, wie Bibliotheken erstellt werden. Hier wird eine robuste Möglichkeit beschrieben. Die Funktionen und Daten werden in einen privaten Bereich, d.h. im Namespace-Objekt dom, gekapselt Es wird das folgendes Scenario angenommen:

  1. Einige eigene Funktionen werden im globalen Kontext und mit den globalen Daten entwickelt und getestet, etwa
    var win = window, doc = win.document;
    function f0 (x, y, z) { /* f0 verwendet intern win, doc, x,y,z */ }
    function f1 ( o )     { /* f1 verwendet intern win, doc, o */ }
    function f2 (   )     { /* f2 verwendet intern win und doc */ } ...
    
  2. Im globalen Kontext kann jede Funktion die globalen Werte win und doc verwenden.
  3. Im globalen Kontext kann jede Funktion eine andere globale Funktion aufrufen.
  4. Bei HTML-Seiten wird das globale window-Objekt und (davon abgeleitet) das Dokument-Objekt var doc = window.document; verwendet.
  5. Wie wird nun daraus eine (Funktions-) Bibliothek, die "möglichst alles" in einem privaten Bereich kapselt?
  6. Als Name für den Objekt-Namespace (= erzeugtes Objekt der Methoden) werde dom verwendet.
  7. Am Anfang der globalen Funktionssammlung wird das
    var win = window, doc = win.document;
    ersetzt durch
    var dom = (function (win) { var  doc = win.document;
    Am Ende der globalen Funktionssammlung wird angefügt
      return {f0:f0, f1:f1, f2:f2};
    } (window));
  8. Wie sieht der Code für die dom-Bibliothek dann aus? Etwa
    var dom = (function (win) { var doc = win.document;
      function f0 (x, y, z) { /* f0 verwendet intern win, doc, x,y,z */ }
      function f1 ( o )     { /* f1 verwendet intern win, doc, o */ }
      function f2 (   )     { /* f2 verwendet intern win und doc */ } 
      return {f0:f0, f1:f1, f2:f2};
    } (window));
    
    typeof dom ist 'object'.
Hinweis zu 3: Erklärungen zum Bibliothek-Muster ( Was bedeutet das ) ?

Was meint ( function() {...} ) ? Die Außenklammerung der Funktion bewirkt, daß die Ausführung der Funktion ohne Wirkungen auf den Kontext ist.

Bei der initialisierenden Funktion-Ausführung infolge der (window)-Argument-Aufrufklammer kommt die globale window-Referenz als win-Parameter in den privaten Bereich hinein.

var dom = (function (win) { var  doc = win.document;

/* privater Bereich für Funktionsdeklarationen mit win und dom */

return {/*objekt als rückgabe-Objekt, das dom zugewiesen wird*/};
} (window));

Im privaten Bereich von dom wird nun win anstelle von window verwendet. Am Ende der initialisierenden Funktion-Ausführung für das dom-Objekt gibt return ein Objekt zurück, etwa

return {/*objekt als rückgabe-Objekt, das dom zugewiesen wird*/};

das dann nach der Initialisierung wegen var dom = ... ein Namespace-Objekt ist.

Hinweis zu 3: Wieviele Bibliotheken? Wie werden die Bibliotheken benannt?

Hier geht es um noch zu schreibende Bibliotheken. Wie sollte das Bibliothek-Software-Design aussehen? Wieviele ECMAScript-Bibliotheken werden gebraucht? Es könnte z.B. eine einzige, umfangreiche Bibliotheken konzipiert werden, die alle Funktionen aufnimmt. Es können aber auch z.B. viele kleine Bibliotheken konzipiert werden, die nur bei Bedarf includiert werden. Wieviele Bibliotheken werden gebraucht? Wieviele Funktionen je Bibliothk sind günstig? Wie werden die Bibliotheken erstellt?

Unter Berücksichtigung der bisherigen Erfahrungen wird das folgende Erstellungsverfahren vorgeschlagen. Jede Bibliothek soll klein, robust, einfach erweiterbar und gut verwendbar sein. Zur besseren Übersicht soll der Objektname (Namespace) auch als Dateiname.js verwendet werden. Die folgenden "Includes" eines Toolchens würden dann auf die Nutzung hinweisen.

Zu 3: Erstellung der daten-Bibliothek Schreibe die Datei daten.js

Das Vorgehen zum Erstellen einer Bibliothek wurde oben beschrieben. Anstelle der Funktionen f0(), f1(), f2() werden für die daten-Bibliothek die Funktionen set (key, o) und get (key) verwendet. Die daten-Bibliothek wird später durch "gute localStore Funktionen" erweitert. Wie sieht diese daten-Bibliothek dann zunächst etwa aus?

var daten = (function ( ) { 
  var data_objekte = { }; // privat
  function set (key, o) {        data_objekte[key] = o; }
  function get (key)    { return data_objekte[key]; }
  return {set:set, get:get};
} ());

Dieser Code wird in der Datei /tools/incl/daten.js gespeichert.

Zum Benutzen kann der ECMAScript-Code mit

<script type="text/javascript" src="./incl/daten.js"></script>

im Header der HTML-Seite includiert werden. Steht die Bibliotkek zur Verfügung, so können Pattern-Muster oder andere Daten auch übersichtlich ausgelagert werden, wie z.B. mit

daten.set('Policy für Präsentation', '%3Ch1%3E%20Policy...');

Bitte beachten! Der Key (hier 'Policy für Präsentation') darf Leerzeichen und Uni-Code-Zeichen enthalten und kann somit die Daten gut beschreiben.

Key's sollten eindeutig sein. Z.B. bei
daten.set('key1', 'uvw') und irgendwo nachfolgend
daten.set('key1', 'xyz')
wird die 'uvw'-Zeichenkette durch 'xyz' überschrieben.

Wie werden die hinterlegten Daten, wie z.B. daten.set('Policy für Präsentation', '%3Ch1%3E%20Policy...'); verwendet? Es gibt zahlreiche Wiederverwendungsarten und Möglichkeiten, im HTML-Body etwa

<a href="javascript:void(0)"
   onclick="set_string('TA0',unescape(daten.get('Policy für Präsentation')));">
   Policy ↓
</a>
Zu 3: Erstellung der dom-Bibliothek Schreibe die Datei dom.js

Das Vorgehen zum Erstellen der dom-Bibliothek wurde oben beschrieben. Anstelle der Funktionen f0(), f1(), f2() werden die Funktionen get_node (id), get_string (id), set_string (id, str) verwendet. Dies ergibt etwa die Bibliothek

var dom = (function (win) { "use strict";
  var  doc = win.document;
  function get_node (id)        { ... }
  function get_string (id)      { ... }
  function set_string (id, str) { ... } 
  return { get_node:get_node, get_string:get_string, set_string:set_string };
} (window));

Bevor der ECMAScript-Code ( ohne umschließendes <script>...</script> - Tag ) in der Datei /tools/incl/dom.js gespeichert wird, ist der Quellcode mit Hilfe von JSLint ( JavaScript Code Quality Tool) und "use strict"; zu untersuchen, zu verbessern.

Ein "Self-made-Toolchen" includiert die ./incl/dom.js - Bibliothek im Header

 

<script type="text/javascript" src="./incl/dom.js"></script>

Wo vorher im Toolchen globale Funktion

  get_node   (...);
  get_string (...);
  set_string (...);

aufgerufen wurden ...

... werden nun die includierte Bibliotheksfunktionen

  dom.get_node   (...);
  dom.get_string (...);
  dom.set_string (...);

aufgerufen.

Zu 3: Erstellung der visu-Bibliothek visu meint visuell

Die visu-Bibliothek tools/incl/visu.js soll zunächst ledig die Funktion toggle(...) und popup() enthalten. Die visu-Bibliothek wird später weiter erweitert. toggle soll die Sichtbarkeitsänderung von id='id_dst' bewirken. dst steht für "Ziel-Element" (Destination). Es ist eine visu-Bibliothek ( tools/incl/visu.js ) mit der Funktion toggle zu schreiben.

Beim Toolchen 2 ( Zeichen-Manipulationen ) ist dann im HTML-Header tools/incl/visu.js zu includieren. Das a-Tag soll unmittelbar vor der Textarea "TA1" stehen.

<a href="javascript:void(0)" onclick="visu.toggle(this,'TA1');">[-]</a>
Zu 4: Generierung von Test-Zeichen Zeichen 1,2,...,255 in "TA0"

Um Verschlüsselungsverfahren z.B. mit den Zeichen zu 1, 2, 3, ..., 32, 33, ..., 255 zu testen, werden diese Zeichen in "TA0" gebraucht. Schreiben und testen sie eine Funktion "alle_8_bit_zeichen", die den erzeugten String ta0 in "TA0" schreibt.

 // nicht getestet:
var i, i1 = 1; i2 = 255, ta0 = ''; 
for(i = i1; i < i2; i += 1) {
  ta0 += String.fromCharCode(i);
}

Warum wird i = 0 weggelassen?

Zu 5: Generierung von Unicode-Zeichen Zeichen darstellen

Zahlreiche Unicode-Zeichen können als "Icon-Ersatz" dienen. Gebraucht werden z.B. grafische und mathematische Zeichen (siehe de.wikipedia Unicode-Böcke ).

Die Funktion set_unicode_zeichen(id_dst, i1, i2) soll lediglich solche Unicode-Zeichen vergrößert in ein div mit id="DIV_CONTENT" schreiben. Das gewünschte Zeichen kann dann herauskopiert werden.

function set_unicode_zeichen(id_dst, i1, i2, style) { // für Ausgabe in div
  style = style || 'pre_uni_zeichen w30';
  var i, arr = [ ], span1="<span class='"+style+"'>", span2="</span>", 
  div = document.getElementById(id_dst);
  for (i = i1; i <= i2; i += 1) { 
    arr.push(span1); 
    arr.push(String.fromCharCode(i)); 
    arr.push(span2); 
  } // div.style.display = 'block'; div.className = "my_cs_class1 my_class2";
  div.innerHTML = arr.join(' ');
}
Zu 4: Generierung von Unicode-Blöcken Code darstellen

Die Funktion build_unicode(i1, i2) soll eine Zeichenkette erstellen, der die Unicode-Zeichen von i1 bis i2 enthält. Welche Zeichen kann der Browser derzeit darstellen? Wie kann die Code-Zahl Bsp: \u0041 und die benummerte Zeichendarstellung für HTML erhalten werden?

function build_unicode(i1, i2) { // für textarea
var i, step = 1, arr = [ ];
for (i = i1; i <= i2; i += step) {
    arr.push('\n');
    arr.push(String.fromCharCode(i)); // dargestelltes Zeichen
    arr.push('\\u'+ ('0000'+i.toString(16)).slice(-4));// Bsp: \u0041
    arr.push('&#' + i+';');                            // Bsp: &#65;
    arr.push('&#x' + i.toString(16)+';');              // Bsp: &#x41;
  } return arr.join('  ');
}

Hier ein Aufruf-Beispiel für einen Unicode-Block. i1 ist die Start-Nummer und i2 ist die Endnummer.

<a href="javascript:void(0)" onclick="set_string('TA0',build_unicode(0x0001,0x007F));">Basis-Lateinisch </a>
Zu 5: Generierung von umschlossenen-Unicode-Zeichen ➀➁➂➊➋➌

Der Array a enthält Paare aus Anfang-/End-Index für umschlossenen-Unicode-Zeichen. Diese Zeichen sind in div id="DIV_CONTENT" auszugeben.

var i, j, ta1='', // nicht geprüfter ECMAScript-Code:
    a = [0x2460,0x2473,0x2780,0x2793,0x3251,0x325F,0x32B1,0x32BF];
for( j = 0; j < a.length-1; j += 2) {
  for( i = a[j]; i < a[j+1]; i += 1) {
    ta1 += String.fromCharCode(i);
  }
}
Zu 4: XHTML-Entities Code darstellen

Im DOCTYPE einer XHTM-Seite steht http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd. Mit Hilfe dieser Datei sind die Dateiel lat1.ent, special.ent, symbol.ent auffindbar, die die benamten HTML-Entities enthalten.

http://www.w3.org/TR/xhtml1/dtds.html#dtdentry_xhtml1-strict.dtd_HTMLlat1
http://www.w3.org/TR/xhtml1/dtds.html#dtdentry_xhtml1-strict.dtd_HTMLsymbol
http://www.w3.org/TR/xhtml1/dtds.html#dtdentry_xhtml1-strict.dtd_HTMLspecial

Das folgende, ungeprüfte Objekt enthält diese Zuorgnungen.

var xhtml_entities = { '160':'nbsp','161':'iexcl','162':'cent','163':'pound','164':'curren','165':'yen','166':'brvbar', '167':'sect','168':'uml','169':'copy','170':'ordf','171':'laquo','172':'not','173':'shy','174':'reg', '175':'macr','176':'deg','177':'plusmn','178':'sup2','179':'sup3','180':'acute','181':'micro', '182':'para','183':'middot','184':'cedil','185':'sup1','186':'ordm','187':'raquo','188':'frac14', '189':'frac12','190':'frac34','191':'iquest','192':'Agrave','193':'Aacute','194':'Acirc', '195':'Atilde','196':'Auml','197':'Aring','198':'AElig','199':'Ccedil','200':'Egrave','201':'Eacute', '202':'Ecirc','203':'Euml','204':'Igrave','205':'Iacute','206':'Icirc','207':'Iuml','208':'ETH', '209':'Ntilde','210':'Ograve','211':'Oacute','212':'Ocirc','213':'Otilde','214':'Ouml','215':'times', '216':'Oslash','217':'Ugrave','218':'Uacute','219':'Ucirc','220':'Uuml','221':'Yacute','222':'THORN', '223':'szlig','224':'agrave','225':'aacute','226':'acirc','227':'atilde','228':'auml','229':'aring', '230':'aelig','231':'ccedil','232':'egrave','233':'eacute','234':'ecirc','235':'euml','236':'igrave', '237':'iacute','238':'icirc','239':'iuml','240':'eth','241':'ntilde','242':'ograve','243':'oacute', '244':'ocirc','245':'otilde','246':'ouml','247':'divide','248':'oslash','249':'ugrave','250':'uacute', '251':'ucirc','252':'uuml','253':'yacute','254':'thorn','255':'yuml','402':'fnof','913':'Alpha', '914':'Beta','915':'Gamma','916':'Delta','917':'Epsilon','918':'Zeta','919':'Eta','920':'Theta', '921':'Iota','922':'Kappa','923':'Lambda','924':'Mu','925':'Nu','926':'Xi','927':'Omicron','928':'Pi', '929':'Rho','931':'Sigma','932':'Tau','933':'Upsilon','934':'Phi','935':'Chi','936':'Psi','937':'Omega', '945':'alpha','946':'beta','947':'gamma','948':'delta','949':'epsilon','950':'zeta','951':'eta', '952':'theta','953':'iota','954':'kappa','955':'lambda','956':'mu','957':'nu','958':'xi','959':'omicron', '960':'pi','961':'rho','962':'sigmaf','963':'sigma','964':'tau','965':'upsilon','966':'phi','967':'chi', '968':'psi','969':'omega','977':'thetasym','978':'upsih','982':'piv','8226':'bull','8230':'hellip', '8242':'prime','8243':'Prime','8254':'oline','8260':'frasl','8472':'weierp','8465':'image','8476':'real', '8482':'trade','8501':'alefsym','8592':'larr','8593':'uarr','8594':'rarr','8595':'darr','8596':'harr', '8629':'crarr','8656':'lArr','8657':'uArr','8658':'rArr','8659':'dArr','8660':'hArr','8704':'forall', '8706':'part','8707':'exist','8709':'empty','8711':'nabla','8712':'isin','8713':'notin','8715':'ni', '8719':'prod','8721':'sum','8722':'minus','8727':'lowast','8730':'radic','8733':'prop','8734':'infin', '8736':'ang','8743':'and','8744':'or','8745':'cap','8746':'cup','8747':'int','8756':'there4','8764':'sim', '8773':'cong','8776':'asymp','8800':'ne','8801':'equiv','8804':'le','8805':'ge','8834':'sub','8835':'sup', '8836':'nsub','8838':'sube','8839':'supe','8853':'oplus','8855':'otimes','8869':'perp','8901':'sdot', '8968':'lceil','8969':'rceil','8970':'lfloor','8971':'rfloor','9001':'lang','9002':'rang','9674':'loz', '9824':'spades','9827':'clubs','9829':'hearts','9830':'diams','34':'quot','38':'amp','60':'lt', '62':'gt','39':'apos','338':'OElig','339':'oelig','352':'Scaron','353':'scaron','376':'Yuml','710':'circ', '732':'tilde','8194':'ensp','8195':'emsp','8201':'thinsp','8204':'zwnj','8205':'zwj','8206':'lrm', '8207':'rlm','8211':'ndash','8212':'mdash','8216':'lsquo','8217':'rsquo','8218':'sbquo','8220':'ldquo', '8221':'rdquo','8222':'bdquo','8224':'dagger','8225':'Dagger','8240':'permil','8249':'lsaquo', '8250':'rsaquo','8364':'euro'};

Schreiben sie bitte eine Funktion xhtml_entities(), die zeilenweise a) das Zeichen, b) die benumerte und c) die benamte Entity-Schreibweise des Zeichens ausgibt.

Wie sieht eine Funktion aus die alle Unicode-Zeichen möglichst in benamte Entities ersetzt?

Zu 5: Anzahl der TA0-Zeichen Zeichen-Umwandlungen Ersetzungen

Bei Zeichen-Ersetzungen und Zeichen-Umwandlungen kann sich die Zahl der Zeichen ändern. Der Sub-Menü-Eintrag "Anz Zeichen" zeigt die Anzahl der Zeichen in TA0 an.

<a href="javascript:void(0)" onclick="alert(get_string('TA0').length);">Anz Zeichen</a>
Zu 5: Wandle Text in "&#xhh;" - Text numerierte HTML-Zeichen

Submenu Zeichen-Transformationen: Im Text von TA0 kommen auch dezimale Zahlen vor. Jede Zahl kann aus mehreren Ziffern bestehen. Im Text von TA0 sollen alle dezimalen Zahlen in hex-Zahlen gewandelt und in TA1 ausgegeben werden.

 // Hinweis:
ta0 = get_string(id_ta0);
ta1 = ta0.replace(/\r/g,'').replace(/(\d+)/g,
            function(d) {
              return '\x'+parseInt(d,10).toString(16);
            }
          );

Wie kann mit .toString(?) in binär-Zahlen gewandelt werden?

Wie kann von Basis b0 = 2,3,4,...32 mit Hilfe von .parseInt(d,?) in eine Basis b1 = 2,3,4,...32 mit Hilfe von .toString(?) gewandelt werden?

Zu 5: Wandle Text in "&#xhh;" - Text numerierte HTML-Zeichen

Submenu Zeichen-Transformationen: Ein Text in "TA0" soll in numerierte HTML-Zeichen-Kette gewandelt und in "TA1" ausgegeben werden.

// nicht geprüfter ECMAScript-Code:
function get_string_bas(id_ta0, bas) { // bas = 10 oder 16
  var i, pre, ta1, ta0 s2 = '';
  if(bas===10) {pre = '&#';} else if(bas===16) {pre = '&#x';} else {return;} 
  ta0 = get_string(id_ta0); 
  ta1 = ta0.replace(/\r/g, ''); 
  for (i = 0; i < ta1.length; i += 1) {
    s2 += pre + ta1.charCodeAt(i).toString(bas) + ';';
  } return s2;
}
Zu 5: Verschlüssele Text mit XOR 43 Kryptographie
Submenu Zeichen-Transformationen:

Jedes Zeichen aus "TA0" soll mit XOR 43 verschlüsselt werden. Ergebnisstring soll in "TA1" ausgegeben werden

// nicht geprüfte Funktion:
function get_string_bas(id_ta0, n) { var ta0, ta1; n = n || 43;
  ta0 = get_string(id_ta0); 
  ta1 = ta0.replace(/\r/g,'').replace(/[\s\S]/g,
              function(c){
                return String.fromCharCode(c.charCodeAt(0)^n);
              }
            );
  return ta1;
}
Zu 5: Wandle Code in HTML-Quelltext mach &lt;...&gt; aus <...>

Soll z.B. der Code einer Programmiersprache (z.B. ECMAScript) in einer HTML-Seite erscheinen, so würde beim direkten reinkopieren von z.B. if( 3 < 4 ) { ... } in den HTML-Body das Markup-Zeichen < nicht validen HTML-Code erzeugen, d.h. die zu schreibenden Funktion code_to_html_einfach (s) und code_to_html_mit_zeilen_nummern (s) können hierfür hilfreich sein. Achtung! Die folgenden 2 Varianten sind nicht getestet.

code_to_html_einfach(s) ist eine einfache Version, die reguläre Ausdrücke und .replace() verwendet, um einen HTML-Code zurück zu liefern.

Sind Bezüge auf auf einzelne Codezeilen gewünscht, so sollte das Ergebnis mit Zeilen-Nummern versehen sein. Hierfür ist code_to_html_mit_zeilen_nummern(s) gedacht.

function code_to_html_einfach (s) {
  s = s.replace(/\046/g,'&amp;').replace(/\</g,'&lt;').replace(/\>/g,'&gt;');
  s = '\n<pre class="dir">\n' + s + '\n\<\/pre>';
  return s;
}

Code Snippet: Code für HTML-Seite
  1. function code_to_html_mit_zeilen_nummern (s) {
  2.   var i, a, post = "</li></ol>\n</pre>\n",
  3.   pre = "<pre class='code'>\n<ol><li> ",
  4.   re2 = [/\r\n/g, '\n', // MS
  5.          /\r/g,   '\n', // Apple
  6.          /^\s+/, '',    // white am Anfang
  7.          /\s+$/, '',    // white am Ende
  8.          /\&#91;/g, '[', /\&#93;/g, ']', //std-form
  9.          /\&lt;/g,  '<', /\&gt;/g,  '>', //std-form
  10.          /\&amp;/g, '&',                 //std-form
  11.          /\&/g, '&amp;',                 //ziel-form
  12.          /</g,   '&lt;',   />/g, '&gt;', //ziel-form
  13.          /\[/g, '&#91;', /\]/g, '&#93;'];//ziel-form
  14.   for (i = 0; i < re2.length; i += 2) {
  15.     s = s.replace(re2[i], re2[i+1]);
  16.   }
  17.   //                  &#160;
  18.   a = s.replace(/\x20/g,' ').split('\n');
  19.   s = pre + a.join("\n</li><li> ") + post; return s;
  20. }
Zu 6: "TA0" - Zeilenstrings sortieren aufwärts

Submenu Sortieren: Jede Zeile von "TA0" enthalte einen Zeilenstring, der auch leer sein darf. Der gesamte "TA0"-Text wird bei jedem Zeilenumbruch getrennt und erzeugt den Array arr geschrieben. Der Array arr wird sortiert und mit .join() wieder zu einem Gesamtstring zusammen gesetzt. Das Ergebnis soll in "TA1" ausgegeben werden. Nach dem Sortieren von "TA0"

Werner Abel
                  (leer)
Hans Schlaumeier

wird in "TA1"

                  (leer)
Hans Schlaumeier
Werner Abel
 // Hinweis, nicht geprüft:
var ta1, arr = get_string('TA0').split('\n'); // Zeilen-Array
ta1 = arr.join('\n'); // ta1 ist ein String

Wie kann zeilenweise abwärts sortiert werden?

Zu 6: "TA0" - Zahlen am Zeilenanfang sortieren numerisch aufwärts

Submenu Sortieren: Am Anfang jeder Zeile von "TA0" stehen dezimale Zahlen. Der gesamte "TA0"-Text wird bei jedem Zeilenumbruch getrennt und in arr geschrieben. "white-Character" unmittelbar nach jedem Zeilenanfang werden gelöscht. Der Array wird sortiert und wieder zu einem Gesamtstring zusammen gesetzt. Das Ergebnis soll in "TA1" ausgegeben werden. Nach dem Sortieren von "TA0"

123
12
21

wird in "TA1"

12
21
123

Hinweis: my_arr.sort() sortiert dem Array my_arr. Bei my_arr.sort(fn) muß die Funktion fn angeben, was als größer gilt.

 // Hinweis, nicht geprüft:
var ta1, arr = get_string('TA0').split('\n\s+'); // Zeilen-Array
arr.sort(
      function(a,b) {
        return ( parseFloat(a) - parseFloat(b));
      }
    ).join('\n');
ta1 = arr.join('\n'); // ta1 ist ein String

Wie kann numerisch abwärts sortiert werden?

Zu 7: Eingebaute String-Funktionen Anwenden von String-Funktionen auf "TA0"

ECMAScript hat unmittelbar verfügbare Stringfunktionen. Als Eingabe-String diene der "TA0"-Content. Das Ergebnis der Stringfunktion wird in "TA1" geschrieben. Hier einige Beispiele:

escape()             und  unescape(), ...
encodeURI()          und  decodeURI(), ...
encodeURIComponent() und  decodeURIComponent()

Beispiel: Wieviel Zeichen hat "äöü" bei UTF-8? Wieviele Byte hat "äöü" in einem Byte-Stream?

var win = window;
function encode_utf8 (s) {
  try { s = win.unescape(win.encodeURIComponent(s)); 
  } catch (e) { win.alert('ERR: encode_utf8()'); }
  return s;
}
function decode_utf8 (s) {
  try { s = win.decodeURIComponent(win.escape(s)); 
  } catch (e) { win.alert('ERR: decode_utf8()'); }
  return s;
}

Wichtiger Hinweis!
Diese Augabe kann vielfältiges ECMAScript-Wissen aufbauen. Studieren hat bekanntlich mit dem eigenen Wissenszuwachs zu tun. Identischen Kopien entsprechen einem zu geringen Wissenszuwachs und werden mit 0 Punkten bewertet.

Viel Freude bei der Ausarbeitung!
Letzter Abgabetermine (wie besprochen)