PÄdÄjos divos gados esmu vairÄk pievÄrsies dokumentÄcijai. UzrakstÄ«t skaidrojoÅ”u tekstu par to, kÄ darbojas sistÄma, ir diezgan viegli. UzzÄ«mÄt shÄmu, kurÄ attÄlotas visÄs galvenÄs objekti un to savienojumi, arÄ« ir pavisam viegli.
Bet pats problÄmjautÄjums ir uzturÄt Å”o dokumentÄciju aktuÄlÄ stÄvoklÄ«. Un vÄl labi bÅ«tu, ja runÄtu tikai par tekstu, bet shÄmÄm⦠TÄ kÄ visa dokumentÄcija ir tieÅ”saistÄ, t.i., HTML formÄtÄ, pie teksta pievienojas GIF/JPEG/PNG attÄli, kuros faktiski attÄlotas shÄmas. Un shÄmas tiek zÄ«mÄtas dažÄdÄs programmÄs, piemÄram, Visio vai tieÅ”saistes pakalpojumos, kÄ draw.io. PÄc tam eksportÄ shÄmu grafiskajÄ formÄtÄ un pievieno to HTML. Viss ir vienkÄrÅ”i.
Kas tad ir problÄma?
ShÄmas parasti ir vienkÄrÅ”as. PrecÄ«zÄk, neveido pÄrÄk sarežģītas. JÄ, objekta skaits var bÅ«t desmit vai divpadsmit, un savienojumu skaits aptuveni tikpat. Plus piezÄ«mes, kaut kÄdi apzÄ«mÄjumi. VienkÄrÅ”as shÄmas ir iespÄjams aprakstÄ«t arÄ« vÄrdos, bet pÄrÄk sarežģītu, hmmm⦠(c) "neizpratÄ«s". ShÄmu ir daudz, un izmaiÅas tajÄs ir jÄveic regulÄri - tieÅ”i tÄpÄc, ka tÄs seko mÅ«su produktu attÄ«stÄ«bai.
TaÄu var taÄu iekļaut HTML no pakalpojuma. Tu izmÄÄ£inÄji?
JÄ, protams. Man, piemÄram, patÄ«k grafikas gliffy.com. Bet, lai veiktu izmaiÅas, ir jÄdodas uz treÅ”o puÅ”u pakalpojumu, tur jÄveic izmaiÅas. Un ir grÅ«tÄk deleÄ£Ät kolÄÄ£im, lai viÅÅ” veic labojumus.
Ko darīt?
Nesen GitHub man parÄdÄ«jÄs ieteikumu sarakstÄ repozitorijs . Diagramma kÄ kods. T.i., mÄs aprakstÄm vajadzÄ«go shÄmu js valodÄ. Å o js mÄs rakstÄm tieÅ”i tajÄ paÅ”Ä HTML, kur arÄ« pÄrÄjais dokumentÄcijas teksts.
JÄsaka, ka es nesarakstu dokumentÄciju Ä«sti HTML formÄtÄ. Parasti dokumentÄcija ir failu kopums ar markdown tekstu, kas pÄc tam tiek pÄrvÄrsts par pilnvÄrtÄ«gu dokumentÄcijas vietni, izmantojot kÄdu motoriÅÅ”, piemÄram, wintersmith. Vai wiki sistÄmu.
SanÄk ļoti Ärti: mÄs uzrakstÄm tekstu, pÄc tam atveram tagu script, un tajÄ ir aprakstÄ«ts shÄmas js kods.
Kas atkal nav kÄrtÄ«bÄ?
Å is repozitorijs man ļoti patika, bet tas nav vienÄ«gais piemÄrs, kad diagrammu zÄ«mÄ, izmantojot kodu vai teksta pÄrstÄvniecÄ«bu. (Raksta beigÄs bÅ«s saites uz projektiem un rakstiem, ko esmu atradis par diagrammas izmantoÅ”anu kÄ kodu.)
Un patiesÄ«bÄ es neesmu viens, kas rediÄ£Ä dokumentÄciju. Dažreiz savu ieguldÄ«jumu sniedz arÄ« kolÄÄ£i ā labojot vÄrdus, mainot aprakstus, pievienojot jaunas bildes.Ā
TÄpÄc es vÄlÄtos redzÄt diagrammu saprotamÄ teksta formÄtÄ, kurÄ nebÅ«tu jÄmÄcÄs ilgstoÅ”i. Un dažreiz pat vienkÄrÅ”i veikt copy-paste, lai paÄtrinÄtu jaunas shÄmas pievienoÅ”anu.Ā
Un vÄl viens kolÄÄ£is pamanÄ«ja, ka kods ir, protams, labs, bet, ja izmantos struktÅ«ru, viss var izklausÄ«ties ļoti stingri un izteiksmÄ«gi.
TÄdÄļ es mÄÄ£inÄju attÄlot shÄmu kÄ vairÄkus mazus masÄ«vus, kas apraksta mezglus, saites, mezglu grupas un mezglu novietojumu. ManuprÄt, tas iznÄca pietiekami Ärti, lai gan, protams, par gaumi un krÄsu...
KÄ tas ir diagramma masÄ«vÄ?
- Katrs mezgls tiek aprakstÄ«ts ar identifikatoru, kas viennozÄ«mÄ«gi definÄ mezglu.
- Arī pie mezgla var pievienot ikonu, pievienot uzrakstu.
- Starps diviem mezgliem var norÄdÄ«t saiti.
- SaitÄm shÄmÄ var norÄdÄ«t krÄsu, uzrakstu.
- Saites virziens tiek definÄts no avota uz mÄrÄ·i. Avots un mÄrÄ·is tiek norÄdÄ«ti ar mezglu identifikatoriem.
- Vienu vai vairÄkus mezglus var pievienot grupai.
- Saiti var norÄdÄ«t arÄ« no grupas un uz grupu.
Izmantojot Å”os vienkÄrÅ”os noteikumus, iznÄk Å”Äda shÄma. VienkÄrÅ”i? PilnÄ«gi.

