Zagnieżdżanie string'a w string'u - generowanie kodu html

Zagnieżdżanie string'a w string'u - generowanie kodu html
JU
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:149
0

Witam!
Potrzebuje pomocy przy rozwiązaniu. Mianowicie:
Tworzę string index, do którego chcę wpisywać wygenerowany kod html, który generuje mój program, na podstawie danych podanych w bazie.
Zawarłem w bazie informacje, który

znajduje się w jakim <divie>.
w formie</p>
id_diva in informacja
1 0 info
2 1 info
3 1 info
4 2 info
5 0 info
6 5 info
7 5 info
itd...
mniej więcej wygląda to tak, że nie wiem w jaki sposób zagnieździć wygenerowany string
, tak, żeby wylądował on w odpowiednim miejscu, oczywiście w zawartości odpowiedniego diva:
powyższy przykład z tabelki:
(html ma id 0)
Kopiuj
<html> 
<div id="1">
   <div id="2">
      <div id="4"></div>
   </div>
   <div id="3"></div>
</div>
<div id="5">
   <div id="6"></div>
   <div id="7"></div>
</div>
</html>

Bardzo prosił bym o wsparcie - zarówno podpowiedzi w jaki sposób zagnieżdżać w string'u inny string, ale może i również wsparcie przy algorytmie.
Z góry dziękuje za pomoc.

Mrozu
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 10 lat
1

pachnie mi to kompozytem (taki wzorzec projektowy)

jak znajdziesz i nadal nie będzie wiedział jak to ugryźć to napisz

aczkolwiek zastanów się czy nie można by do tego podejść jak do budowania XMLa, wykorzystując gotowe biblioteki z .NET -> w końcu HTML to taki XML

edytowany 1x, ostatnio: Mrozu
JU
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:149
0

No własnie czytam o kompozycjach, mimo to ciężko mi to ugryźć.
A co do XML'a to niestety wydaje mi się, że nie zda to egzaminu, ponieważ ja tworzę w c# diva który wygląda tak:
Co za tym idzie, na podstawie danych z bazy tworze wygląd strony gotowej do wydruku i stąd potrzeba zagnieżdżania.

Kopiuj
private string interpretacja(DataRow dr )
        {
            string interpretacja = "<div id =\"" + dr["w_nazwa"] + "\" ";
            interpretacja += "style=\"position:" + wybor_pozycji(dr["w_position"]) + ";";
            interpretacja += " float:" + float_jakie(dr["w_float"].ToString()) + ";";
            interpretacja += " top:" + dr["w_x"] + "mm;";
            interpretacja += " left:" + dr["w_y"] + "mm;";
            interpretacja += " min-width:" + dr["w_width_min"] + "mm;";
            interpretacja += " max-width:" + dr["w_width_max"] + "mm;";
            interpretacja += " min-height:" + dr["w_height_min"] + "mm;";
            interpretacja += " max-height:" + dr["w_height_max"] + "mm;";
            interpretacja += " font-weight:" + grubosc_czcionki(dr["w_bold"].ToString()) + ";";
            interpretacja += " border:" + border(dr["w_border"].ToString()) + " solid black;";
            interpretacja += " overflow:" + overflow(dr["w_overflow"].ToString()) + ";";
            interpretacja +="\">";
            interpretacja += dr["w_zawartosc"]; 
            return interpretacja;
        }
XI
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 4 lata
  • Postów:245
1

Po pierwsze primo konstrukcja w postaci konkatencji stringów poprzez znak + jest fatalnym pomysłem z punktu widzenia wydajności twojej aplikacji, zastanów się czy nie chcesz korzystać z klasy StringBuilder.
Po drugie primo zagnieżdżanie "stringa w stringu" jest również błędnym myślowo pojęciem ponieważ klasa String implementuje interfejs Immutable, (fakt powiązany z problemem powyżej): zródło potwierdzające: http://msdn.microsoft.com/en-us/library/vstudio/362314fe.aspx
Po trzecie primo zastanów się czy twojego problemu nie rozwiąże dodatkowa klasa, która opakuje twój string, a która będzie zawierać pola { Id, IdRodzica, Tresc }, i dopisanie odpowiedniego managera, który z kolekcji takich obiektów zbuduje twój dokument html.

