Bezpośredni zapis grafiki do bazy

Bezpośredni zapis grafiki do bazy
JU
  • Rejestracja:ponad 6 lat
  • Ostatnio:4 miesiące
  • Postów:35
0

Cześć !
Lazarus + ZEOS-y _ Firebird.
W jaki sposób mogę (jeżeli oczywiście jest to możliwe) pobrać BEZPOŚREDNIO z TImage załadowaną grafikę
i zapisać ją następnie do BLOB-a w bazie danych ?
W/w grafika wcześniej była załadowana również z BLOB-a bazy danych i posiada różne formaty (*.jpg, *.png ...).

edytowany 1x, ostatnio: flowCRANE
WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
1
Tomek Pycia napisał(a):

Do jakiejś konkretnej bazy?

A to ma jakieś znacznie?
Nie ma.

jurkowojc napisał(a):

Cześć !
Lazarus + ZEOS-y _ Firebird.
W jaki sposób mogę (jeżeli oczywiście jest to możliwe) pobrać BEZPOŚREDNIO z TImage załadowaną grafikę

TImage.Image.SaveToStream itd.

i zapisać ją następnie do BLOB-a w bazie danych ?

Zapisujesz strumień do pola BLOB.

W/w grafika wcześniej była załadowana również z BLOB-a bazy danych i posiada różne formaty (*.jpg, *.png ...).

No to wszystko masz w kodzie, musisz zrobić tylko odwrotnie ;-)

edytowany 1x, ostatnio: cerrato
WL
Praktycznie rzecz ujmując jesteśmy w dziale Delphi/Pascal, pytanie dotyczy konkretnego DAL (ZEOS) i nie ma to znaczenia, ponieważ wszystko jest ustandaryzowane. A poza tym, naprawdę, nie spotkałem się jeszcze z jakąkolwiek różnicą w składni SQL do obsługi standardowych pól typu BLOB. Jest gdzieś jakaś różnica, aby wsadzić BLOBa do tabeli?
UglyMan
Jak poczułeś się urażony moim pytaniem to bardzo mi przykro. Już usuwam moje komentarze w tym wątku.
WL
@Tomek Pycia: Ależ skąd, dlaczego urażony? Proszę Cię, w żadnym wypadku nie jest urażony. Zazwyczaj to ja urażam innych, a nie odwrotnie; -)
robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Zielona Góra
0

Akurat wczoraj miałem otwarte kilka zakładek na ten temat bo też rozważam zapis grafik do bazy i to też do firebirda, jedyna różnica (lub nie) że ja to mam zamiar zrobić za pomocą firedac-ka. Jednak cały czas się gryzę czy to robić czy jednak zapisywać grafiki na dysku a w bazie tylko link.

Tak więc chętnie zaznaczam obserwowanie wątku i czekam na dalsze posty.

edytowany 1x, ostatnio: cerrato
somedev
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:666
0

Ja bym uważał na bloby w Firebirdzie. Najlepiej zrób sobie tabelkę, która będzie trzymała adres repo oraz tabelkę plików gdzie będzie klucz na repo + ścieżka względna i zapisuj na dysku. Może to powodować problemy ze spójnością, ale baza będzie zdrowsza. Można tez wynieść część z blobami obrazków do osobnej bazy.

WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
0
robertz68 napisał(a):

Akurat wczoraj miałem otwarte kilka zakładek na ten temat bo też rozważam zapis grafik do bazy i to też do firebirda, jedyna różnica (lub nie) że ja to mam zamiar zrobić za pomocą firedac-ka.

Nie ma znaczenia :)

Jednak cały czas się gryzę czy to robić czy jednak zapisywać grafiki na dysku a w bazie tylko link.
Tak więc chętnie zaznaczam obserwowanie wątku i czekam na dalsze posty.

Aplikacja desktop, czy tylko serwer aplikacyjny?
Jeśli desktop będzie sięgał do bazy po grafiki, to zapisuj je w bazie danych i tyle.
Podejście z zapisem linków jest/było popularne wśród "chłopców od PHP" czyli w webie :D, ponieważ u nich proces zapisujący/czytający dane z bazy danych zazwyczaj był na tej samej maszynie.