To apraksta Å”Äds js-kods. Galvenais Å”eit ir objekts elements. KurÄ norÄdÄ«ti mezgli ā mezgli, malas ā saites.
Ā
const elements = {
nodes: [ // aprakstÄm mezglus
{ id: 'client', type: 'smartphone', label: 'Mobile App'},
{ id: 'server', type: 'server', label: 'Main Server'},
{ id: 'db1', type: 'database', label: 'DB 1'},
{ id: 'db2', type: 'database', label: 'DB 2'},
],
edges: [ // norÄdÄm saites
{ source: 'client', target: 'server', label: 'request' },
{ source: 'server', target: 'db1', label: 'request' },
{ source: 'server', target: 'db2', label: 'request' },
],
};
Diagram('scheme1', elements);
Protams, shÄmas attÄloÅ”anu es neizdomÄju pats, bet izmantoju bibliotÄku ā ļoti jaudÄ«gs vizualizÄcijas rÄ«ks. Daļu iespÄju, ko savÄ risinÄjumÄ izmantoju, Å”aurinÄts.Ā
Saprotams, tas ir vienkÄrÅ”s piemÄrs. Vai var nedaudz sarežģītÄk?
JÄ, lÅ«dzu. Lai norÄdÄ«tu pozÄ«cijas ā mÄs izmantojam positions, lai norÄdÄ«tu grupas ā norÄdÄm grupu sarakstu groups, bet paÅ”iem elementiem atribÅ«tu group.