I tak, zapoznanie się z wzorcem projektowym kompozyt powinno pomóc w rozwiązaniu problemu.

edytowany 1x, ostatnio: Xiuthechutli
Patryk27
po drugie pierwsze? :|
Patryk27
Wiem, że to z Poranka Kojota, po prostu nie ma to sensu :P
JU
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:149
0
Xiuthechutli napisał(a):

Po pierwsze primo konstrukcja w postaci konkatencji stringów poprzez znak + jest fatalnym pomysłem z punktu widzenia wydajności twojej aplikacji, zastanów się czy nie chcesz korzystać z klasy StringBuilder.

Hmm niestety mnie tego w szkole nie uczyli;) ale dziękuje za rade ^^ Zastosowałem się do instrukcji;)

Xiuthechutli napisał(a):

Po drugie primo zagnieżdżanie "stringa w stringu" jest również błędnym myślowo pojęciem ponieważ klasa String implementuje interfejs Immutable, (fakt powiązany z problemem powyżej): zródło potwierdzające: http://msdn.microsoft.com/en-us/library/vstudio/362314fe.aspx

Może i jest błędem myślowym, jednak wynika z założeń dotyczących tego projektu. Niestety innego pomysłu na rozwiązanie tego zadania, nie mam.

Xiuthechutli napisał(a):

Po trzecie primo zastanów się czy twojego problemu nie rozwiąże dodatkowa klasa, która opakuje twój string, a która będzie zawierać pola { Id, IdRodzica, Tresc }, i dopisanie odpowiedniego managera, który z kolekcji takich obiektów zbuduje twój dokument html.
I tak, zapoznanie się z wzorcem projektowym kompozyt powinno pomóc w rozwiązaniu problemu.

Pomysł jak najbardziej trafiony, jednak kolejna klasa w projekcie nie jest chyba potrzebna, ponieważ efekt działania jest taki sam, musi zwrócić string.
A co do kolekcji to nie wiem jak ją ugryźć... ponieważ przy niej natrafię na ten sam problem.

edytowany 1x, ostatnio: juniorchat
XI
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 4 lata
  • Postów:245
1

Nie bój się dodać klasy do projektu jeśli jej potrzebujesz, lepiej mieć 5 uporządkowanych klas w małym projekcie, które będą miały dokładnie jedno zadanie do realizacji niż mieć jednego potwora na 1000 linii kodu.
Co do kolekcji (List<T> powinno Ci wystarczyć) sprawa też nie jest nie wiadomo jak skomplikowana, a jak robisz projekt, który potem będzie ktoś oceniał to kod będzie z pewnością sprawiał wrażenie czytelniejszego.

Listę wykorzystasz tylko do przetrzymywania w niej iteracji swoich obiektów {Id, IdRodzica, Tresc} , dodanie, a potem iteracja po elementach listy, która pozwoli zbudować string wyjściowy.

edytowany 1x, ostatnio: Xiuthechutli
JU
czasami zastanawiam się czy ludzie na tym forum mówią po polsku ;) oczywiście 3 razy przeczytałem. zaraz spróbuje coś wymyślić;)
XI
trochę poprawiłem ostatnie zdanie, wkradł się skrót myślowy ;)
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
1
juniorchat napisał(a):

Pomysł jak najbardziej trafiony, jednak kolejna klasa w projekcie nie jest chyba potrzebna, ponieważ efekt działania jest taki sam, musi zwrócić string.

Efekt ten sam, pytanie tylko czy chcesz go osiągnąć większym czy mniejszym nakładem pracy, i czy chcesz czytelnego kodu aplikacji czy nie?

