Jump to page: 1 2 3
Thread overview
Html işler kütüphane
Dec 04, 2016
erdem
Dec 05, 2016
erdem
Dec 05, 2016
erdem
Dec 06, 2016
erdem
Dec 06, 2016
erdem
Dec 06, 2016
erdem
Dec 06, 2016
erdem
Dec 08, 2016
erdem
Dec 10, 2016
erdem
Dec 11, 2016
zafer
Dec 11, 2016
erdem
Dec 12, 2016
zafer
Dec 13, 2016
erdem
Dec 24, 2016
erdem
Dec 25, 2016
zafer
Dec 25, 2016
erdem
Dec 25, 2016
erdem
Dec 27, 2016
zafer
Dec 27, 2016
erdem
Dec 28, 2016
erdem
Dec 28, 2016
zafer
Dec 29, 2016
erdem
December 04, 2016

http://ddili.org/forum/post/12299

adresinde konuştuğumuz konuya kimse yanıt yazmamış.

Ben de bu arada html işler bir kütüphane yazması denemesi yaptım.

import std.stdio;
import std.format;
import std.array : replicate;

class Kiraz
{
   private int no =  0;
   private int sayaç;
   private int elemanSayısı;
   private int[] kök;
   private Dal[] dallar;

   this (int n)
   {
       elemanSayısı = n;
       sayaç = n;

       kök = new int[n];
       dallar =  new Dal[n];

       for(int i = 0; i < n; ++i)
       {
           kök[i] = i;
       }

   }

   private int bul(int i)
   {
       while (i != kök[i])
           i = kök[i];
       return i;
   }


   void bağla(int ilk, int ikinci)
   {
       int ilkDal = bul(ilk);
       int ikinciDal = bul(ikinci);
       if (ilkDal == ikinciDal)
           return;
       kök[ilkDal] = ikinci;
       --sayaç;
   }


   void ekle(string isim, int derinlik)
   {


       if (no == 0)
       {
           dallar[no].no = no;
           dallar[no].isim = isim;
           dallar[no].derinlik = derinlik;
           writeln("İlk kez ekliyorum");

       }
       else
       {
           dallar[no].no = no;
           dallar[no].isim = isim;
           dallar[no].derinlik = derinlik;
           writeln("Başka dallar ekliyorum");


           if (dallar[no-1].derinlik < dallar[no].derinlik)
           {
               writeln("alt dal");
               bağla(dallar[no].no, dallar[no-1].no);
               dallar[no].üstDal = dallar[no-1].no;
               dallar[no-1].dallar ~= dallar[no].no;

           }
           else if (dallar[no-1].derinlik == dallar[no].derinlik)
           {
               writeln("yan dal");
               if (dallar[no - 1].üstDal != -1)
               {
                   bağla(dallar[no].no, dallar[no - 1].üstDal);
                   dallar[no].üstDal = dallar[no - 1].üstDal;
                   dallar[dallar[no].üstDal].dallar ~= dallar[no].no;
               }

           }

       }

       writeln("Dallarımız = ");

       foreach (eleman; dallar)
           writeln (eleman);

       ++no;
   }

   override string toString() const
   {
       string dönen;

       for(int i = 0; i < elemanSayısı; ++i)
       {
           dönen ~= format("%2s", i);
       }

       dönen ~= '\n';


       string çizgi = " -".replicate(elemanSayısı);
       dönen ~= çizgi;
       dönen ~= '\n';

       for(int i = 0; i < elemanSayısı; ++i)
       {
           dönen ~= format("%2s", kök[i]);
       }
       dönen ~= '\n';
       return dönen;

   }

}

struct Dal
{
   string isim;
   int derinlik;
   int no;
   int üstDal = -1;
   int[] dallar;

   string toString() const
   {
       string dönen;
       dönen ~= format("İsim = %2s Derinlik = %2s Üst Dal = %2s Dallar = %2s", isim, derinlik, üstDal, dallar);
       return dönen;
   }
}