Un Ŕis ir kods:
<div id="scheme5" style="height:500px;width:800px;"></div>
<script>
const elements5 = {
groups: [
{ id: 'g1', label: 'ŠŃŃŠæŠæŠ° ŃŠµŃŠ²ŠøŃŠ¾Š² 1'},
{ id: 'g2', label: 'ŠŃŃŠæŠæŠ° ŃŠµŃŠ²ŠøŃŠ¾Š² 2'},
],
nodes: [
{ id: 'man1', type: 'person', label: 'Человек'},
{ id: 'client', type: 'smartphone', label: 'ДмаŃŃŃŠ¾Š½'},
{ id: 'agent-backend', type: 'server', group: 'g1', label: 'agent-backend'},
{ id: 'web', type: 'server', group: 'g1', label: 'ŠŃиложение admin'},
{ id: 'www', type: 'server', group: 'g1', label: 'ŃŃŃŠ°Š½ŠøŃа загŃŃŠ·ŠŗŠø'},
{ id: 'mongodb1', type: 'database', group: 'g1', label: 'Mongo DB 1'},
{ id: 'mongodb2', type: 'database', group: 'g1', label: 'Mongo DB 2'},
{ id: 'runner-integration1', type: 'worker', group: 'g1', label: 'Š¾ŃŠæŃавка'},
{ id: 'runner-integration2', type: 'worker', group: 'g1', label: 'Š¾ŃŠæŃавка'},
{ id: 'api', type: 'server', group: 'g1', label: 'API'},
{ id: 'server2', type: 'server', group:'g2', label: 'ŃŠµŃвеŃ'},
{ id: 'otherServer', type: 'server', group:'g2', label: 'ŃŠµŃвеŃ'},
{ id: 'firebase', type: 'cloud', label: 'Google Firebase'},
],
edges: [
{ source: 'client', target: 'agent-backend', label: 'json', color: 'red' },
{ source: 'agent-backend', target: 'mongodb1', color: 'red' },
{ source: 'agent-backend', target: 'mongodb2', color: 'red' },
{ source: 'mongodb1', target: 'runner-integration1', label: 'Š“Š°Š½Š½ŃŠµ' },
{ source: 'mongodb2', target: 'runner-integration2', label: 'Š“Š°Š½Š½ŃŠµ' },
{ source: 'mongodb1', target: 'web', label: 'Š“Š°Š½Š½ŃŠµ Š“Š»Ń Š¾ŃŠ¾Š±ŃажениŃ' },
{ source: 'runner-integration1', target: 'server2', label: 'Š“Š°Š½Š½ŃŠµ' },
{ source: 'runner-integration2', target: 'otherServer', label: 'Š“Š°Š½Š½ŃŠµ' },
{ source: 'api', target: 'firebase', label: 'Š·Š°ŠæŃŠ¾ŃŃ', color: 'blue', },
{ source: 'firebase', target: 'client', label: 'push', color: 'blue'},
{ source: 'server2', target: 'api', label: 'ŃŠ²ŠµŠ“омлениŃ', color: 'blue'},
{ source: 'man1', target: 'client', },
],
positions: [
{ id: 'client', row: 2, col: 1,},
{ id: 'agent-backend', row: 2, col: 3,},
{ id: 'web', row: 6, col: 3,},
{ id: 'www', row: 1, col: 3,},
{ id: 'mongodb1', row: 1, col: 4,},
{ id: 'mongodb2', row: 2, col: 5,},
{ id: 'runner-integration1', row: 3, col: 3,},
{ id: 'runner-integration2', row: 4, col: 3,},
{ id: 'api', row: 5, col: 3,},
{ id: 'server2', row: 6, col: 7,},
{ id: 'otherServer', row: 4, col: 7,},
{ id: 'firebase', row: 5, col: 1,},
{ id: 'logger', row: 2, col: 7,},
{ id: 'crm', row: 5, col: 8,},
],
};
Diagram('scheme5', elements5, {layout: 'grid'});
</script>
Å Äda shÄma no vienas puses ir gandrÄ«z divi ekrÄni koda uz portatÄ«vÄ datora, no otras puses, struktÅ«ra a`la json ļauj Ätri aizpildÄ«t visus datus pÄc analoÄ£ijas, Ätri un var veikt copy-paste.
Un kÄpÄc positions ir izdalÄ«ts atseviŔķi no mezgliem?
Tas ir ÄrtÄk. SÄkumÄ mÄs norÄdÄm mezglus. PÄc tam varam norÄdÄ«t vairÄkas grupas un iekļaut tÄs mezglos. PÄc tam iegÅ«stam attiecÄ«bas. Un tad, kad galvenie objekti un to attiecÄ«bas ir definÄtas, mÄs pievÄrÅ”amies Å”o objektu izvietojumam shÄmÄ. Vai arÄ« pretÄji.
Bet vai var bez pozÄ«cijÄm?
Var arÄ« bez pozÄ«cijÄm. Bet tas bÅ«s nedaudz sasteigts; piemÄros var redzÄt tÄdu variantu. Tas ir saistÄ«ts ar to, ka cytoscape piedÄvÄ mezglu izvietojuma algoritmu. , kas arÄ« Åem vÄrÄ grupu esamÄ«bu. PozÄ«ciju norÄdīŔana padara shÄmu kontrolÄtÄku, bet pirmÄ skices posmÄ var iztikt arÄ« bez pozÄ«cijÄm.
PozÄ«cijas var norÄdÄ«t arÄ« jÅ«ras kaujas stilÄ. T.i., viens mezgls atrodas a1, bet otrs d5. ÄŖpaÅ”i noderÄ«gi, ka cytoscape veido objektus uz kanvas kÄ kustÄ«gus, t.i., mÄs varam tos pÄrvietot, aplÅ«kot dažÄdus izvietojuma variantus, un pÄc tam fiksÄt kodÄ patÄ«kamo elementu izvietojumu.
KopumÄ viss ir skaidrs. Varam pamÄÄ£inÄt?
Ā
Protams, Ätrai shÄmu izveidei es izveidoju mazliet , kas automÄtiski atjauno shÄmu un pÄrlÅ«kprogrammÄ saglabÄ pÄdÄjo variantu (localStorage).
PamÄÄ£inÄjÄt? Tagad varam pievienot arÄ« pie savas lapas.
Tad vÄlreiz:
1. Pievienojam skriptu
<script src="https://unpkg.com/@antirek/network-diagram@0.1.4/dist/code-full.min.js"></script>
2. Pievienojam HTML kodÄ
<div id="scheme1" style="height:300px;width:800px;"></div>
<script>
const elements = {
nodes: [
{ id: 'client', type: 'smartphone', label: 'Mobile App'},
{ id: 'server', type: 'server', label: 'Main Server'},
{ id: 'db1', type: 'database', label: 'DB 1'},
{ id: 'db2', type: 'database', label: 'DB 2'},
],
edges: [
{ source: 'client', target: 'server', label: 'request' },
{ source: 'server', target: 'db1', label: 'request' },
{ source: 'server', target: 'db2', label: 'request' },
],
};
Diagram('scheme1', elements);
</script>
3. pÄrveidojam kodu lÄ«dz vajadzÄ«gajai shÄmai (domÄju, tas ir vieglÄk nekÄ uzzÄ«mÄt pÅ«ci š
VÄl sÄ«kÄk par to uz GitHub.
Ko mÄs iegÅ«stam?
Es esmu sasniedzis savus mÄrÄ·us ā izveidot shÄmu pievienoÅ”anu tieÅ”saistÄ dokumentÄcijÄ, formÄts ir gana vienkÄrÅ”s un saprotams. Super shÄmÄm tas nederÄs, bet nelielÄm shÄmÄm, kas izskaidro attiecÄ«bu struktÅ«ru ā ir visai noderÄ«gi. VienmÄr var Ätri koreÄ£Ät un laika gaitÄ kaut ko mainÄ«t. JÄ, un kolÄÄ£i var paÅ”i dokumentÄcijÄ kaut ko labot, vismaz objektu apzÄ«mÄjumus bez Ä«paÅ”as apmÄcÄ«bas ))
Ko varÄtu uzlabot?
Te noteikti ir vesela virkne iespÄju. Izveidot iespÄju pievienot papildu ikonÄm (visas esoÅ”Äs ir pievienotas tieÅ”saistÄ skriptÄ). Atrast izteiksmÄ«gÄku ikonu komplektu. Izveidot iespÄju norÄdÄ«t saistÄ«bu lÄ«niju stilu. Pievienot fona attÄlu.
Un kÄdas ir jÅ«su domas?
Ā
Man jau ir dažas idejas realizÄÅ”anai jautÄjumos, jÅ«s arÄ« pievienojiet savas komentÄros.
Mans risinÄjums noteikti ir piemÄrojams Å”auram uzdevumu spektram, un, iespÄjams, jÅ«s atradÄ«siet ÄrtÄku diagrammu zÄ«mÄÅ”anas rÄ«ku, vienkÄrÅ”i to kodÄjot ā kÄ saka 'rÄdi man savu diagrammu kÄ kodu'
-  (9 veidu grafiku tieŔsaistes redaktors)
- Un, ja jums patÄ«k super detalizÄtas un sarežģītas shÄmas ā tad Å”is projekts noteikti jÅ«s pÄrsteigs:
Avots: habr.com
