ublog

Знайомство з n2o - 7

programming [41]erlang [39]n2o [20]js [7]

Вітаю!

Строки в ерлангу бувають двох видів -

1) спискові строки (списки,list)

"test"


2) бінарні строки (bit strings)

<<"test">>



Що ми можемо робити зі строками?

1) об'єднувати

1> "test1" ++ "test2".
"test1test2"
2> string:join(["111", "222", "333", "444", "555"],", ").
"111, 222, 333, 444, 555"



3> A = <<"test1">>.
<<"test1">>
4> B = <<"test2">>.
<<"test2">>
5> C = <<"тест"/utf8>>.
<<209,130,208,181,209,129,209,130>>
6> D = <<A/binary, B/binary, C/binary>>.
<<116,101,115,116,49,116,101,115,116,50,209,130,208,181,
  209,129,209,130>>
7> io:format("~ts~n",[D]).
test1test2тест
ok


проте, з метою збільшення швидкодії,
рекомендується використовувати io lists (списки вводу-виводу)
ми просто збираємо в один список всі необхідні для виводу дані, наприклад:
8> L = [A,B,C].
[<<"test1">>,<<"test2">>,
 <<209,130,208,181,209,129,209,130>>]
9> io:format("~ts~n",[L]).
test1test2тест
ok


2) розділяти

10> A = <<"111222333444555">>.
<<"111222333444555">>
11> binary:part(A,5,3).
<<"233">>
12> binary:part(A,5,-3).
<<"122">>
13> binary:part(A,2,-3).
** exception error: bad argument
    in function  binary:part/3
        called as binary:part(<<"111222333444555">>,2,-3)
14> binary:part(A,byte_size(A),-5).
<<"44555">>
15> binary:part(A,1,5).            
<<"11222">>
16> binary:part(A,0,5).
<<"11122">>



17> <<B1:4/binary,_/binary>> = A.
<<"111222333444555">>
18> B1.
<<"1112">>
19> <<B1:4/binary, B2:2/binary, B3:4/binary,_/binary>> = A.
<<"111222333444555">>
20> B2.
<<"22">>
21> B3.
<<"3334">>



22> binary:split(<<"123.456.789">>,[<<".">>],[global]).
[<<"123">>,<<"456">>,<<"789">>]
23> binary:split(<<"123.456.789">>,[<<".">>,<<"5">>],[global]).
[<<"123">>,<<"4">>,<<"6">>,<<"789">>]



24> string:split("123.456.789",".",all).
["123","456","789"]



25> string:sub_string("1234567890",2,4).
"234"


3) та інше

26> erlang:byte_size(<<"1122334455">>).
10



27> binary:match(<<"abc abc abc">>, <<"ab">>).
{0,2}
28> binary:matches(<<"abc abc abc">>, <<"ab">>).
[{0,2},{4,2},{8,2}]



29> binary:replace(<<"a-b-c-a-b-c">>, <<"a">>, <<"A">>).
<<"A-b-c-a-b-c">>
30> binary:replace(<<"a-b-c-a-b-c">>, <<"a">>, <<"A">>, [global]).
<<"A-b-c-A-b-c">>


Більше функцій роботи зі строками ви можете знайти в ерланг-документації,
а саме:
http://erlang.org/doc/man/string.html
http://erlang.org/doc/man/binary.html


Переходимо до роботи з кирилицею:
Допустимо у нас є модуль tr з функцією tr з перекладами певних фраз -

tr(<<"en">>, <<"langs">>, <<"native_name">>) -> <<"English">>;
tr(<<"en">>, <<"fruits">>, <<"apple">>) -> <<"Apple">>;
tr(<<"ru">>, <<"langs">>, <<"native_name">>) -> <<"Русский"/utf8>>;
tr(<<"ru">>, <<"fruits">>, <<"apple">>) -> <<"Яблоко"/utf8>>;
tr(<<"uk">>, <<"langs">>, <<"native_name">>) -> <<"Українська"/utf8>>;
tr(<<"uk">>, <<"fruits">>, <<"apple">>) -> <<"Яблуко"/utf8>>;


у даній функції вхідними агументами є код мови та два ключі (їх може бути більше чи менше в залежності від потреби),
по яких ми дістаємо потрібне нам значення

зверніть увагу - для кирилиці прописуємо utf8

також для кирилиці ми використовуємо функції
unicode:characters_to_binary
unicode:characters_to_list
замість
erlang:list_to_binary
erlang:binary_to_list

крім того, там ще можна вказати кодування
(це допомагає коли потрібно перетворити latin1 в utf8)
31> unicode:characters_to_binary("привіт", utf8, utf8).
<<208,191,209,128,208,184,208,178,209,150,209,130>>


що до цього можна додати?
1) існує отака бібліотека для роботи зі строками, включаючи utf8-строки:
https://github.com/erlang-unicode/ux

2) отак виглядатиме наш код, у випадку коли ми з n2o відправляємо кирилицю по вебсокетах
(власне формуємо html і додаємо в певний блок на сторінці) :


InnerHtml1 = tr:tr(Lang, <<"langs">>, <<"native_name">>),
InnerHtml2 = tr:tr(Lang, <<"fruits">>, <<"apple">>),

wf:wire(wf:f("var parent = qi('pagedivid');"
        "var div = document.createElement('div');"
        "div.id='mydivid';"
        "div.innerHTML='<p>~s</p><p>~s</p>';"
        "parent.insertBefore(div, qi('pagedivid').childNodes[1]);",[unicode:characters_to_binary(InnerHtml1,utf8), unicode:characters_to_binary(InnerHtml2,utf8)])),


Пояснення:
unicode:characters_to_binary - слідкує за тим, щоб наша кирилиця не "поламалась"
wf:f - форматує - тобто підставляє наші значення замість міток ~s
wf:wire - власне відправляє js з сервера на клієнт

3) якось отак виглядатиме наше повідомлення для виводу двох-строчного alert-а:
wf:wire(wf:f("alert('~s');",["Hello !\\nWorld !"]))


та вивід кирилиці в консоль:
wf:wire(wf:f("console.log('~s');", [<<"тест"/utf8>>]))



Далі буде)