Jeśli wczytasz dane z bazy do grafu obiektów, z których każdy będzie potrafił przetworzyć na string siebie i swoje podobiekty, to wszystko Ci się automagicznie złoży w wynik, jakiego oczekujesz. Jeśli zaś będziesz się bawił w przeszukiwanie i wklejanie stringów na podstawie jakiejś płaskiej struktury, to zapewne będziesz miał z tym więcej roboty.

JU
Za każdym razie jak widzę tą świnkę z Twojego awatara, to sobie myślę, że moje wszelkie wątpliwości się rozwiążą ;) Szczerze mówiąc to wchodzę chyba w programowanie którego jeszcze nie znałem, stąd boje się trochę że nie podołam temu co piszecie;P
JU
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:149
0

Ok, udało się zamierzony efekt osiągnąć, może się kiedyś komuś przyda:
(wskazane również konstruktywne komentarze dot jakości kodu - co by zmienić;)

Kopiuj
private string tworzenie_indexu(int number)
        {
            DataTable dt = new DataTable();
            dt = conn_date.polaczenie_dt("Select * from labe_wzorzec_dane where w_id_wzorca ='"+number.ToString()+"' ");
            string wynik ="";
            wynik = wynik_przeszukiwarki("0",dt); 
            return wynik;
        }

        private string wynik_przeszukiwarki(string p, DataTable dt)
        {
            //string wynikowy ="";
            StringBuilder wynikowy = new StringBuilder();
            if (p != "0")
            {
                DataRow[] dr = dt.Select("w_id=" + p);
                wynikowy.Append(interpretacja(dr[0]));
            }
            else
            {
                wynikowy.Append("<html>");
            }
            DataView view = new DataView(dt);
            view.RowFilter = "w_in="+p;
            dataGridView2.DataSource = view.ToTable();
            
            if (view != null)
            {
                foreach (DataRow dr in view.ToTable().Rows)
                {
                    wynikowy.Append(wynik_przeszukiwarki(dr["w_id"].ToString(), dt));
                }
            }
            else
            {
                if (p != "0")
                {
                    wynikowy.Append("</div>");
                }
                else
                {
                    wynikowy.Append("</html>");
                }
            }
            return wynikowy.ToString();
        }

        

        private string interpretacja(DataRow dr )
        {
            //string interpretacja ="";
            StringBuilder sb = new StringBuilder();
            sb.Append("<div id =\"" + dr["w_nazwa"] + "\" ");
            sb.Append("style=\"position:" + wybor_pozycji(dr["w_position"]) + ";");
            sb.Append(" float:" + float_jakie(dr["w_float"].ToString()) + ";");
            sb.Append(" top:" + dr["w_x"] + "mm;");
            sb.Append(" left:" + dr["w_y"] + "mm;");
            sb.Append(" min-width:" + dr["w_width_min"] + "mm;");
            sb.Append(" max-width:" + dr["w_width_max"] + "mm;");
            sb.Append(" min-height:" + dr["w_height_min"] + "mm;");
            sb.Append(" max-height:" + dr["w_height_max"] + "mm;");
            sb.Append(" font-weight:" + grubosc_czcionki(dr["w_bold"].ToString()) + ";");
            sb.Append(" border:" + border(dr["w_border"].ToString()) + " solid black;");
            sb.Append(" overflow:" + overflow(dr["w_overflow"].ToString()) + ";");
            sb.Append("\">");
            sb.Append(dr["w_zawartosc"]); 
            return sb.ToString();
        }

edytowany 1x, ostatnio: juniorchat
Azarien
nadal używasz konkatenacji przez +
JU
Racja, Pan ze świnką w awatarze pokazał jak to inaczej zrobić, już poprawiłem ;)
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
2

@juniorchat, StringBuilder ma metodę AppendFormat, więc np. zamiast:

Kopiuj
sb.Append(" font-weight:" + grubosc_czcionki(dr["w_bold"].ToString()) + ";");

lepiej napisać:

Kopiuj
sb.AppendFormat(" font-weight:{0};", grubosc_czcionki(dr["w_bold"].ToString()));
JU
Fajne;) i nawet wygląda czytelniej ^^ właśnie poprawiłem;) Dziękuje.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)