Najprostszy serwer HTTP

Najprostszy serwer HTTP
BX
  • Rejestracja:ponad 2 lata
  • Ostatnio:11 miesięcy
  • Postów:34
1

Potrzebuję minimalnego kodu C++ do ogarnięcia serwera HTTP, który będzie zwracał tylko podstawowe nagłówki i stringa, którego zdefiniuję. Trafiłem w sieci na YT na wideo, gdzie gość tworzył taki serwer, ale problem jest taki, że licencja nie jest określona...
https://github.com/codehoose/barebones-webserver/tree/release/video-2
Ktoś ma jakieś pomysły?

edytowany 1x, ostatnio: Riddle
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
1

Boost asio ma prawie gotowca


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
enedil
  • Rejestracja:ponad 11 lat
  • Ostatnio:7 dni
  • Postów:1027
1
Marcin Marcin
  • Rejestracja:prawie 6 lat
  • Ostatnio:18 dni
  • Postów:610
0
ZrobieDobrze napisał(a):

Boost asio ma prawie gotowca

Chyba chodzi o serwer WWW bez dodatkowych bibliotek


Fan moderatora somekind
BX
  • Rejestracja:ponad 2 lata
  • Ostatnio:11 miesięcy
  • Postów:34
0
Marcin Marcin napisał(a):
ZrobieDobrze napisał(a):

Boost asio ma prawie gotowca

Chyba chodzi o serwer WWW bez dodatkowych bibliotek

Tak, bez dodatkowych bibliotek - im mniej includów tym lepiej.

Co do wspomnianego wyżej mongoose - odpada ze względu na licencję GPL, a komercyjnej nie kupię tylko po to, żeby krótki string wyświetlać :E

ZD
Zupelnie bez? To chyba w Delphi. Nawet to coś, co na Arduino dołączaja do hhtp, traktuje sie jako bibliotekę
ZD
A czy boost to naprawdę "dodatkowa biblioteka" ? To takie trochę poszerzenie / przedmoście (przyszłego) standardu
BX
Ja rozumiem dołączyć jakieś winsocki czy coś (bo to ogólnie na windowsie ma chodzić), ale dołączanie boosta to trochę za duży narzut na tak mały projekt...
enedil
Jak będziesz tylko hostować program (bez udostępniania binarek) to licencja GPL pozwala na to, bez dzielenia się kodem źródłowym.
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
0

Ja rozumiem dołączyć jakieś winsocki czy coś (bo to ogólnie na windowsie ma chodzić), ale dołączanie boosta to trochę za duży narzut na tak mały projekt... — beaver.xv 4

Chcesz liczyć bajty i przeliczać na znaki unikodu na Win API ? Chcesz to konserwować?
Na czym ten projekt, bo wiele libek już ma jakąś ideę do socketowania


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
ZD
BTW co nazywamy narzutem?
winuser
@ZrobieDobrze: O jakim liczeniu bajtow kolega mowi? Czy moze chodzi o to, ze cale te programowanie to tak naprawde "przeliczanie bajtow"? To zadna technologia Ciebie nie zadowoli w takim razie.
AN
  • Rejestracja:prawie 19 lat
  • Ostatnio:około 2 godziny
1

Czy naprawdę jest to potrzebne? Twoja apka w C++ czy co tam chcesz może być zwykłym serwerem TCP/IP na gniazdach, która słucha na jakimś tam porcie, a do tego postawisz zwykły serwer jak Apache, Nginx czy jakikolwiek inny obsługujący np. Php i na serwerze uruchomisz skrypt PHP który w razie potrzeby otworzy połączenie localhost do Twojej apki w C++, wymieni dane i odda wynik w sposób standardowy przyjety w PHP. Oczywiście zamiast php może być cokolwiek innego, to nie ma znaczenia, ważne że serwer http to obsługuje i umiesz zrobić połączenie TCP po gnieździe. Pomiędzy apką w cpp a aplikacja w php protokół może być całkowicie dowolny, możesz sam wymyślić jakiś najprostszy, nie potrzeba implementować protokołu HTTP, bo serwer to zapewnia.