void main()
{
   string html =
       `<ul id="meyveler">
        <li class="elma">Elma</li>
        <li class="portakal">Portakal</li>
        <li class="incir">İncir</li>
        </ul>`;

   /+
   ul 0
   li 1
   li 1
   li 1
   +/

   Kiraz kiraz = new Kiraz(4);
   kiraz.ekle("ul", 0);
   writeln(kiraz);
   kiraz.ekle("li", 1);
   writeln(kiraz);

   kiraz.ekle("li", 1);
   writeln(kiraz);

   kiraz.ekle("li", 1);
   writeln(kiraz);
}

Şimdi asıl soru şu bu şekilde bir sınıfa geçilen html kodundan

        <ul id="meyveler">
        <li class="elma">Elma</li>
        <li class="portakal">Portakal</li>
        <li class="incir">İncir</li>
        </ul>

'{ ul 0, li 1, li 1, li 1} 'gibi elemanların derinliklerini gösteren bir ifadeyi nasıl elde edebiliriz. Biz bu ifadeyi gördüğümüzde hemen diyoruz ki meyveler en dışta.

Bu arada sınıf için ağaç veri yapısı oluşturmaya çalıştım. Elemanların derinliğine göre eklenmesi isteniyor.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 04, 2016

Ağaç yapısı oluşturmanın en kolayı, dalları ve düğümleri aynı türden yapmaktır. Düşününce, zaten her düğümün de aslında bir ağaç olduğu görülüyor. Benim çok uyduruk deneysel bir projemde öyle:

https://github.com/acehreli/alibum/blob/master/html.d

Genel olarak, web kütüphanelerinde Adam Ruppe'nin kütüphanelerinin işe yaradığını duyuyorum. Kendisi bunları profesyonel olarak da kullanıyor. En azından fikir alınabilir:

https://github.com/adamdruppe?tab=repositories

ekle() işlevini yazmanın en kolay (ama bazen kafa karıştırabilen) yolu, her ağaç işlevinde olduğu gibi özyineleme kullanmaktır. Yapman gereken, hangi çocuğa gideceğini bulmak ve o çocuğa 'ekle(derinlik - 1)' demektir. Ama senin bir sorunun, çocuğu baştan söylemiyor oluşun. Dolayısıyla, en üst düzeye "şu derinliğe ekle" demek belki de doğru tasarım değil. (?)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 05, 2016

Sanırım haklısınız ağaç veri yapısını sınıftan ayırmak daha iyi bir fikir gibi gözüküyor.

Bahsettiğiniz kütüphaneyi inceledim.

   auto içerik = getContent("http://www.biradres.com");

   auto kütük = File("deneme.html", "w");
   kütük.rawWrite(içerik.data);
   kütük.close();

   kütük = File("deneme.html", "r+");
   kütük.writeln("\n");

   kütük.writeln("<html>");

Şimdi veriyi ubyte[] olarak alıyorum. Kütüğe yazıyorum.

arsd.dom kütüphanesi'nin en başa html etiketleri yazılmadan verileri işleyemediğini farkettim. Bu nedenle kütüğün sonuna ve başına gibi etiketler yazmak gerekiyor.

Ama sorun şu ki bu şekilde yazınca baştan bazı karakterleri yiyor. Örneğin:

<html>
s="sectionedit1" id="Arduino_baslangıc">Arduino başlangıç</h1>
<div class="level1">

Olmasını temenni ettiğimiz

<html>
<h1 class="sectionedit1" id="Arduino_baslangıc">Arduino başlangıç</h1>
<div class="level1">

Bunu önlemenin bir yolu var mı acaba.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 05, 2016

Tamam Ali bey şimdi hallettim.

   string veriler;
   veriler ~= `<html>`;
   veriler ~= `<head>`;
   veriler ~= `</head>`;
   veriler ~= `<body>`;

   while (!kütük.eof())
   {
       veriler ~= (strip(kütük.readln()));
       veriler ~= '\n';

   }

   veriler ~= `</body>`;

Ben de ilkönce html başlık kısmını bir dizgiye ekledim.

