ldap

Honza Petrous hop na unibase.cz
Pátek Říjen 27 10:53:19 CEST 2000


> >
> > 2, Konvertnu je jednoduchym programkem do podoby "spravneho
> LDIF tvaru",
> >    tj. vsechny radky, ktere obsahuji texty se znaky > 127 konvertuju
> >    do unicode a nasledne zakoduju base64. Nakonec pridam za
> nazev atributu
> >    jeste jednu dvojtecku (coz signalizuje base64 kodovana data).
> >
> >    Takze z puvodniho 'description: blabol' (znak `a` je s carkou :-)
> >    dostanu 'description:: UGV0cm91xaE='
> >
>
> Ten "jednoduchy programek" roste kde?  ;-)
>
> Existuje neco univerzalne pouzitelneho, nebo jste si napsal skript,
> ktery vyuziva 'recode' a 'ldif' ?
>

Zde Vas asi zklamu. "Nejak historicky" se stalo, ze jsem nasedl
do jine lodi nez mainstream open source komunity, takze moje
skriptiky jsou "univerzalne pouzitelne" az po doistalaci jazyku Pike :)

Zde Vam muzu nazorne predvest tento prekodovac, ale verim, ze stejnym
zpusobem je to mozne napsat i v Perlu, Pythonu ...

/Honza

-------------- encode-ldir.pike ------------------------

#!/usr/local/bin/pike

int check8(string s) {
// Testuje, obsahuje-li retezec znak s kodem > 127

  int flg = 0;

  foreach(s/1, string n) {
    flg = (n[0] > 127);
    if(flg)
      break;
  }
  return flg;
}

int main(int argc, array(string) argv) {

  object(Stdio.FILE) fdin=Stdio.FILE();  // objekt pro bufferovany vstupni
soubor
  object(Stdio.File) fdout=Stdio.File(); // objeckt pro nebufferovany
vystupni s.
  string ln, enc;

  if(argc < 3) {
    write("Chyba: chybi argument!\n");
    return 1;
  }
  if(!fdin->open(argv[1], "r")) {  // otevre vstupni soubor pro cteni
    write("Chyba: nemuzu otevrit soubor: "+(string)argv[1]+" !\n");
    return 2;
  }
  if(!fdout->open(argv[2], "cwt")) { // otevre/vytvori vystupni soubor
    write("Chyba: nemuzu otevrit soubor: "+(string)argv[2]+" !\n");
    return 3;
  }

  while(stringp(ln=fdin->gets())) { // cte radek po radku
    if(check8(ln)) {
      array(string) hd = ln / ": "; // vytvori pole retezcu
      if (sizeof(hd)>1) {
        enc=Locale.Charset.decoder("iso-8859-2")->clear()->feed(hd[1..] * ":
")->drain();
        // prelozi hodnotu attributu do Unicode
        fdout->write(hd[0] + ":: " +
MIME.encode_base64(string_to_utf8(enc)));
	  // a nasledne enkodovane base64 ulozi do vystupniho souboru
      } else
        fdout->write(ln);
    } else
      fdout->write(ln);
    fdout->write("\n"); // doplni konec radky, o ktery jsme prisli pri
'gets'
  }
  fdout->close();
  fdin->close();

  write("\nHotovo.\n");
}

----------------------------------------------------



Další informace o konferenci Linux