edytowany 3x, ostatnio: andrzejlisek
several
  • Rejestracja:ponad 15 lat
  • Ostatnio:mniej niż minuta
1

Co do wspomnianego wyżej mongoose - odpada ze względu na licencję GPL, a komercyjnej nie kupię tylko po to, żeby krótki string wyświetlać :E

To jak chcesz tylko stringa wyświetlić, to w czym Ci GPL przeszkadza? o_0 Ale trzymając się tematu...

Potrzebuję minimalnego kodu C++ do ogarnięcia serwera HTTP, który będzie zwracał tylko podstawowe nagłówki i stringa, którego zdefiniuję.

No to bierzesz serwerek z tutoriala BJa to ściągnięcia z GH TUTAJ i dorzucasz tylko te kilka nagłówków.


edytowany 1x, ostatnio: several
ZK
problem w tym, że przy pomocy tego samouczka możliwe, że coś napisze ale będzie miał bardzo dużo niedomówień i znaków zapytania - tak jak mam ja, bo ten samouczek tylko dotyka tematu i to dość pobieżnie, nie jest tam wyjaśnione co, skąd i dlaczego się wzięło... nie wspominając nawet o tym, że w użyciu są gotowe metody z bibliotek aha i nie jest to w C++ tylko w C :>
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:3 minuty
  • Postów:2064
4

https://github.com/yhirose/cpp-httplib.git

Kopiuj
// HTTP
httplib::Server svr;

svr.Get("/hi", [](const httplib::Request &, httplib::Response &res) {
  res.set_content("Hello World!", "text/plain");
});

svr.listen("0.0.0.0", 8080);

--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
Riddle
Administrator
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10037
0

Jeśli chcesz najprostszy, to nawet nie wiem czy w C++ jest sens to robić.

BX
  • Rejestracja:ponad 2 lata
  • Ostatnio:11 miesięcy
  • Postów:34
0
Adamek Adam napisał(a):

https://github.com/yhirose/cpp-httplib.git

Kopiuj
// HTTP
httplib::Server svr;

svr.Get("/hi", [](const httplib::Request &, httplib::Response &res) {
  res.set_content("Hello World!", "text/plain");
});

svr.listen("0.0.0.0", 8080);

Wydaje się być najlepszym rozwiązaniem. Sprawdzę na tygodniu i jak będzie hulać to będę miał to z głowy.

Co do niektórych innych pytań: przez "serwer http" rozumiem część kodu odpowiedzialną za wyświetlenie wspomnianego stringa. Cały program to jednak nie tylko serwer HTTP, ale także procesor requestów dla pewnej biblioteki DLL - stringi przesyłane przez HTTP będą pobierane z resultów z DLL'ki.

Marius.Maximus
chyba "w tygodniu" ? Albo ja już nie nadążam za nowomową :D
K8
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Małopolska
  • Postów:643
0

mam pytanie
mam server http
ale mam problem z forwarding portu 80
bo do serwera jest przypisany port 80 z ktorego korzysta jednoczesnie router przy ustawianiu opcji

edytowany 1x, ostatnio: krzychu82a
WY
Wypierdzistyy
Zwykle nie da się zalogować na router z zewnętrznego IP, tylko z poziomu LANa.
K8
moze zle to napisalem ale nie moge zmienic w okienku forwarding portu na 80
ZD
Cóż za precyzyjnie podane informacje
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:3 minuty
  • Postów:2064
0

@krzychu82a nie powinieneś pisać tutaj o problemie tylko założyć nowy watek, jak dobry router to ma opcje zmiany portu uslugi i wtedy przenosisz na inny port zarzadzanie a 80+443 zostawiasz na HTTP i HTTPS (twojego serwera ktory jest za NAT), jak router nie ma opcji to nie pozostaje nic innego jak używać np. 8080, alternatywa to kupic lepszy router


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
edytowany 1x, ostatnio: Marius.Maximus
winuser
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 5 godzin
  • Postów:68