Po drugie, w www czas dostępu do takich plików może być krytyczny. A dostęp do pliku będzie zawsze sziszy od pobrania tego z bazy danych.
Tylko, że w aplikacji desktop te ograniczenia nie mają znaczenia.
No i odwrotnie - w aplikacji desktop dostęp do plików na serwerze jest utrudniony i może być upierdliwy.

Jeszce inaczej będzie to wyglądało, jeśli dostęp do danych będzie zapewniał serwer aplikacyjny.
Wtedy założenia również się zmieniają i można powalczyć z plikami na dysku.

Ale osobiście robiłbym to tylko i wyłącznie wtedy, kiedy ma to sens - a sens ma tylko wtedy, kiedy żądań do takich zasobów będzie niemało.
A niemało, to powiedzmy dziesiątki na sekundę.

WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
1
somedev napisał(a):

Ja bym uważał na bloby w Firebirdzie.

Niby dlaczego?
http://www.firebirdfaq.org/faq277/

Najlepiej zrób sobie tabelkę, która będzie trzymała adres repo oraz tabelkę plików gdzie będzie klucz na repo + ścieżka względna i zapisuj na dysku. Może to powodować problemy ze spójnością, ale baza będzie zdrowsza.

To jest jakiś mit, powtarzany od lat przez ludzi, którzy opierają swoją wiedzę na jakiś plotkach.

Można tez wynieść część z blobami obrazków do osobnej bazy.

Sorry, ale to kolejny genialny pomysł, który tak naprawdę niczego dobrego nie wnosi, poza komplikacją.
Dlaczego tak twierdzę?
Bo znam dwa projekty, które tak właśnie realizowały dostęp do plików (ścieżka do dysku oraz dedykowana baza danych).
I nie przyniosło to żadnej korzyści, poza komplikacją oraz z definicji brakiem spójności.

Zdecydowanie nie polecam, jeśli to nie jest absolutnie konieczne.

edytowany 1x, ostatnio: wloochacz
CW
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 2 lata
  • Postów:251
2

Ja od lat wkładam skany do baz i nie ma z tym problemów (MSSQL). Zalety to przede wszystkim to, że nie trzeba pilnować powiązań rekordów z plikami na dyskach i bawić się uprawnieniami do tych plików. Poza tym dodatkowa zaleta to prostota wykonywania kopii zapasowych i przenoszenia aplikacji na inne serwery (wystarczy backup i restore bazy).

I jeszcze jedna sprawa, której nie widać przy małych bazach. Administruję bazą w której są setki tysięcy skanów i po prostu trzymanie takiej ilości osobnych plików na dyskach jest kłopotliwe.

edytowany 2x, ostatnio: flowCRANE
WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
0
cw napisał(a):

Ja od lat wkładam skany do baz i nie ma z tym problemów (MSSQL). Zalety to przede wszystkim to, że nie trzeba pilnować powiązań rekordów z plikami na dyskach i bawić się uprawnieniami do tych plików. Poza tym dodatkowa zaleta to prostota wykonywania kopii zapasowych i przenoszenia aplikacji na inne serwery (wystarczy backup i restore bazy).

Tak, tylko MSSQL to jednak nie Firebird.
Ale ponad wszystko w MSSQL do takich celów powinien być używany FileStream, bo do tego właśnie jest i działa od wersji Express w górę.
O samym FileStream było niedawno na forum...

robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Zielona Góra
0
wloochacz napisał(a):

Jeśli desktop będzie sięgał do bazy po grafiki, to zapisuj je w bazie danych i tyle.

Właśnie na odpowiedź od Ciebie czekałem i oczywiście że mnie przekonałeś.

somedev
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:666
1
wloochacz napisał(a):
somedev napisał(a):

Ja bym uważał na bloby w Firebirdzie.

Niby dlaczego?
http://www.firebirdfaq.org/faq277/

