ããã«ã¡ã¯ãç§ã®ååã¯Dmitry Karlovskyãšç§ã§ã...ç§ã¯æ°åŠã倧奜ãã§ãã ç ããªããªã£ãŠãç§ãšåãããã«åãé¢ãããåããµãŒãã¹ïŒ ãŠãŒã¶ãŒå®çŸ©ã®æ°åŒãå
±æãããŠã³ããŒããåãã軜éã®ã¹ãã¬ããã·ãŒãïŒã®ãµãŒãã¹ãæŽãæµããŸããã
ã¯ã¬ãžããèšç®ã䜿çšããå®äŸïŒ
ãããŠãå€æ¹ã«$ molãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠåããã®ãäœæããæ¹æ³ã説æããŸã...
ããã¯ã©ããªãã±ã¢ã³ã§ããïŒ
$ molã¯ãã¯ãã¹ãã©ãããã©ãŒã ã®ã¬ã¹ãã³ã·ãWebã¢ããªã±ãŒã·ã§ã³ãè¿
éã«äœæããããã®ææ°ã®ãã¬ãŒã ã¯ãŒã¯ã§ãã ããã¯ããã¹ãŠã®ã¢ãžã¥ãŒã«ã«å¯ŸããŠæ¬¡ã®ã«ãŒã«ã確ç«ããMAMã¢ãŒããã¯ãã£ã«åºã¥ããŠããŸãã
- ã¢ãžã¥ãŒã«ã¯ããœãŒã¹ã³ãŒããå«ããã£ã¬ã¯ããªã§ãã
- ãœãŒã¹ã³ãŒãã¯å€ãã®ç°ãªãèšèªã§äœæã§ããŸãã
- ã¢ãžã¥ãŒã«å
ã®ãã¹ãŠã®èšèªã¯åçã§ãã
- ã¢ãžã¥ãŒã«ã¯éå±€ã圢æã§ããŸãã
- ã¢ãžã¥ãŒã«åã¯ããã¡ã€ã«ã·ã¹ãã å
ã®ã¢ãžã¥ãŒã«ãžã®ãã¹ã«å³å¯ã«å¯Ÿå¿ããŠããŸãã
- ã¢ãžã¥ãŒã«éã«äŸåé¢ä¿ãããå¯èœæ§ããããŸãã
- ã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ã«é¢ããæ
å ±ã¯ããã®ãœãŒã¹ã³ãŒãã®éçåæã«ãã£ãŠååŸãããŸãã
- ã¢ãžã¥ãŒã«ã¯ãç°ãªãèšèªïŒjsãcssãããªãŒãªã©ïŒã®ç¬ç«ãããã³ãã«ã®ã»ãããšããŠã¢ã»ã³ãã«ã§ããŸãã
- å®éã«äœ¿çšãããã¢ãžã¥ãŒã«ã®ã¿ããã³ãã«ã«å«ãŸããŸãã
- ã¢ãžã¥ãŒã«ã®ãã¹ãŠã®ãœãŒã¹ã³ãŒãããã³ãã«ã«å
¥ããŸãã
- ã¢ãžã¥ãŒã«ã«ã¯ããŒãžã§ã³ããããŸãã-çŸåšã®ã³ãŒããåžžã«äœ¿çšãããŸãã
- ã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ã€ã¹ã¯æ¡åŒµã®ããã«éããŠããå¿
èŠããããŸãããå€æŽã®ããã«éããŠããå¿
èŠããããŸãã
- å¥ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå¿
èŠãªå Žåã¯ãæ°ããã¢ãžã¥ãŒã«ãäœæããå¿
èŠããããŸãã ããšãã°ã
/my/file/
ããã³/my/file2/
ã§ãã ããã«ãããäž¡æ¹ã®ã€ã³ã¿ãŒãã§ã€ã¹ãæ··åããããšãªã䜿çšã§ããŸãã
äœæ¥ç°å¢
$ molã§ã®éçºã®éå§ã¯éåžžã«ç°¡åã§ãã äžåºŠäœæ¥ç°å¢ããããã€ããŠããããã€ãªã©ã®ã¢ããªã±ãŒã·ã§ã³/ã©ã€ãã©ãªããªãããããŸãã
æåã«ã€ã³ã¹ããŒã«ããå¿
èŠããããŸãïŒ
Windowsã§äœæ¥ããŠããå Žåã¯ããœãŒã¹ã®è¡ã®çµãããå€æŽãããªãããã«GITãæ§æããå¿
èŠããããŸãã
git config
ããã§ãéçºãµãŒããŒãèªåçã«äœæããMAMãããžã§ã¯ãããããã€ããå¿
èŠããããŸãã
git clone https://github.com/eigenmethod/mam.git cd mam npm install npm start
éçºè
ãµãŒããŒãå®è¡ãããŠãããã¹ãŠã®ãã®ã¯ããšãã£ã¿ãŒãéãããšãã§ããŸãã ãšãã£ã¿ãŒã§ã¯ãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ãŸãã¯äŒç€Ÿã®ãããžã§ã¯ãã§ã¯ãªãããããžã§ã¯ãã®MAMãã£ã¬ã¯ããªãéãå¿
èŠãããããšã«æ³šæããŠãã ããã
ã芧ã®ãšããã$ molã§ã®éçºã¯éåžžã«ç°¡åã§ãã MAMã¢ãŒããã¯ãã£ã®åºæ¬ååã¯ããã¹ãŠã®æ©èœããã®ãŸãŸã®ç¶æ
ã§æ©èœããé·æéã®éå±ãªã»ããã¢ãããå¿
èŠãšããªãããšã§ãã
ã¢ããªã±ãŒã·ã§ã³ã¯ã€ã€ãŒãã¬ãŒã
é°è¬ã®ããã«ãã¢ããªã±ãŒã·ã§ã³ã«ã¯ã³ãŒã«ãµã€ã³$mol_app_calc
ãŸãã MAMã«ãŒã«ã«åŸã£ãŠãããã¯ãããã/mol/app/calc/
ãã£ã¬ã¯ããªã«ãªããã°ãªããŸããã å°æ¥çã«ã¯ãããã«ãã¹ãŠã®ãã¡ã€ã«ãäœæããŸãã
ãŸãããšã³ããªãã€ã³ã-ç°¡åãªindex.html
äœæããŸãã
<!doctype html> <html style="height:100%"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1"> <link href="-/web.css" rel="stylesheet"/> </head> <body mol_view_root="$mol_app_calc"> <script src="-/web.js" charset="utf-8"></script> </body> </html>
ã¢ããªã±ãŒã·ã§ã³ã®ããŠã³ããã€ã³ãããã¢ããªã±ãŒã·ã§ã³ãããŠã³ãããããšã瀺ãç¹å¥ãªå±æ§mol_view_root
ã§æå®ããããšãé€ããŠãç¹å¥ãªããšã¯ãããŸããã $ molã®ã¢ãŒããã¯ãã£ã¯ãã©ã®ã³ã³ããŒãã³ããã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒããšããŠæ©èœã§ããããã«ãªã£ãŠããŸãã éã«ã$ molã¢ããªã±ãŒã·ã§ã³ã¯éåžžã®ã³ã³ããŒãã³ãã«ããããå¥ã®ã¢ããªã±ãŒã·ã§ã³å
ã§ç°¡åã«äœ¿çšã§ããŸãã ããšãã°ãã¢ããªã±ãŒã·ã§ã³ã®ã£ã©ãªãŒã§ ã
ã¹ã¯ãªãããšã¹ã¿ã€ã«ãžã®ãã¹ãããã«èŠå®ããããšã«æ³šæããŠãã ãã-ãããã®ãã³ãã«ã¯ã¢ããªã±ãŒã·ã§ã³çšã«èªåçã«åéãããæ¬åœã«å¿
èŠãªãœãŒã¹ã³ãŒãã®ã¿ãå«ãŸããŸãã å°æ¥ãèŠæ®ããŠãã¢ããªã±ãŒã·ã§ã³ã®ç·å®¹éã¯çž®å°ããã«36 KBã«ãªããŸãããå§çž®ãããšæ¬¡ã®ããã«ãªããŸãã
ãã®ãããã¢ããªã±ãŒã·ã§ã³ãšãªãã³ã³ããŒãã³ãã宣èšããã«ã¯ã calc.view.tree
ãã¡ã€ã«ãäœæããå¿
èŠããããŸãã calc.view.tree
ãã¡ã€ã«ã®æãåçŽãªã³ã³ãã³ãã¯1è¡ã®ã¿ã§æ§æãããŠããŸãã
$mol_app_calc $mol_page
2çªç®ã®åèªã¯ããŒã¹ã³ã³ããŒãã³ãã®ååã§ã1çªç®ã®åèªã¯ããŒã¹ã®ã³ã³ããŒãã³ãã®ååã§ãããŒã¹ããç¶æ¿ãããŸãã ãããã£ãŠãåã³ã³ããŒãã³ãã¯ä»ã®ã³ã³ããŒãã³ãã®åŸç¶ã§ãã ä»ã®ãã¹ãŠã®ã³ã³ããŒãã³ãã®æãåºæ¬çãªã³ã³ããŒãã³ãã¯ã $ mol_viewã§ãã ãã¹ãŠã®ã³ã³ããŒãã³ãã«æãåºæ¬çãªã¹ã¿ã€ã«ãšåäœã®ã¿ãæäŸããŸãã ãã®å ŽåãããŒã¹ã³ã³ããŒãã³ãã¯$ mol_pageã«ãªããŸããããã¯ãããããŒãæ¬æãããã³å°äžå®€ãããããŒãžã§ãã
TypeScriptã³ã³ããŒãã³ãã¯ã©ã¹ã¯calc.view.tree
ããèªåçã«çæããã -view.tree/calc.view.tree.ts
é
眮ããããããéçºç°å¢ã§ãã£ããã§ããŸãã
namespace $ { export class $mol_app_calc extends $mol_page { } }
å®éãã¢ããªã±ãŒã·ã§ã³ã¯ãã§ã«http://localhost:8080/mol/app/calc/
ã§éãããšãã§ããã³ãŒã«ãµã€ã³ãã¿ã€ãã«ãšããŠç©ºã®ããŒãžã衚瀺ãããŸãã
view.treeã®æ§æã¯ããªãæ®éã§ã¯ãããŸããããåçŽã§ç°¡æœã§ãã ããã«ã€ããŠã®ã¬ãã¥ãŒã®äžã€ãåŒçšãããŠãã ããïŒ
ããªãŒæ§æã¯éåžžã«èªã¿ãããã§ãããå°ãæ
£ããŠãäºåã«çµäºããªãããã«ããå¿
èŠããããŸãã ç§ã®è³ã¯çŽ1é±éæ¶åããŠinããŠããŸããããåçºãåããŠããã®ãã¬ãŒã ã¯ãŒã¯ãéçºããã»ã¹ãã©ãã ãç°¡çŽ åããŠããããç解ã§ããŸãã ©Vitaliy Makeev
ã ããæãããªãã§ãçªã£èŸŒã¿ãŸãããïŒ ãããŠãããŒãžã®äžè¬çãªã¬ã€ã¢ãŠãããå§ããŸããããããããŒãçŸåšã®ã»ã«ã®ç·šéããã«ãããã³å®éã®ããŒã¿ããŒãã«ã§æ§æãããŸãã
åã³ã³ããŒãã³ãã«ã¯ãã³ã³ããŒãã³ãå
ã§çŽæ¥ã¬ã³ããªã³ã°ããããã®ã®ãªã¹ããè¿ãsub()
ããããã£ããããŸãã $ mol_pageã®å Žåã Head()
ã Body()
Foot()
ããããã£ã®å€ãããã§ã¬ã³ããªã³ã°ããã察å¿ãããµãã³ã³ããŒãã³ããè¿ããŸãã
$mol_page $mol_view sub / <= Head $mol_view <= Body $mol_scroll <= Foot $mol_view
ãã®ã³ãŒãã§ã¯ãèŠç¹ãèŠããããã«ãµãã³ã³ããŒãã³ãã®å®è£
ã®è©³çŽ°ãçç¥ããŠããŸãã ãµãã³ã³ããŒãã³ãïŒBEMçšèªã§ã¯ãèŠçŽ ããšãåŒã°ããŸãïŒã宣èšããããšã«ãããã³ã³ããŒãã³ãã®ã³ã³ããã¹ãã§ãã®ååãšãã€ã³ã¹ã¿ã³ã¹åããå¿
èŠãããã¯ã©ã¹ã®ååã瀺ããŸãã ãã®æ¹æ³ã§äœæãããã³ã³ããŒãã³ãã€ã³ã¹ã¿ã³ã¹ã¯ãã£ãã·ã¥ãããåãååã®ããããã£ãä»ããŠã¢ã¯ã»ã¹ã§ããŸãã ããšãã°ãã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããã¹ãã§this.Body()
ã¯ãã«ã¹ã¿ãã€ãºããã$ mol_scrollã®ã€ã³ã¹ã¿ã³ã¹ãè¿ããŸãã ãã¿ãŒã³ãšããã°ã Body()
ããããã£ã¯ããŒã«ã«ã¬ã€ãžãŒãã¡ã¯ããªãŒãšããŠæ©èœããŸãã
sub()
ããããã£ããªãŒããŒã©ã€ãããŠãå¿
èŠãªã³ã³ããŒãã³ããè¿ããŸãããïŒ
$mol_app_calc $mol_page sub / <= Head - <= Current $mol_bar <= Body $mol_grid
ããã§ã¯ã$ mol_pageãããã£ãããå€ããçŸåšã®ã»ã«ãç·šéããããã®ããã«ãšããŠ$ mol_barãè¿œå ããããŒãžããã£ãšããŠ$ mol_gridã䜿çšããä»®æ³ããŒãã«ãæç»ããããã®ã³ã³ããŒãã³ãã䜿çšããŸããã
çæãããã¯ã©ã¹ãã©ã®ããã«å€æŽãããããèŠãŠã¿ãŸãããã
namespace $ { export class $mol_app_calc extends $mol_page {
$ molååºã¯éåžžã«èªã¿ãããã³ãŒãã§ãã ããã¯ãçæãããã³ãŒãã ãã§ãªãã$ molèªäœã®ã¢ãžã¥ãŒã«ã³ãŒããããã³ããã«åºã¥ããŠäœæãããã¢ããªã±ãŒã·ã§ã³ã®ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã«ãé©çšãããŸãã
ããããããªããžã§ã¯ããã¯ã©ã¹ånew $mol_grid
ã«ããçŽæ¥ã€ã³ã¹ã¿ã³ã¹åã§ã¯new $mol_grid
ããããä»ããŠäœæãããããšã«æ°ã¥ããã§ãããã ã³ã³ããŒãã³ãã«ã¯$
ãã£ãŒã«ããããããã¿ãŒã³ã話ãã°ããŒãã«ã³ã³ããã¹ããŸãã¯ã¬ãžã¹ããªãè¿ããŸãã $
ãã£ãŒã«ããä»ããŠã°ããŒãã«å€ã«ã¢ã¯ã»ã¹ããéç«ã£ãæ©èœã¯ãä»»æã®æ·±ãã§ãã¹ãããããã¹ãŠã®ã³ã³ããŒãã³ãã®ã³ã³ããã¹ããåå®çŸ©ããã³ã³ããŒãã³ãã®æ©èœã§ãã ãããã£ãŠã$ molã¯éåžžã«å®çšçã§æ§ãããªæ¹æ³ã§ã å¶åŸ¡ã®å転ãå®è£
ããŸã ãããã«ãããåå©çšãããã³ã³ããŒãã³ãã®æ·±éšã®ã©ããã§äœ¿çšãããŠããå®è£
ã眮ãæããããšãã§ããŸãã
ããŠãå°ãèãäœãããã¹ããããã³ã³ããŒãã³ããèªåçšã«æ§æããŸãããïŒã°ãªããã¯ãã©ã®åèå¥åãæã€ããã©ã®è¡èå¥åããããŠããŒãã«ã®ããããŒãšæ¬äœã®ã»ã«ã®ãªã¹ãã説æããå¿
èŠããããŸãã
Body $mol_grid col_ids <= col_ids / row_ids <= row_ids / head_cells <= head_cells / cells!row <= cells!row /
çæãããã¯ã©ã¹ã¯ã次ã®èª¬æã§å±éãããŸãã
/// Body $mol_grid /// col_ids <= col_ids - /// row_ids <= row_ids - /// head_cells <= head_cells - /// cells!row <= cells!row - @ $mol_mem Body() { const obj = new this.$.$mol_grid obj.col_ids = () => this.col_ids() obj.row_ids = () => this.row_ids() obj.head_cells = () => this.head_cells() obj.cells = ( row ) => this.cells( row ) return obj }
ã芧ã®ãšãããçµã¿èŸŒã¿ã³ã³ããŒãã³ãã®å¯Ÿå¿ããããããã£ãå®è£
ã«åå®çŸ©ããã ãã§ãã ããã¯éåžžã«ç°¡åã§ãããåæã«ã³ã³ããŒãã³ããäºãã«ãªã¢ã¯ãã£ãã«ãªã³ã¯ã§ãã匷åãªææ³ã§ãã view.tree
æ§æã¯ã3çš®é¡ã®ãã€ã³ãã£ã³ã°ããµããŒãããŠããŸãã
- äžèšã®ã³ãŒãã®ããã«ããã¹ããããã³ã³ããŒãã³ãã«ãã®ããããã£ãè¿ãå€ãäŒãããšãã®å·Šå©ãã
- å³åŽããã¹ããããã³ã³ããŒãã³ãã®ããããã£ã®ãšã€ãªã¢ã¹ãšããŠæ©èœããããããã£ãäœæãããšãã
- åæ¹åãåã蟌ã¿ã³ã³ããŒãã³ãã«ããããã£ã®èªã¿åããšæžã蟌ã¿ãè¡ãããã«æ瀺ãããšãããã¯ç¬èªã®ã³ã³ããŒãã³ãã§æ©èœãããšèããŸãã
åæ¹åãã€ã³ãã£ã³ã°ã説æããããã«ãçŸåšã®ã»ã«ã®ç·šéããã«ã詳ããèŠãŠã¿ãŸãããã
Current $mol_bar sub / <= Pos $mol_string enabled false value <= pos \ <= Edit $mol_string hint \= value?val <=> formula_current?val \
ã芧ã®ãšããã2ã€ã®å
¥åãã£ãŒã«ãã§æ§æãããŠããŸãã
- ã»ã«åº§æšã çŸæç¹ã§ã¯ã
enabled
ããããã£ãenabled
ããŠå€æŽããããšã¯çŠæ¢ãããŠããŸãããã®æ©èœã¯å°æ¥ã®ããã«æ®ããŠãããŸãã - æ°åŒå
¥åãã£ãŒã«ãã ããã§ã¯ãå
¥åãã£ãŒã«ãã®
value
ããããã£ãšformula_current
ããããã£ããã§ã«åæ¹åã§ãã€ã³ãããŠããŸããããã¯ãããã©ã«ãå€ïŒç©ºã®æååïŒãæå®ããŠããã«å®£èšããŸãã
Edit
formula_current
ãšformula_current
ã®ã³ãŒãã¯ãã»ãŒæ¬¡ã®ããã«çæãããŸãã
/// Edit $mol_string /// hint \= /// value?val <=> formula_current?val - @ $mol_mem Edit() { const obj = new this.$.$mol_string obj.hint = () => "=" obj.value = ( val? ) => this.formula_current( val ) return obj } /// formula_current?val \ @ $mol_mem formula_current( val? : string , force? : $mol_atom_force ) { return ( val !== undefined ) ? val : "" }
åå¿åã¡ã¢ãã³ã¬ãŒã¿ãŒ$ mol_memã®ãããã§ã formula_current
ã¡ãœããã«ãã£ãŠè¿ãããå€ã¯ãä»ã®èª°ããå¿
èŠãšãããŸã§ãã£ãã·ã¥ãããŸãã
ãããŸã§ãã³ã³ããŒãã³ãã®æ§æã®å®£èšçãªèšè¿°ãããããŸããã§ããã äœæ¥ã®ããžãã¯ã説æããåã«ãã»ã«ãã©ã®ããã«èŠããããããã«å®£èšããŸãããã
Col_head!id $mol_float dom_name \th horizontal false sub / <= col_title!id \ - Row_head!id $mol_float dom_name \th vertical false sub / <= row_title!id \ - Cell!id $mol_app_calc_cell value <= result!id \ selected?val <=> selected!id?val false
è¡ãšåã®èŠåºãã¯æµ®åããããã $ mol_floatã³ã³ããŒãã³ãã䜿çšããŸããããã¯ãã³ã³ããã¹ããä»ããŠ$ mol_scrollã³ã³ããŒãã³ãã«ãã£ãŠæäŸãããã¹ã¯ããŒã«äœçœ®ã远跡ããåžžã«è¡šç€ºé åã«ããããã«ã³ã³ããŒãã³ããã·ããããŸãã ãããŠãã»ã«ã«å¯ŸããŠãå¥ã®ã³ã³ããŒãã³ã$mol_app_calc_cell
ãéå§ããŸãã
$mol_app_calc_cell $mol_button dom_name \td sub / <= value \ attr * ^ mol_app_calc_cell_selected <= selected?val false mol_app_calc_cell_type <= type?val \ event_click?event <=> select?event null
ãã®ã³ã³ããŒãã³ãã¯ã¯ãªãã¯å¯èœã«ãªãããã $ mol_buttonããç¶æ¿ããŸãã ã¯ãªãã¯ã€ãã³ããselect
ããããã£ã«éä¿¡ããŸããããã«ãããã»ã«ãšãã£ã¿ãŒãã¯ãªãã¯ããããã®ã«åãæ¿ããããŸãã ããã«ãéžæããã»ã«ãç¹å¥ãªæ¹æ³ã§æ§åŒåããæ°å€åã®ã»ã«ã«å³æããè¡ãããã«ãããã«ããã€ãã®å±æ§ãè¿œå ããŸãã å°æ¥çã«ã¯ãã»ã«ã®ã¹ã¿ã€ã«ã¯ã·ã³ãã«ã«ãªããŸãã
[mol_app_calc_cell] { user-select: text; background: var(--mol_skin_card); } [mol_app_calc_cell_selected] { box-shadow: var(--mol_skin_focus_outline); z-index: 1; } [mol_app_calc_cell_type="number"] { text-align: right; }
åãååã®[mol_app_calc_cell]
ã»ã¬ã¯ã¿ãŒã«æ³šæããŠ[mol_app_calc_cell]
-察å¿ããå±æ§ãèªåçã«domããŒãã«è¿œå ãããcssã¯ã©ã¹ã®é
眮ã«ãããæäœæ¥ããããã°ã©ããŒãå®å
šã«æããŸãã ããã«ãããéçºãç°¡çŽ åãããåœåã®äžè²«æ§ã確ä¿ãããŸãã
æåŸã«ãç¬èªã®ããžãã¯ãè¿œå ããããã«ãåå空é$.$$
ã«ã¯ã©ã¹ãäœæããcalc.view.ts
ãäœæããŸã$.$$
ããã¯ãåå空é$
ããåãååã®èªå·±çæã¯ã©ã¹ããç¶æ¿ããŸãã
namespace $.$$ { export class $mol_app_calc_cell extends $.$mol_app_calc_cell {
å®è¡æã«ãäž¡æ¹ã®åå空éã¯åããªããžã§ã¯ããæããŸããã€ãŸããããžãã¯ãæã€ã¯ã©ã¹ã¯ãèªåçæãããã¯ã©ã¹ããç¶æ¿ããåŸãåçŽã«ãã®å Žæã«çœ®ãæãããŸãã ãã®ãããªå·§åŠãªæäœã®ãããã§ãããžãã¯ãæã€ã¯ã©ã¹ã®è¿œå ã¯ãªãã·ã§ã³ã®ãŸãŸã§ãããååãªå®£èšçèšè¿°ããªãå Žåã«ã®ã¿é©çšãããŸãã ããšãã°ã select()
ããããã£ãåå®çŸ©ããŠãã€ãã³ããªããžã§ã¯ããæžã蟌ãããšãããšã selected()
ããããã£ãtrue
å€æŽselected()
ããã«ãtrue
ã
select( event? : Event ) { if( event ) this.selected( true ) }
ãããŠã type()
ããããã£ã¯value()
ããããã£ãåæããããšã§ã»ã«ã¿ã€ããè¿ããŸãïŒ
type() { const value = this.value() return isNaN( Number( value ) ) ? 'string' : 'number' }
ããããããŒãã«ã«æ»ããŸãããã åæ§ã«ãããžãã¯ã$mol_app_calc
ã³ã³ããŒãã³ãã«è¿œå ããŸãã
export class $mol_app_calc extends $.$mol_app_calc { }
ãŸãã row_ids()
è¡èå¥åãšrow_ids()
åã®ãªã¹ããäœæããå¿
èŠããããŸãã
@ $mol_mem col_ids() { return Array( this.dimensions().cols ).join(' ').split(' ').map( ( _ , i )=> this.number2string( i ) ) } @ $mol_mem row_ids() { return Array( this.dimensions().rows ).join(' ').split(' ').map( ( _ , i )=> i + 1 ) }
ãããã¯ãã»ã«å æçã«åºã¥ããŠèšç®ããdimensions()
ããããã£ã«äŸåãããããå¡ãã€ã¶ãããã»ã«ã«ã¯ãå°ãªããšã2ã€ã®ç©ºã®ã»ã«ãå³ãšäžã«ãããŸãã
@ $mol_mem dimensions() { const dims = { rows : 2 , cols : 3 , } for( let key of Object.keys( this.formulas() ) ) { const parsed = /^([AZ]+)(\d+)$/.exec( key ) const rows = Number( parsed[2] ) + 2 const cols = this.string2number( parsed[1] ) + 3 if( rows > dims.rows ) dims.rows = rows if( cols > dims.cols ) dims.cols = cols } return dims }
string2number()
ããã³number2string()
ã¡ãœããã¯ãåã®ã¢ã«ãã¡ããã座æšãæ°å€ã«ããŸãã¯ãã®éã«åçŽã«å€æããŸãã
number2string( numb : number ) { const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' let str = '' do { str = letters[ numb % 26 ] + str numb = Math.floor( numb / 26 ) } while ( numb ) return str } string2number( str : string ) { let numb = 0 for( let symb of str.split( '' ) ) { numb = numb * 26 numb += symb.charCodeAt( 0 ) - 65 } return numb }
æ°åŒã®ã¬ãžã¹ããªã«åºã¥ããŠããŒãã«ã®æ¬¡å
ãèšç®ããŸããããã¯ã formulas()
ããããã£ããååŸããŸãã 次ã®åœ¢åŒã®JSONãè¿ãå¿
èŠããããŸãã
{ "A1" : "12" , "B1" : "=A1*2" }
ãããŠãåŒ#A1=12/B1=%3DA1*2
ã®åŒèªäœãšäœæè¡ã䜿çšããŸãã
@ $mol_mem formulas( next? : { [ key : string ] : string } ) { const formulas : typeof next = {} let args = this.$.$mol_state_arg.dict() if( next ) args = this.$.$mol_state_arg.dict({ ... args , ... next }) const ids = Object.keys( args ).filter( param => /^[AZ]+\d+$/.test( param ) ) for( let id of ids ) formulas[ id ] = args[ id ] return formulas }
ã芧ã®ããã«ã formulas()
ããããã£ã¯å€æŽå¯èœã§ããã€ãŸããã»ã«ã®æ°åŒãèªã¿åãããããä»ããŠã¢ãã¬ã¹ããŒã«æŽæ°ãæžã蟌ãããšãã§ããŸãã ããšãã°ã this.formulas({ 'B1' : '24' })
ãå®è¡ãããšãã¢ãã¬ã¹ããŒã«#A1=12/B1=24
ãŸãã
ã¢ãã¬ã¹ããŒ
ã¯ãã¹ãã©ãããã©ãŒã ã¢ãžã¥ãŒã«$ mol_state_argã䜿çšãããšãèŸæžãªã©ã®ã¢ããªã±ãŒã·ã§ã³ãã©ã¡ãŒã¿ãŒãæäœã§ããŸãããååãšããŠãååã§ç¹å®ã®ãã©ã¡ãŒã¿ãŒãååŸããã³æžã蟌ãæ¹ã䟿å©ã§ãã ããšãã°ããŠãŒã¶ãŒãããŒãã«ã®ååãå€æŽã§ããããã«ããŸããååã¯åã³ã¢ãã¬ã¹ããŒã«ä¿åããŸãã
title( next? : string ) { const title = this.$.$mol_state_arg.value( `title` , next ) return title == undefined ? super.title() : title }
ã芧ã®ãšãããã¢ãã¬ã¹ããŒã«ããŒãã«åãæå®ãããŠããªãå Žåã芪ã¯ã©ã¹ã§æå®ãããååã䜿çšãããŸããããã¯ã calc.view.tree
ããçæãããããããŒãåã«è¡šç€ºãã代ããã«ããããŒå
¥å/åºåãã£ãŒã«ããããããŒã«è¿œå ããŠæŽæ°ããŸãïŒ
head / <= Title_edit $mol_string value?val <=> title?val @ \Spreedsheet <= Tools -
head()
ã¯$ mol_pageã®ããããã£ã§ã Head()
ãµãã³ã³ããŒãã³ãå
ã§ã¬ã³ããªã³ã°ããããã®ã®ãªã¹ããè¿ããŸãã ããã¯ã$ molã®å
žåçãªãã¿ãŒã³ã§ãããã¹ããããã³ã³ããŒãã³ããšãã®ã³ã³ãã³ãã«åãåèªãä»ããŸãããå¯äžã®éãã¯ã³ã³ããŒãã³ãã®ååã倧æåã«ãªã£ãŠããããšã§ãã
Tools()
-ããããŒã®å³åŽã«è¡šç€ºããã$ mol_pageã®ããŒã«ããŒã ããŒãã«ã®ããŠã³ããŒããã¿ã³ãCSVãã¡ã€ã«ãšããŠé
眮ããŠãããã«å
¥åããŸãããã
tools / <= Download $mol_link hint <= download_hint @ \Download file_name <= download_file \ uri <= download_uri?val \ click?event <=> download_generate?event null sub / <= Download_icon $mol_icon_load
$ mol_link-ãªã³ã¯æ§ç¯çšã®ã³ã³ããŒãã³ãã file_name()
ãæå®ããå Žåããããã¯ãªãã¯ãããšãæå®ãããååã§ä¿åããŠãåç
§ã«ãããã¡ã€ã«ãããŠã³ããŒãããããšãææ¡ããŸãã ããŒãã«åã«åºã¥ããŠãã®ååãããã«äœæããŸãããïŒ
download_file() { return `${ this.title() }.csv` }
ããŒã«ãªãŒãŒã·ã§ã³
è±èªã®ããã©ã«ãå€ã®åã®ç¬ã®ã·ã³ãã«ã«æ³šæããŠãã ããã
download_hint @ \Download
ãã®ã·ã³ãã«ãæ¿å
¥ããã ãã§ãã¢ããªã±ãŒã·ã§ã³ã«ããŒã«ã©ã€ãºãµããŒããè¿œå ã§ããŸãã çæãããã¯ã©ã¹ã«ã¯ãããŠã³ããŒããè¡ã¯ãããŸãã-ããŒã«ã©ã€ãºãããããã¹ãã®ãªã¯ãšã¹ãã®ã¿ããããŸãã
/// download_hint @ \Download download_hint() { return $mol_locale.text( "$mol_app_calc_download_hint" ) }
ãŸããè±èªã®ããã¹ãèªäœã¯èªåçã«å¥ã®ãã¡ã€ã«-view.tree/calc.view.tree.locale=en.json
é
眮ãããŸãã
{ "$mol_app_calc_title": "Spreedsheet", "$mol_app_calc_download_hint": "Download" }
ã芧ã®ãšãããããã¹ãã«ã¯äººéãèªã¿åããäžæã®ããŒã圢æãããŠããŸãã ãã®ãã¡ã€ã«ã翻蚳è
ã«æž¡ãã翻蚳è
ããã®ç¿»èš³ã*.locale=*.json
ã®åœ¢åŒã®ãã¡ã€ã«ã«*.locale=*.json
ããšãã§ããŸãã ããšãã°ãã³ã³ããŒãã³ãã®ãã·ã¢èªãžã®ç¿»èš³ããã¡ã€ã«calc.locale=ru.json
ã«è¿œå ããŸãã
{ "$mol_app_calc_title" : " " , "$mol_app_calc_download_hint" : "" }
ãã©ãŠã¶ã®ã¡ã€ã³èšèªãšããŠãã·ã¢èªãèšå®ãããŠããå Žåãã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšããã·ã¢èªã®ããã¹ããå«ããã³ãã«ãéåæã«ããŒããããŸã-/web.locale=ru.json
ãã®éãããŠã³ããŒããé²è¡äžã§ãã翻蚳äŸåã®ã³ã³ããŒãã³ãã¯ãããŠã³ããŒãã€ã³ãžã±ãŒã¿ãèªåçã«è¡šç€ºããŸãã
ã»ã«ãåãã
ãããã£ãŠãè¡ãšåã®èå¥åããããŸãã ã»ã«ã®ãªã¹ããäœæããŸãããã æåã®åèŠåºãïŒ
@ $mol_mem head_cells() { return [ this.Col_head( '' ) , ... this.col_ids().map( colId => this.Col_head( colId ) ) ] }
è¡ããããŒããããããæåã«è¿œå ã®åãè¿œå ããããšã«æ³šæããŠãã ããã è¡ã®ã»ã«ã¯æ¬¡ã®ãšããã§ãã
cells( row_id : number ) { return [ this.Row_head( row_id ) , ... this.col_ids().map( col_id => this.Cell({ row : row_id , col : col_id }) ) ] }
次ã«ãã»ã«çšã«ç·šã¿äžããããããã£ã«ã€ããŠæãåºããŸãã
Cell!id $mol_app_calc_cell value <= result!id \ selected?val <=> selected!id?val false
ã»ã«ã®å Žåããããã¯åãªãæ®éã®ããããã£ã§ãããç§ãã¡ã«ãšã£ãŠã¯ããŒ-ã»ã«ã®èå¥åãåããŸãã
çŸåšã®ã»ã«ã®èå¥åãæ ŒçŽããcurrent()
ããããã£ãå°å
¥ããŸãïŒ
current?val * row 1 col \A
selected()
å®è£
ã§ã¯ãæž¡ãããèå¥åãšçŸåšã®èå¥åã§ã»ã«ãåçŽã«æ¯èŒããŸãã
@ $mol_mem_key selected( id : { row : number , col : string } , next? : boolean ) { return this.Cell( this.current( next ? id : undefined ) ) === this.Cell( id ) }
ãã¡ããã true
selected()
æž¡ãããå Žåãæ°ããèå¥åãçŸåšã®èå¥åãšããŠèšå®ãããã»ã«ã®æ¯èŒãtrue
ã
æåŸã®ä»äžã-ã»ã«ãéžæãããšãã«ããã®ã»ã«ããå€ãšãã£ã¿ãŒèªäœã«ãã©ãŒã«ã¹ã移ããšããã§ãããã
@ $mol_mem current( next? : { row : number , col : string } ) { new $mol_defer( ()=> this.Edit().focused( true ) ) return next || super.current() }
ããã§ã¯ã $ mol_deferã䜿çšããŠãçŸåšã®ã»ã«ã®èå¥åãå€æŽããããã³ã«ãšãã£ã¿ãŒã«ãã©ãŒã«ã¹ã移åããé
延ã¿ã¹ã¯ãèšå®ããŸãã ä¿çäžã®ã¿ã¹ã¯ã¯åãã¢ãã¡ãŒã·ã§ã³ãã¬ãŒã ã§å®è¡ãããããããŠãŒã¶ãŒã¯ãªãã©ãŒã«ã¹ã«ããã¡ãã€ããèŠãããšãã§ããŸããã ãã©ãŒã«ã¹ãããã«ç§»åãããšããšãã£ã¿ãŒã®ãã©ãŒã«ã¹ç¶æ
ã«ãµãã¹ã¯ã©ã€ããããã©ãŒã«ã¹ã移åãããšãçŸåšã®ã»ã«ã®èå¥åããªã»ãããããŸãããããã¯ãã¡ããå¿
èŠãããŸããã
ããŒããŒãããã²ãŒã·ã§ã³
ããŠã¹ãã»ã«ã«çªã£èŸŒãã§ã»ã«éã移åããã®ã¯ããŸã䟿å©ã§ã¯ãããŸããã ããŒããŒãã®ç¢å°ã®æ¹ãéããªããŸãã åŸæ¥ãã¹ãã¬ããã·ãŒãã«ã¯ããã²ãŒã·ã§ã³ã¢ãŒããšç·šéã¢ãŒãã®2ã€ã®ã¢ãŒãããããŸãã ãããã絶ããåãæ¿ããããšãåä»ã§ãã ãããã£ãŠããã€ããšäžç·ã«åããç·šéãšããã²ãŒã·ã§ã³ãçµã¿åãããŸãã ãã©ãŒã«ã¹ã¯åžžã«ã»ã«ç·šéããã«ã«æ®ããŸãããAltããŒãæŒããããšãã«ç¢å°ãæŒããšãç·šéãããã»ã«ãé£ã®ã»ã«ã«å€æŽãããŸãã ãã®ãããªããªãã¯ã«ã¯ããã©ã°ã€ã³ã³ã³ããŒãã³ãã§ããç¹å¥ãªã³ã³ããŒãã³ã$ mol_navããããŸãã
$ molã«ã¯3çš®é¡ã®ã³ã³ããŒãã³ãããããŸãã
- DOMããŒããäœæãããã®ç¶æ
ãå¶åŸ¡ããéåžžã®ã³ã³ããŒãã³ãã
- domããŒããäœæãããæž¡ãããã³ã³ããŒãã³ãã®domããŒãã䜿çšããŠåäœ/衚瀺ãè¿œå ãããã¡ã³ãã ã³ã³ããŒãã³ã ã
- domããŒããäœæãããææè
ã³ã³ããŒãã³ãã®domããŒãã䜿çšããŠåäœ/衚瀺ãè¿œå ãããã©ã°ã€ã³ã³ã³ããŒãã³ã ã
plugins()
. , :
plugins / <= Nav $mol_nav mod_alt true keys_x <= col_ids / keys_y <= row_ids / current_x?val <=> current_col?val \A current_y?val <=> current_row?val 1
, , , . current_col()
current_row()
, current()
:
current_row( next? : number ) { return this.current( next === undefined ? undefined : { ... this.current() , row : next } ).row } current_col( next? : number ) { return this.current( next === undefined ? undefined : { ... this.current() , col : next } ).col }
, Alt+Right
, , , .
ã³ããŒã¢ã³ãããŒã¹ã
, td
dom-, . ctrl
, . , Tab Separated Values , . :
event * paste?event <=> paste?event null
:
paste( event? : ClipboardEvent ) { const table = event.clipboardData.getData( 'text/plain' ).trim().split( '\n' ).map( row => row.split( '\t' ) ) as string[][] if( table.length === 1 && table[0].length === 1 ) return const anchor = this.current() const row_start = anchor.row const col_start = this.string2number( anchor.col ) const patch = {} for( let row in table ) { for( let col in table[ row ] ) { const id = `${ this.number2string( col_start + Number( col ) ) }${ row_start + Number( row ) }` patch[ id ] = table[ row ][ col ] } } this.formulas( patch ) event.preventDefault() }
, â , Microsoft Excel LibreOffice Calc.
â . . . data-uri data:text/csv;charset=utf-8,{'url- }
. CSV Microsoft Excel :
- .
- .
download_generate( event? : Event ) { const table : string[][] = [] const dims = this.dimensions() for( let row = 1 ; row < dims.rows ; ++ row ) { const row_data = [] as any[] table.push( row_data ) for( let col = 0 ; col < dims.cols ; ++ col ) { row_data[ col ] = String( this.result({ row , col : this.number2string( col ) }) ) } } const content = table.map( row => row.map( val => `"${ val.replace( /"/g , '""' ) }"` ).join( ',' ) ).join( '\n' ) this.download_uri( `data:text/csv;charset=utf-8,${ encodeURIComponent( content ) }` ) $mol_defer.run() }
, , dom- . , , .
â , , . , .
. â , . =
, , , .
â , , JavaScript JS . , , - , $mol_func_sandbox , JavaScript :
@ $mol_mem sandbox() { return new $mol_func_sandbox( Math , { 'formula' : this.formula.bind( this ) , 'result' : this.result.bind( this ) , } ) }
, , : .
, .
@ $mol_mem_key func( id : { row : number , col : string } ) { const formula = this.formula( id ) if( formula[0] !== '=' ) return ()=> formula const code = 'return ' + formula.slice( 1 ) .replace( /@([AZ]+)([0-9]+)\b/g , 'formula({ row : $2 , col : "$1" })' ) .replace( /\b([AZ]+)([0-9]+)\b/g , 'result({ row : $2 , col : "$1" })' ) return this.sandbox().eval( code ) }
result
â . , , AB34
, result
. , , , : @AB34
. â , , , .
â result()
:
@ $mol_mem_key result( id : { row : number , col : string } ) { const res = this.func( id ).call() if( res === undefined ) return '' if( res === '' ) return '' if( isNaN( res ) ) return res return Number( res ) }
undefined
, .
. $mol_app_calc . . - . . ã ãã...