0

Najlepiej uzyc do tego Pythona - ma mnostwo mozliwosci prostych serwerow http.

Jesli juz musisz C++, najprosciej bedzie uzyc Winsock/BSD sockets, kod jednowatkowy na select(). Mozna napisac tak, ze bedzie przenosny miedzy windows oraz linux (oraz FreeBSD) z kilkoma ifdefami.

Pisalem takie aplikacje wiele lat temu, kiedy Python nie byl jeszcze popularny i da sie to zrobic w okolo 300-400 liniach kodu (w miare eleganckiego) w C++. W C nieco wiecej. Oczywiscie mowimy o totalnie prostym przypadku, brak obslugi 95% protokolu HTTP. Obsluge zwyklego GET mozna tak napisac szybko.

Ale generalnie odradzam takie zabawy, chyba ze uczysz sie dopiero C++, roznych api i bibliotek, inaczej nie widze zasadnosci.

edytowany 1x, ostatnio: winuser
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:3 minuty
  • Postów:2064
0

Nie ma to jak polecać w dziale C/C++ coś co nie jest C/C++


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
winuser
Kiedy ktos bladzi, warto wskazac prawidlowa droge.
ZK
  • Rejestracja:około 19 lat
  • Ostatnio:2 miesiące
0
beaver.xv napisał(a):

Potrzebuję minimalnego kodu C++ do ogarnięcia serwera HTTP, który będzie zwracał tylko podstawowe nagłówki i stringa, którego zdefiniuję.

prawdopodobnie potrzebujesz raw socket ja ogólnie kręcę się przy tym temacie i jest bardzo dużo klocków do poskładania z zagranicznej dokumentacji. Gdyby to forum i programiści którzy tu są wykorzystali cały swój potencjał i rzeczywiście chcieli podzielić się wiedzą, to możliwe, że powstałaby fajna polska dokumentacja na ten i różne tematy - ale większość mądrali stwierdzi "po co" bo są po "angielsku"...

ale no właśnie "po co" ? Tacy rosjanie produkują dla swoich rodaków lepsze samouczki niż te które są po angielsku i dzięki temu rosjanie mają najlepszych programistów na świecie, nie wspominając o matematykach - a w polsce jak zwykle "po co" ? A potem społeczeństwo jest nie wyedukowane, ma braki w edukacji i wykształceniu ale megalomania w narodzie o swojej nieuzasadnionej wielkości z jakiegoś powodu pozostała... chociaż nie wiem czemu w polsce panuje przekonanie o "wielkości" narodu ??? Chyba wielkości głupoty w narodzie, to walimy w tym względzie cały świat na ryj - w tym to się zgodzę :>


bla
CZ
Może sam zaczniesz robić samouczki
Inclouds
Ale kolegę odkleiło, chyba nie znalazł gotowca na stackoverflow i musiał dać upust frustracji.
enedil
  • Rejestracja:ponad 11 lat
  • Ostatnio:7 dni
  • Postów:1027
5
zkubinski napisał(a):

prawdopodobnie potrzebujesz raw socket

Bzdury, surowe gniazda służą do zupełnie innych celów.

winuser
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 5 godzin
  • Postów:68
1
zkubinski napisał(a):
beaver.xv napisał(a):

Potrzebuję minimalnego kodu C++ do ogarnięcia serwera HTTP, który będzie zwracał tylko podstawowe nagłówki i stringa, którego zdefiniuję.

prawdopodobnie potrzebujesz raw socket ja ogólnie kręcę się przy tym temacie i jest bardzo dużo klocków do poskładania z zagranicznej dokumentacji. Gdyby to forum i programiści którzy tu są wykorzystali cały swój potencjał i rzeczywiście chcieli podzielić się wiedzą, to możliwe, że powstałaby fajna polska dokumentacja na ten i różne tematy - ale większość mądrali stwierdzi "po co" bo są po "angielsku"...