Ta, wiem - oni generalnie zawsze chwalą ten silnik.
Niemniej to moje doświadczenie. Baza z duża ilością blobow puchnie. Powoduje to utrudnienie podczas backupy i replikacji. Można omijać cześć tabel ale to tez dodatkowa komplikacja. Dodatkowo zauważyłem ze tabele z blobami często ulegają uszkodzeniu indeksów. Teoretycznie nie ma to nic do rzeczy ale napatrzyłem się na leżące bazy które padały po wprowadzeniu blobow. Przynajmniej do FB 2.5.3 nie ufam blobom na tyle by składować ich duże ilości w obawie o pad bazy. Nie są to plotki i mity a po prostu wieloletnie obserwacje.

Najlepiej zrób sobie tabelkę, która będzie trzymała adres repo oraz tabelkę plików gdzie będzie klucz na repo + ścieżka względna i zapisuj na dysku. Może to powodować problemy ze spójnością, ale baza będzie zdrowsza.

To jest jakiś mit, powtarzany od lat przez ludzi, którzy opierają swoją wiedzę na jakiś plotkach.

Można tez wynieść część z blobami obrazków do osobnej bazy.

Sorry, ale to kolejny genialny pomysł, który tak naprawdę niczego dobrego nie wnosi, poza komplikacją.

No widzisz nie trzymanie blobow w biznesowej bazie wynika z tego ze spotykałem się z padami takich baz. Trzymanie ich na dysku to tez inna odmiana separacji blobow od bazy biznesowej. Masz racje powoduje to komplikacje aczkolwiek przy założeniu, że bloby lub sposób jak się ich używa powoduje uszkodzenie bazy jest to sensowny środek ostrożności. Nie bez przyczyny rekomenduje taka komplikacje - a może masz jakiś sprawdzony magiczny konfig na którym bazy które maja terabajty danych biznesowych także obsługują dodatkowe gigabajty blobow? Chętnie dowiem się czegoś więcej o FB. Wiem - baza powinna być odchudzona i zagregowana osobna hurtownia ale życie i projekty są jakie są.
Co do komplikacji - rozwiązanie z osobna baza nie jest złe jak masz jakaś warstwę w której możesz przekazać akronimem gdzie się odwoływać, do jakiej bazy, a sam FB obsługuje zapytania on external i to fajnie działa.

Dlaczego tak twierdzę?
Bo znam dwa projekty, które tak właśnie realizowały dostęp do plików (ścieżka do dysku oraz dedykowana baza danych).
I nie przyniosło to żadnej korzyści, poza komplikacją oraz z definicji brakiem spójności.

No widzisz masz dobre doświadczenia a ja złe. Projekty które widziałem i brałem udział po rezygnacji z blobow na głównej bazie na rzecz osobnej lub repo plikowego zyskały mniejsza awaryjność bazy i mniej przestojów na odtwarzanie bazy i danych.

Zdecydowanie nie polecam, jeśli to nie jest absolutnie konieczne.

Przyznam, ze jeśli nie jest konieczne to faktycznie jest to zbędny środek ale to jak ze wszystkim. Gdyby te bazy stabilnie pracowały z błonami ja sam tez miał bym inna opinie.

JU
  • Rejestracja:ponad 6 lat
  • Ostatnio:4 miesiące
  • Postów:35
0

I znowu kolega wloochacz jest WIELKI !
To jest proste jak metr sznurka w kieszeni. Nie mam pojęcia dlaczego do tej pory uskuteczniałem jakieś dziwne kombinacje.

Kopiuj
ST := TMemoryStream.Create;
Image.Picture.Graphic.SaveToStream(ST);
StoredProc.ParamByName('?').LoadFromStream(ST, ftGraphic);
ST.Free;

Wielkie dzieki!

edytowany 1x, ostatnio: flowCRANE
WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
0
jurkowojc napisał(a):

I znowu kolega wloochacz jest WIELKI !

Wypraszam sobie, jestem zdecydowanie węższy niż kiedyś 😜🤣🤣

To jest proste jak metr sznurka w kieszeni. Nie mam pojęcia dlaczego do tej pory uskuteczniałem jakieś dziwne kombinacje.
No jest.

A gdzie bezpieczny kod bloku?

Kopiuj
ST := TMemoryStream.Create;
try
  Image.Picture.Graphic.SaveToStream(ST);
  StoredProc.ParamByName('?').LoadFromStream(ST, ftGraphic);
finally
  ST.Free;
end;

Wielkie dzieki!