Verileri ubyte[] olarak almak için bu kütüphaneyi kullanıyorum.

https://github.com/ikod/dlang-requests

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 05, 2016

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 05, 2016

Çözdüğüne sevindim. :) Anladığım kadarıyla o kütüphane bu işle ilgilenmiyor; amaçları request/response. O yüzden vs. için olanak sunmamışlar (galiba).

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 06, 2016

Peki Ali bey örnek olsun diye şu şekilde bir .txt dosyamız var.
Alıntı:

>

h2:class id
span:
img:class id src

   auto kütük = File("veri/wiki_temizle.txt", "r");

   foreach (satır; kütük.byLine())
   {
       string isim;
       string özellik;

       formattedRead(satır, " %s: %s", &isim, &özellik);
       writeln("İsim = ", isim);
       writeln("Özellik = ", özellik);
   }

Ben bu ikinci dizgeyi parçalayınca yapmak istediğimi sanırım yapabiliyorum. Ama biraz da öğrenmek için soruyorum.

Burada formattedRead'e 'string' yerine 'string[]' ya da 'string[string]''e de okuma yaptırabilirmiydik.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 06, 2016

Bir de ilginç bir şekilde range error hatası alıyorum.

'core.exception.RangeError@temizle.d(35): Range violation'

struct Eleman
{
   string isim;
   string[] özellikler;
}


Document sayfaTemizle(Document belge)
{
   auto kütük = File("veri/wiki_temizle.txt", "r");
   Eleman[] elemanlar;

   uint i = 0;
   foreach (satır; kütük.byLine())
   {
       string isim;
       string veri;

       formattedRead(satır, " %s: %s", &isim, &veri);
       string[] özellikler =  veri.split();
       writeln("İsim = ", isim);
       writeln("Veri", veri);
       writeln("Özellikler = ", özellikler);
       elemanlar[0].isim = "ahmet"; <-- burası hata veriyor

       // elemanlar[i].isim = isim;
       // elemanlar[i].özellikler = özellikler;
       writeln("i =", i);
       ++i;
   }
  /* ... */
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 06, 2016
struct Eleman
{
   string isim;
   string[] özellikler;
}


Document sayfaTemizle(Document belge)
{
   auto kütük = File("veri/wiki_temizle.txt", "r");
   Eleman[] elemanlar;

   uint i = 0;
   foreach (satır; kütük.byLine())
   {
       string isim;
       string veri;
       Eleman eleman;

       formattedRead(satır, " %s: %s", &isim, &veri);
       string[] özellikler =  veri.split();
       eleman.isim = isim;
       eleman.özellikler = özellikler;
       elemanlar ~= eleman;
       ++i;
   }

   foreach (eleman; elemanlar)
   {
       writeln ("isim = ",  eleman.isim);
       writeln ("özellikler = ", eleman.özellikler);
   }

   auto h2 = belge["h2"];
   foreach (başlık; h2)
   {
       başlık.removeAttribute("class");
   }
   return belge;
}

Bu çalıştı. :-) Ama bu verileri eleman yapısına atmanın daha kolay bir yolu var mı acaba.

Bir de bir önceki hata iletisi vermesi normal mi.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 06, 2016

Alıntı (acehreli):

>

formattedRead, formattedWrite'ın yazabildiği çoğu şeyi (herşeyi?) okumalı:

> import std.stdio;
> import std.format;
>
> void main() {
>     string[] dizi;
>     string satir = `[ "abc", "xyz" ]`;
>     formattedRead(satir, "%s", &dizi);
>     writeln(dizi);
> }
> ```

>

Peki Ali bey iki tane değişken olursa.


import std.stdio;
import std.format;

void main() {
string isim;
string[] dizi;

string satir = [ "h2:class id", "span:" ];
formattedRead(satir, " %s: %s", &isim, &dizi);
writeln(dizi);
}



Bu şekilde derlemeye çalışınca bu hatayı alıyorum.

'std/conv.d(3390): Can't parse string: "[" is missing'

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
« First   ‹ Prev
1 2 3