ale no właśnie "po co" ? Tacy rosjanie produkują dla swoich rodaków lepsze samouczki niż te które są po angielsku i dzięki temu rosjanie mają najlepszych programistów na świecie, nie wspominając o matematykach - a w polsce jak zwykle "po co" ? A potem społeczeństwo jest nie wyedukowane, ma braki w edukacji i wykształceniu ale megalomania w narodzie o swojej nieuzasadnionej wielkości z jakiegoś powodu pozostała... chociaż nie wiem czemu w polsce panuje przekonanie o "wielkości" narodu ??? Chyba wielkości głupoty w narodzie, to walimy w tym względzie cały świat na ryj - w tym to się zgodzę :>

Wyglada na to, ze nie masz pojecia o czym piszesz. Na win32 wystarczy zwykly SOCK_STREAM. Prove me wrong.

Co do dokumentacji pisanej w jezyku Polskim. Nie wiem jak to skomentowac. Trolujesz? Jakies 99.9 % programistow ktorych znam nie wpadloby na to, bo nie ma takiej potrzeby. Byloby to wrecz szkodliwe. Dokumentacje po polsku czytalem bedac w gimnazjum sto lat temu, ale szybko sie z tego wyleczylem. Najczesciej byly to przestarzale materialy. Nawet juz wtedy swiat IT pedzil tak szybko, ze nie bylo sensu tego tlumaczyc, a co dopiero dzisiaj.

Ale po co ja to pisze, zapewne i tak moja wiadomosc nie zostanie poprawnie zrozumiana, "bo jezyk polski".

kq
Dyskusje z nim są z reguły bezcelowe, wystarczy przejrzeć historię jego postów.
BX
  • Rejestracja:ponad 2 lata
  • Ostatnio:11 miesięcy
  • Postów:34
0
winuser napisał(a):

Wyglada na to, ze nie masz pojecia o czym piszesz. Na win32 wystarczy zwykly SOCK_STREAM. Prove me wrong.

Możesz rozwinąć wypowiedź? Może faktycznie powinienem zahaczyć o ten temat...

kq
To prawie na 100% było do zkubińskiego
BX
Wiem, ale może z tym SOCK_STREAM coś ciekawego jest :)
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:3 minuty
  • Postów:2064
0

Hoł ! Hoł !
Proszę posłuchać trochę świątecznych hiciorów (np. RMF Classic), i włączyć tryb świątecznej życzliwości :)
Ewentualnie w oddzielnym wątku zawody na najprostszy/najlepszy serwer HTTP technologia dowolna


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
BX
  • Rejestracja:ponad 2 lata
  • Ostatnio:11 miesięcy
  • Postów:34
0
Adamek Adam napisał(a):

https://github.com/yhirose/cpp-httplib.git

Kopiuj
// HTTP
httplib::Server svr;

svr.Get("/hi", [](const httplib::Request &, httplib::Response &res) {
  res.set_content("Hello World!", "text/plain");
});

svr.listen("0.0.0.0", 8080);

Jako, że nie jestem w 100% płynny w C++, to jeszcze podpytam: czy jest możliwość w tej libce dodania dependency injection na requeście albo w funkcji callbackowej do konkretnego patha?