Luzik.
Tylko zbyt często zapominam o tym, co dla mnie jest oczywiste, a dla innych niekoniecznie - niestety :/

JU
  • Rejestracja:ponad 6 lat
  • Ostatnio:4 miesiące
  • Postów:35
0

Oczywiście, że jest !
Pozwoliłem sobie skrócic zapis dla lepszej czytelności ale widzę, że to był błąd !
Pozdrawiam

WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
0
somedev napisał(a):
wloochacz napisał(a):
somedev napisał(a):

Ja bym uważał na bloby w Firebirdzie.

Niby dlaczego?
http://www.firebirdfaq.org/faq277/

Ta, wiem - oni generalnie zawsze chwalą ten silnik.
Niemniej to moje doświadczenie. Baza z duża ilością blobow puchnie. Powoduje to utrudnienie podczas backupy i replikacji. Można omijać cześć tabel ale to tez dodatkowa komplikacja. Dodatkowo zauważyłem ze tabele z blobami często ulegają uszkodzeniu indeksów. Teoretycznie nie ma to nic do rzeczy ale napatrzyłem się na leżące bazy które padały po wprowadzeniu blobow. Przynajmniej do FB 2.5.3 nie ufam blobom na tyle by składować ich duże ilości w obawie o pad bazy. Nie są to plotki i mity a po prostu wieloletnie obserwacje.

Przewrotnie zapytam - a jaki SUB_TYPE BLOBowe pole miało ustawione?

Czy nie było jakiś dziwnych akcji z kopiowaniem pliku w trakcie działania silnika?
Pewnie nie, ale widziałem już i takich asów.

I co ciekawe, najczęściej im się udawało "i działało".
Ale do czasu.

/ciach/

No cóż więcej dodać do reszty?
Wszystko już chyba napisane :)

somedev
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:666
0
wloochacz napisał(a):
somedev napisał(a):
wloochacz napisał(a):
somedev napisał(a):

Ja bym uważał na bloby w Firebirdzie.

Niby dlaczego?
http://www.firebirdfaq.org/faq277/

Ta, wiem - oni generalnie zawsze chwalą ten silnik.
Niemniej to moje doświadczenie. Baza z duża ilością blobow puchnie. Powoduje to utrudnienie podczas backupy i replikacji. Można omijać cześć tabel ale to tez dodatkowa komplikacja. Dodatkowo zauważyłem ze tabele z blobami często ulegają uszkodzeniu indeksów. Teoretycznie nie ma to nic do rzeczy ale napatrzyłem się na leżące bazy które padały po wprowadzeniu blobow. Przynajmniej do FB 2.5.3 nie ufam blobom na tyle by składować ich duże ilości w obawie o pad bazy. Nie są to plotki i mity a po prostu wieloletnie obserwacje.

Przewrotnie zapytam - a jaki SUB_TYPE BLOBowe pole miało ustawione?

Czy nie było jakiś dziwnych akcji z kopiowaniem pliku w trakcie działania silnika?
Pewnie nie, ale widziałem już i takich asów.

I co ciekawe, najczęściej im się udawało "i działało".
Ale do czasu.

/ciach/

No cóż więcej dodać do reszty?
Wszystko już chyba napisane :)

Różnie. Czasem były to bloby tekstowe, a czasem takie surowe. Ofc. bloby tekstowe były stosowane celowo - najczęściej to trzymania tekstów, opisów czy htmli. W surowych najczęściej lądowały obrazki i inne formaty binarne. Generalnie silnik zły nie jest, ale ma swoje zachcianki i po prostu trzeba uważać, dlatego omijam tutaj bloby, lub stosuje osobne bazy/pliki. W innych silnikach nie boję się blobów.

Nieee, nie działał silnik ;) Tzn. nie wtedy, kiedy padały te bazy - wtedy nie były tak gwałcone. Owszem zdarzało się asom na dev tak kopiować bazki i potem sie dziwić, ale na produkcji to stosuje się backupy gbakiem, lub kopiuje się plik bazy bo wcześniejszym jej zablokowaniu i złączeniem z deltą po operacji. Niemniej tutaj też raz był fuckup z złączeniem, więc z FB to jak z kryształowym kieliszkiem ;)

WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
0
somedev napisał(a):
wloochacz napisał(a):
somedev napisał(a):
wloochacz napisał(a):
somedev napisał(a):

Ja bym uważał na bloby w Firebirdzie.

Niby dlaczego?
http://www.firebirdfaq.org/faq277/

Ta, wiem - oni generalnie zawsze chwalą ten silnik.
Niemniej to moje doświadczenie. Baza z duża ilością blobow puchnie. Powoduje to utrudnienie podczas backupy i replikacji. Można omijać cześć tabel ale to tez dodatkowa komplikacja. Dodatkowo zauważyłem ze tabele z blobami często ulegają uszkodzeniu indeksów. Teoretycznie nie ma to nic do rzeczy ale napatrzyłem się na leżące bazy które padały po wprowadzeniu blobow. Przynajmniej do FB 2.5.3 nie ufam blobom na tyle by składować ich duże ilości w obawie o pad bazy. Nie są to plotki i mity a po prostu wieloletnie obserwacje.

Przewrotnie zapytam - a jaki SUB_TYPE BLOBowe pole miało ustawione?

Czy nie było jakiś dziwnych akcji z kopiowaniem pliku w trakcie działania silnika?
Pewnie nie, ale widziałem już i takich asów.

I co ciekawe, najczęściej im się udawało "i działało".
Ale do czasu.

/ciach/

No cóż więcej dodać do reszty?
Wszystko już chyba napisane :)

Różnie. Czasem były to bloby tekstowe, a czasem takie surowe. Ofc. bloby tekstowe były stosowane celowo - najczęściej to trzymania tekstów, opisów czy htmli. W surowych najczęściej lądowały obrazki i inne formaty binarne. Generalnie silnik zły nie jest, ale ma swoje zachcianki i po prostu trzeba uważać, dlatego omijam tutaj bloby, lub stosuje osobne bazy/pliki. W innych silnikach nie boję się blobów.

Pytam, ponieważ problemy z blobami tekstowymi (czyli SUB_TYPE 1) są ogólnie znane i jest ich naprawdę (albo było, w sumie nie jestem na bieżąco) sporo.
Tak czy inaczej, szybko przejrzałem swoje historyczne bazy FB i okazuje się, że nie używałem blobów tekstowych nawet do przechowywania takich takich danych.

Może właśnie dlatego mam dobre doświadczenia?

Nieee, nie działał silnik ;) Tzn. nie wtedy, kiedy padały te bazy - wtedy nie były tak gwałcone. Owszem zdarzało się asom na dev tak kopiować bazki i potem sie dziwić, ale na produkcji to stosuje się backupy gbakiem, lub kopiuje się plik bazy bo wcześniejszym jej zablokowaniu i złączeniem z deltą po operacji. Niemniej tutaj też raz był fuckup z złączeniem, więc z FB to jak z kryształowym kieliszkiem ;)

Z FB miałem naprawdę sporo problemów wydajnościowych w wersji 1.5, czyli historia...
Optymalizator w tamtej wersji praktycznie był nieśmiesznym żartem.

Jednak doszedłem do naprawdę niezłej wprawy i miałem spektakularne wyniki :D
Pamiętam też, że raz przepisałem skomplikowaną procedurę składowaną (i modyfikowałem indeksy), która robiła to samo tylko ok. 500x (tak, nie pomyliłem się) wydajniej.
Firebird w poprzednich wersjach potrafił naprawdę nieźle zaskoczyć i to nie zawsze pozytywnie pod kątem pracy optymalizatora zapytań (np. left join był wielokrotnie wolniejszy od 'inner join', albo kiedy warunek przeniosło się z klauzuli where do warunku złączenia - błyskawica. Dużo pomagał mi wtedy w pracy IBExpert).

Z MSSQL też miałem raz taką akcję, że w pewnym systemie raport stanu magazynu na dzień wykonywał się dłużej niż dobę.
Przepisałem go na jakieś 6 minut.
No, ale tam "programiści" (od siedmiu boleści) dali tak kosmicznie ciała, że trudno sobie wyobrazić podobną "kreatywność".

edytowany 1x, ostatnio: wloochacz
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)