Zobacz pozostałe 15 komentarzy
enedil
@Althorion: przecież rzutowanie na pałę się zazwyczaj nie skompiluje (chyba, że rzutujesz wskaźniki, ale to inna kwestia w ogóle)
Althorion
Miałem na myśli właśnie takie naprawdę na pałę, przez reinterpret_cast, lub jeszcze większy hardkor (kto nie „kocha” używania void * do wszystkiego…).
ZK
@enedil: & @Althorion dobra, nie zaśmiecam tutaj - ale ogólnie chcę tylko napomknąć, że moja dygresja na temat rzutowania jest taka jak rozumieć rzutowanie - rozumiem, że np typ int można rzutować na double lub na char - ale co z typem np "Button" a "window" - tak dwa różne obiekty z czapy - tutaj nie piszcie, bo po co. Ale chcę zobrazować o co mi chodzi - może założę o tym wątek
Althorion
Załóż. To jest ten przypadek właśnie, o którym piszę, że jak się mocno uweźmiesz, to kompilator na to machnie ręką i przepuści, ale rezultat nie będzie miał sensu.
ZK
@Althorion: no dobra, to grzeję kotleta który zrobił się gorący
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:3 minuty
  • Postów:2064
1

A lambda w przykładzie nie wystarcza czy nie znasz tej koncepcji ? Ewentualnie inne przykłady kodu na stronie projektu nie załatwiają tematu ?
Albo opisz to jakoś szerzej ;)


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
BX
  • Rejestracja:ponad 2 lata
  • Ostatnio:11 miesięcy
  • Postów:34
0
Adamek Adam napisał(a):

A lambda w przykładzie nie wystarcza czy nie znasz tej koncepcji ? Ewentualnie inne przykłady kodu na stronie projektu nie załatwiają tematu ?
Albo opisz to jakoś szerzej ;)

Koncepcji nie znam - C++ nie tykałem odkąd skończyłem technikum - moja praca aktualnie opiera się bardziej o PHP, ale spróbuję poczytać. Dzięki za nakierowanie :)

Zobacz pozostałe 2 komentarze
ZD
Kuźma,. będziesz miał problem z tym IDE powyżej dużej bańki dochodu z C++
BX
@ZrobieDobrze: psychiatra. to już pewne :)
BX
i co jeszcze za ciebie zrobić? @ZrobieDobrze XD
BX
człowiek całkowicie odklejony XD
enedil
  • Rejestracja:ponad 11 lat
  • Ostatnio:7 dni
  • Postów:1027
2
beaver.xv napisał(a):
Adamek Adam napisał(a):

https://github.com/yhirose/cpp-httplib.git

Kopiuj
// HTTP
httplib::Server svr;

svr.Get("/hi", [](const httplib::Request &, httplib::Response &res) {
  res.set_content("Hello World!", "text/plain");
});

svr.listen("0.0.0.0", 8080);

Jako, że nie jestem w 100% płynny w C++, to jeszcze podpytam: czy jest możliwość w tej libce dodania dependency injection na requeście albo w funkcji callbackowej do konkretnego patha?

no to coś takiego:

Kopiuj
void start_server() {
    httplib::Server svr;

    jakas_klasa obiekt;
    
    svr.Get("/hi", [&obiekt](const httplib::Request &, httplib::Response &res) {
        // uwaga na jakieś asynchroniczne listen - wtedy musisz zadbać, żeby `obiekt` nadal był w scopie
        obiekt.metoda();
        res.set_content("Hello World!", "text/plain");
    });

    svr.listen("0.0.0.0", 8080);
}

alternatywnie można jakoś tak:

Kopiuj
httplib::Server setup_routes() {
    httplib::Server svr;

    std::shared_ptr<jakas_klasa> obiekt = std::make_shared(obiekt{});
    
    svr.Get("/hi", [obiekt](const httplib::Request &, httplib::Response &res) {
        obiekt->metoda1();        res.set_content("Hello World!", "text/plain");
    });

    svr.Get("/bye", [obiekt](const httplib::Request &, httplib::Response &res) {
        obiekt->metoda2();        res.set_content("Goodbye World!", "text/plain");
    });

    
    return svr;
}

void start_server(httplib::Server& svr) {
    svr.listen("0.0.0.0", 8080);
}
edytowany 5x, ostatnio: enedil
BX
czyli po prostu w bracketach referencja do obiektu? OK :D
enedil
zaktualizowałem posta
BX
później sprawdzę, jak to będzie działało z moim kodem. wielki plus za pomoc :)
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)