PageSourceSearch

https://cdn4.hola.org/www/hola/pub/dna/js_code.js

js hola.org collected 2026-09-24 10:18:23 UTC 135,400 bytes, 5,893 lines download raw bytes

1;(function () {// LICENSE_CODE ZON
2  'use strict'; /*jslint browser:true, es6:true, node:true, react:true*/function _typeof(o) {"@babel/helpers - typeof";return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {return typeof o;} : function (o) {return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;}, _typeof(o);}
3  var define;
4  var is_node = (typeof module === "undefined" ? "undefined" : _typeof(module)) == 'object' && module.exports;
5  if (is_node)
6  define = require('../../../../util/require_node.js').define(module, '..');else
7
8  define = self.define;
9  define([], function () {
10    var E = {};
11    E.intro = [['div',
12    [['h1',
13    ["JS Coding Convention"],
14    { className: "title" }],
15
16    ['p',
17    [['b',
18    ["Improvements? Suggestions?"]], " email ",
19
20
21    ['a',
22    ["[email protected]"],
23    { href: "mailto:[email protected]" }], " "]],
24
25
26
27    ['p',
28    [" Coding conventions used by other companies: ",
29    ['a',
30    ["AirBNB"],
31    { href: "https://github.com/airbnb/javascript" }], " | ",
32
33
34    ['a',
35    ["google"],
36    { href: "https://google.github.io/styleguide/javascriptguide.xml" }], " | ",
37
38
39    ['a',
40    ["crockford"],
41    { href: "http://javascript.crockford.com/code.html" }], " | ",
42
43
44    ['a',
45    ["wordpress"],
46    { href: "https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/" }], " | ",
47
48
49    ['a',
50    ["drupal"],
51    { href: "https://www.drupal.org/node/172169" }], " | ",
52
53
54    ['a',
55    ["weflex"],
56    { href: "https://github.com/weflex/javascript" }], " "]]],
57
58
59
60    { className: "head" }]];
61
62    E.data = [
63    {
64      id: 'overview',
65      title: "Overview: consistent & minimal",
66      tag: 'h2',
67      "short": "Overview",
68      html: []
69    },
70    {
71      id: 'overview-consistent',
72      title: "Be consistent",
73      tag: 'h3',
74      "short": "Be consistent",
75      html: [['p',
76      [" If there is no specific rule in this document - ",
77      ['a',
78      ["be consistent with existing codebase"],
79      { href: "/dna#dna-consistent" }], " (use ",
80
81
82      ['a',
83      ["rgrep"],
84      { href: "/dna/dict#rgrep" }], ").",
85
86
87      ['br'], " If you're editing code, take a few minutes to look at the code\n                around you and determine its style.",
88
89
90      ['br'], " If it prints error messages starting with a capital letter,\n                you should too. If it put spaces around complex expressions\n                but not around simple expressions, your complex expressions\n                should also have spaces around them.",
91
92
93
94
95      ['br'], " The point of having style guidelines is to have a common\n                vocabulary of coding, so people can concentrate on what\n                you're saying rather than on how you're saying it.",
96
97
98
99      ['br'], " If code you add to a file looks drastically different from the\n                existing code around it, it throws readers out of their\n                rhythm when they go to read it.",
100
101
102
103      ['br'], " Avoid this. "]]]
104
105
106    },
107    {
108      id: 'overview-minimal',
109      title: "Minimalistic and Condense",
110      tag: 'h3',
111      "short": "Minimalistic",
112      html: [['p',
113      [" Wherever there is no specific rule, ",
114      ['a',
115      ["always prefer minimalism"],
116      { href: "/dna#effective-minimal" }], ".",
117
118
119      ['br'], " Less tokens, higher condensity: get as much code as possible\n                visible within the screen, so less scrolling is needed.",
120
121
122      ['br'], " Sparse, elaborate, defensive code is not appreciated.",
123
124      ['br'],
125      ['a',
126      ["An example of absurd over-engineering"],
127      { href: "https://chaosinmotion.blog/2011/01/25/how-not-to-write-factorial-in-java" }], ". Although it's for Java, but the general idea holds for JS. "]]]
128
129
130
131    },
132    {
133      id: 'overview-tool',
134      title: "Tools",
135      tag: 'h3',
136      "short": "Tools",
137      html: [['p',
138      [" We write code by hand, line-by-line. We do have tools to\n                assist us locating conventions mistakes ",
139
140      ['code',
141      ["zlint -c"]], ", but they are just a 'helpers'.",
142
143
144      ['br'], " The tools match our conventions only ",
145
146      ['b',
147      ["95%"]], ", so its still our personal responsibility to manually make\n                sure line-by-line the code we write matches the conventions\n                ",
148
149
150
151
152      ['b',
153      ["100%"]], ", whether the tool finds the mistakes or not. "]]]
154
155
156
157    },
158    {
159      id: 'overview-text_layout',
160      title: "Text file layout",
161      tag: 'h3',
162      "short": "Text file layout",
163      html: [['p',
164      [" Tab size is 8 spaces.",
165      ['br'], " Shift width (indentation) is 4 spaces.",
166
167      ['br'], " Column width 79 char, so it fits well with 80 col terminal.",
168
169      ['br'], " Indentation is always one shift-width(4):",
170
171      ['br']]],
172
173      ['pre',
174      ["open_msg_box(\"closing file %s on server\\n\",\n             file_name);\n"],
175
176
177      { className: "cm-s-default code bad  has-popover",
178        cat: "bad",
179        'data-content': "BAD",
180        'data-original-title': "",
181        title: "" }],
182
183      ['pre',
184      ["open_msg_box(\"closing file %s on server\\n\",\n    file_name);\n"],
185
186
187      { className: "cm-s-default code good  has-popover",
188        cat: "good",
189        'data-content': "GOOD",
190        'data-original-title': "",
191        title: "" }]]
192
193    },
194    {
195      id: 'format',
196      title: "Formatting and naming",
197      tag: 'h2',
198      "short": "Formatting and naming",
199      html: []
200    },
201    {
202      id: 'format-block',
203      title: "\n  Code blocks and statements",
204
205      tag: 'h3',
206      "short": "Code blocks and statements",
207      html: [['ul',
208      [['li',
209      [['code',
210      ["if"]],
211
212      ['code',
213      ["for"]],
214
215      ['code',
216      ["while"]], " don't require a code block for 0 or 1 statements: open ",
217
218
219      ['code',
220      ["{"]], " on next line. only use a block for multiline blocks. "]],
221
222
223
224      ['li',
225      [['code',
226      ["try"]],
227
228      ['code',
229      ["catch"]],
230
231      ['code',
232      ["function"]], " require a code block in all cases: open ",
233
234
235      ['code',
236      ["{"]], " on the same line. "]]]]]
237
238
239
240
241    },
242    {
243      id: 'format-block-if_for_while',
244      title: "\n  if/for/while",
245
246      tag: 'h4',
247      "short": "if/for/while",
248      html: []
249    },
250    {
251      id: 'format-block-if_for_while-block',
252      title: "\n  if/for/while block",
253
254      tag: 'h5',
255      "short": "block",
256      html: [['p',
257      [['code',
258      ["if"]],
259
260      ['code',
261      ["for"]],
262
263      ['code',
264      ["while"]], " open and close braces of a section should be on the same\n                level."]],
265
266
267
268
269      ['pre',
270      ["if (pkt) {\n    pkt.close();\n    pkt.uninit();\n}\n"],
271
272
273
274
275      { className: "cm-s-default code bad  has-popover",
276        cat: "bad",
277        'data-content': "BAD",
278        'data-original-title': "",
279        title: "" }],
280
281      ['pre',
282      ["if (pkt)\n{\n    pkt.close();\n    pkt.uninit();\n}\n"],
283
284
285
286
287
288      { className: "cm-s-default code good  has-popover",
289        cat: "good",
290        'data-content': "GOOD",
291        'data-original-title': "",
292        title: "" }],
293
294      ['p',
295      [['code',
296      ["if"]],
297
298      ['code',
299      ["for"]],
300
301      ['code',
302      ["while"]], " statement that takes more than one line should always have\n                braces",
303
304
305
306      ['br'], " same thing goes when the then/loop part is more than one line\n                "]],
307
308
309
310      ['pre',
311      ["if (slot.dw_bus==pci_scan.card_slot[ret].dw_bus &&\n    slot.dw_slot==pci_scan.card_slot[ret].dw_slot &&\n    slot.dw_function==pci_scan.card_slot[ret].dw_function)\n{\n    break;\n}\n"],
312
313
314
315
316
317
318      { className: "cm-s-default code good  has-popover",
319        cat: "good",
320        'data-content': "GOOD",
321        'data-original-title': "",
322        title: "" }],
323
324      ['pre',
325      ["if (x==y)\n{\n    my_func(param1, param2, param3, param4, param5, param6,\n        param7);\n}\n"],
326
327
328
329
330
331      { className: "cm-s-default code good  has-popover",
332        cat: "good",
333        'data-content': "GOOD",
334        'data-original-title': "",
335        title: "" }],
336
337      ['pre',
338      ["for (ret=0; ret<pci_scan.dw_cards; ret++)\n    if (slot.dw_bus==pci_scan.card_slot[ret].dw_bus &&\n        slot.dw_slot==pci_scan.card_slot[ret].dw_slot &&\n        slot.dw_function==pci_scan.card_slot[ret].dw_function)\n        break;\n"],
339
340
341
342
343
344      { className: "cm-s-default code bad  has-popover",
345        cat: "bad",
346        'data-content': "BAD",
347        'data-original-title': "",
348        title: "" }],
349
350      ['pre',
351      ["for (ret=0; ret<pci_scan.dw_cards; ret++)\n{\n    if (slot.dw_bus==pci_scan.card_slot[ret].dw_bus &&\n        slot.dw_slot==pci_scan.card_slot[ret].dw_slot &&\n        slot.dw_function==pci_scan.card_slot[ret].dw_function)\n    {\n        break;\n    }\n}\n"],
352
353
354
355
356
357
358
359
360
361      { className: "cm-s-default code good  has-popover",
362        cat: "good",
363        'data-content': "GOOD",
364        'data-original-title': "",
365        title: "" }]]
366
367    },
368    {
369      id: 'format-if_for_while-no_statement',
370      title: "\n  if/for/while without a statement\n",
371
372
373      tag: 'h5',
374      "short": "if/for/while without a statement",
375      html: [['pre',
376      ["while(pop_first(list))\n    ;\n"],
377
378
379      { className: "cm-s-default code bad  has-popover",
380        cat: "bad",
381        'data-content': "BAD",
382        'data-original-title': "",
383        title: "" }],
384
385      ['pre',
386      ["while (pop_first(list));\n"],
387
388      { className: "cm-s-default code good  has-popover",
389        cat: "good",
390        'data-content': "GOOD",
391        'data-original-title': "",
392        title: "" }],
393
394      ['pre',
395      ["for(i=0; i<10; i++)\n    ;\n"],
396
397
398      { className: "cm-s-default code bad  has-popover",
399        cat: "bad",
400        'data-content': "BAD",
401        'data-original-title': "",
402        title: "" }],
403
404      ['pre',
405      ["for (i=0; i<10; i++);\n"],
406
407      { className: "cm-s-default code good  has-popover",
408        cat: "good",
409        'data-content': "GOOD",
410        'data-original-title': "",
411        title: "" }],
412
413      ['pre',
414      ["if (a>b+10)\n    ;\nelse if (a>b+5)\n    do_x();\nelse if (a>b+2)\n    ;\nelse\n    do_y();\n"],
415
416
417
418
419
420
421
422
423      { className: "cm-s-default code bad  has-popover",
424        cat: "bad",
425        'data-content': "BAD",
426        'data-original-title': "",
427        title: "" }],
428
429      ['pre',
430      ["if (a>b+10);\nelse if (a>b+5)\n    do_x();\nelse if (a>b+2);\nelse\n    do_y();\n"],
431
432
433
434
435
436
437      { className: "cm-s-default code good  has-popover",
438        cat: "good",
439        'data-content': "GOOD",
440        'data-original-title': "",
441        title: "" }]]
442
443    },
444    {
445      id: 'format-block-then',
446      title: "Then",
447      tag: 'h5',
448      "short": "Then",
449      html: [['p',
450      [" 'then' part of ",
451      ['code',
452      ["if"]], " statement should be in a separate line. "]],
453
454
455
456      ['pre',
457      ["if (close_file) fclose(fp);\n"],
458
459      { className: "cm-s-default code bad  has-popover",
460        cat: "bad",
461        'data-content': "BAD",
462        'data-original-title': "",
463        title: "" }],
464
465      ['pre',
466      ["if (close_file)\n    fclose(fp);\n"],
467
468
469      { className: "cm-s-default code good  has-popover",
470        cat: "good",
471        'data-content': "GOOD",
472        'data-original-title': "",
473        title: "" }]]
474
475    },
476    {
477      id: 'format-block-else_if',
478      title: "else if",
479      tag: 'h5',
480      "short": "else if",
481      html: [['p',
482      [['code',
483      ["else if"]], " statements should be on the same level at the starting ",
484
485
486      ['code',
487      ["if"]], " reason: this is similar to ",
488
489
490      ['code',
491      ["switch"]], " statement "]],
492
493
494
495      ['pre',
496      ["if (argv[1]===\"--help\") print_usage();\nelse if (argv[1]===\"--run\") {\n    run_application();\n    print_results();\n} else print_error();\n"],
497
498
499
500
501
502      { className: "cm-s-default code bad  has-popover",
503        cat: "bad",
504        'data-content': "BAD",
505        'data-original-title': "",
506        title: "" }],
507
508      ['pre',
509      ["if (argv[1]===\"--help\")\n    print_usage();\nelse if (argv[1]===\"--run\")\n{\n    run_application();\n    print_results();\n}\nelse\n    print_error();\n"],
510
511
512
513
514
515
516
517
518
519      { className: "cm-s-default code good  has-popover",
520        cat: "good",
521        'data-content': "GOOD",
522        'data-original-title': "",
523        title: "" }]]
524
525    },
526    {
527      id: 'format-block-func',
528      title: "Functions",
529      tag: 'h4',
530      "short": "Functions",
531      html: [['p',
532      [" Tiny functions: same line.",
533      ['br'], " One-liner: body in second line.",
534
535      ['br'], " Two lines and above: a proper block. if anon ",
536
537      ['code',
538      ["function"]], ": block open in same line.",
539
540
541      ['br']]],
542
543      ['pre',
544      ["var tiny = function(){code;};\nvar tiny = function() { code; };\n"],
545
546
547      { className: "cm-s-default code bad  has-popover",
548        cat: "bad",
549        'data-content': "BAD",
550        'data-original-title': "",
551        title: "" }],
552
553      ['pre',
554      ["var tiny = function(){ code; };\n"],
555
556      { className: "cm-s-default code good  has-popover",
557        cat: "good",
558        'data-content': "GOOD",
559        'data-original-title': "",
560        title: "" }],
561
562      ['pre',
563      ["var tiny = function()\n{\n    code;\n};\n"],
564
565
566
567
568      { className: "cm-s-default code bad  has-popover",
569        cat: "bad",
570        'data-content': "BAD",
571        'data-original-title': "",
572        title: "" }],
573
574      ['pre',
575      ["var tiny = function(){\n    code; };\nvar tiny = function(){\n    code;\n};\n"],
576
577
578
579
580
581      { className: "cm-s-default code good  has-popover",
582        cat: "good",
583        'data-content': "GOOD",
584        'data-original-title': "",
585        title: "" }],
586
587      ['pre',
588      ["function tiny(){code;};\nfunction tiny() { code; };\nfunction tiny()\n{\n    code;\n}\n"],
589
590
591
592
593
594
595      { className: "cm-s-default code bad  has-popover",
596        cat: "bad",
597        'data-content': "BAD",
598        'data-original-title': "",
599        title: "" }],
600
601      ['pre',
602      ["function tiny(){ code; }\nfunction tiny(){\n    code; }\nfunction tiny(){\n    code;\n}\n"],
603
604
605
606
607
608
609      { className: "cm-s-default code good  has-popover",
610        cat: "good",
611        'data-content': "GOOD",
612        'data-original-title': "",
613        title: "" }],
614
615      ['pre',
616      ["function long(args){\n    code;\n    code; }\nfunction long(args)\n{\n    code;\n    code;\n}\n"],
617
618
619
620
621
622
623
624
625      { className: "cm-s-default code bad  has-popover",
626        cat: "bad",
627        'data-content': "BAD",
628        'data-original-title': "",
629        title: "" }],
630
631      ['pre',
632      ["function long(args){\n    code;\n    code;\n}\n"],
633
634
635
636
637      { className: "cm-s-default code good  has-popover",
638        cat: "good",
639        'data-content': "GOOD",
640        'data-original-title': "",
641        title: "" }],
642
643      ['pre',
644      ["function long_args(a1, a2, a3,\n    a4){\n    code;\n    code;\n}\n"],
645
646
647
648
649
650      { className: "cm-s-default code bad  has-popover",
651        cat: "bad",
652        'data-content': "BAD",
653        'data-original-title': "",
654        title: "" }],
655
656      ['pre',
657      ["function long_args(a1, a2, a3,\n    a4)\n{\n    code;\n    code;\n}\n"],
658
659
660
661
662
663
664      { className: "cm-s-default code good  has-popover",
665        cat: "good",
666        'data-content': "GOOD",
667        'data-original-title': "",
668        title: "" }]]
669
670    },
671    {
672      id: 'format-block-func-inline',
673      title: "Inline functions",
674      tag: 'h5',
675      "short": "Inline functions",
676      html: [['p',
677      ["Function definition that fits the line:"]],
678
679      ['pre',
680      ["let x = parse_args(...args, function(line){\n    let escaped = E.escape(line);\n    ...\n});\n"],
681
682
683
684
685      { className: "cm-s-default code good  has-popover",
686        cat: "good",
687        'data-content': "GOOD",
688        'data-original-title': "",
689        title: "" }],
690
691      ['p',
692      ["Function definition that does not fit the line:"]],
693
694      ['pre',
695      ["let x = parse_args(a, b, c, d, e,\nfunction(line, err)\n{\n    let escaped = E.escape(line);\n    ...\n});\n"],
696
697
698
699
700
701
702      { className: "cm-s-default code bad  has-popover",
703        cat: "bad",
704        'data-content': "BAD",
705        'data-original-title': "",
706        title: "" }],
707
708      ['pre',
709      ["let x = parse_args(a, b, c, d, e, function(line,\n    err)\n{\n    let escaped = E.escape(line);\n    ...\n});\n"],
710
711
712
713
714
715
716      { className: "cm-s-default code good  has-popover",
717        cat: "good",
718        'data-content': "GOOD",
719        'data-original-title': "",
720        title: "" }],
721
722      ['pre',
723      ["let x = parse_args(a, b, c, d, e,\n    function(line, err){\n        let escaped = E.escape(line);\n        ...\n    });\n"],
724
725
726
727
728
729      { className: "cm-s-default code good  has-popover",
730        cat: "good",
731        'data-content': "GOOD",
732        'data-original-title': "",
733        title: "" }],
734
735      ['pre',
736      ["let x = parse_args(a, b, c, d, e,\n    function(line, err)\n{\n    let escaped = E.escape(line);\n    ...\n});\n"],
737
738
739
740
741
742
743      { className: "cm-s-default code good  has-popover",
744        cat: "good",
745        'data-content': "GOOD",
746        'data-original-title': "",
747        title: "" }]]
748
749    },
750    {
751      id: 'format-block-func-spacing',
752      title: "Functions spacing",
753      tag: 'h5',
754      "short": "Functions spacing",
755      html: [['p',
756      [" No space between function name and opening parenthesis",
757      ['br'], " No space between opening parenthesis and first parameter",
758
759      ['br'], " One space after comma: "]],
760
761
762      ['pre',
763      ["printf (\"hello %s\\n\", \"world\");\nprintf( \"hello world\\n\" );\nprintf(\"hello world\\n\",\"world\");\n"],
764
765
766
767      { className: "cm-s-default code bad  has-popover",
768        cat: "bad",
769        'data-content': "BAD",
770        'data-original-title': "",
771        title: "" }],
772
773      ['pre',
774      ["printf(\"hello %s\\n\", \"world\");\n"],
775
776      { className: "cm-s-default code good  has-popover",
777        cat: "good",
778        'data-content': "GOOD",
779        'data-original-title': "",
780        title: "" }]]
781
782    },
783    {
784      id: 'format-block-break_line',
785      title: "Breaking a long line",
786      tag: 'h4',
787      "short": "Breaking a long line",
788      html: [['p',
789      ["When breaking up a long line, it should continue with one\n                shift-width for indentation"]],
790
791
792      ['pre',
793      ["if (line_length>1 && (screen.sz.vertical<buffer.sz.vertical\n                      || explicit_lines))\n{\n    console.log(\"this is a test section that will show how to handle \"+\n                \"long lines, such as this one which is 2 lines long\");\n}\n"],
794
795
796
797
798
799
800      { className: "cm-s-default code bad  has-popover",
801        cat: "bad",
802        'data-content': "BAD",
803        'data-original-title': "",
804        title: "" }],
805
806      ['pre',
807      ["if (line_length>1 && (screen.sz.vertical<buffer.sz.vertical\n    || explicit_lines))\n{\n    console.log('this is a test section that will show how to handle '+\n        'long lines, such as this one which is 2 lines long');\n}\n"],
808
809
810
811
812
813
814      { className: "cm-s-default code good  has-popover",
815        cat: "good",
816        'data-content': "GOOD",
817        'data-original-title': "",
818        title: "" }]]
819
820    },
821    {
822      id: 'format-block-switch',
823      title: "\n  switch statements",
824
825      tag: 'h4',
826      "short": "Switch statement",
827      html: [['p',
828      [['code',
829      ["switch"]], " statements should have ",
830
831
832      ['code',
833      ["case"]], " on the same level, no space before ",
834
835
836      ['code',
837      [":"]], ".",
838
839
840      ['br']]],
841
842      ['pre',
843      ["switch (key)\n{\n    case KEY_UP :\n        key = UP;\n        break;\n    case KEY_DOWN :\n        key = DN;\n        break;\n    default :\n        key = NONE;\n}\n"],
844
845
846
847
848
849
850
851
852
853
854
855      { className: "cm-s-default code bad  has-popover",
856        cat: "bad",
857        'data-content': "BAD",
858        'data-original-title': "",
859        title: "" }],
860
861      ['pre',
862      ["switch (key)\n{\ncase KEY_UP:\n    key = UP;\n    break;\ncase KEY_DOWN:\n    key = DN;\n    break;\ndefault:\n    key = NONE;\n}\n"],
863
864
865
866
867
868
869
870
871
872
873
874      { className: "cm-s-default code good  has-popover",
875        cat: "good",
876        'data-content': "GOOD",
877        'data-original-title': "",
878        title: "" }],
879
880      ['pre',
881      ["switch (key)\n{\ncase KEY_UP: key = UP; break;\ncase KEY_DOWN: key = DN; break;\ndefault: key = NONE;\n}\n"],
882
883
884
885
886
887
888      { className: "cm-s-default code good  has-popover",
889        cat: "good",
890        'data-content': "GOOD",
891        'data-original-title': "",
892        title: "" }],
893
894      ['p',
895      [" 1-liner ",
896      ['code',
897      ["case"]], ": with single statement plus ",
898
899
900      ['code',
901      ["break"]], ", or a ",
902
903
904      ['code',
905      ["return"]], " statement. "]],
906
907
908
909      ['pre',
910      ["switch (key)\n{\ncase KEY_UP:\n    line--;\n    break;\ncase KEY_DOWN:\n    for (x=line; x; x--)\n        line++;\n    break;\ncase KEY_ESC:\n    return;\ndefault:\n    bubble = true;\n}\n"],
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925      { className: "cm-s-default code bad  has-popover",
926        cat: "bad",
927        'data-content': "BAD",
928        'data-original-title': "",
929        title: "" }],
930
931      ['pre',
932      ["switch (key)\n{\ncase KEY_UP: line--; break;\ncase KEY_DOWN:\n    for (x=line; x; x--)\n        line++;\n    break;\ncase KEY_ESC: return;\ndefault: bubble = true;\n}\n"],
933
934
935
936
937
938
939
940
941
942
943      { className: "cm-s-default code good  has-popover",
944        cat: "good",
945        'data-content': "GOOD",
946        'data-original-title': "",
947        title: "" }],
948
949      ['p',
950      ["Never ",
951      ['code',
952      ["break"]], " after ",
953
954
955      ['code',
956      ["return"]]]],
957
958
959      ['pre',
960      ["switch (key)\n{\ncase KEY_UP: line--; break;\ncase KEY_ESC: return; break;\n}\n"],
961
962
963
964
965
966      { className: "cm-s-default code bad  has-popover",
967        cat: "bad",
968        'data-content': "BAD",
969        'data-original-title': "",
970        title: "" }],
971
972      ['pre',
973      ["switch (key)\n{\ncase KEY_UP: line--; break;\ncase KEY_ESC: return;\n}\n"],
974
975
976
977
978
979      { className: "cm-s-default code good  has-popover",
980        cat: "good",
981        'data-content': "GOOD",
982        'data-original-title': "",
983        title: "" }],
984
985      ['p',
986      ["Never ",
987      ['code',
988      ["break"]], " at end of ",
989
990
991      ['code',
992      ["default"]]]],
993
994
995      ['pre',
996      ["switch (key)\n{\ncase KEY_UP: line--; break;\ndefault: line++; break;\n}\n"],
997
998
999
1000
1001
1002      { className: "cm-s-default code bad  has-popover",
1003        cat: "bad",
1004        'data-content': "BAD",
1005        'data-original-title': "",
1006        title: "" }],
1007
1008      ['pre',
1009      ["switch (key)\n{\ncase KEY_UP: line--; break;\ndefault: line++;\n}\n"],
1010
1011
1012
1013
1014
1015      { className: "cm-s-default code good  has-popover",
1016        cat: "good",
1017        'data-content': "GOOD",
1018        'data-original-title': "",
1019        title: "" }]]
1020
1021    },
1022    {
1023      id: 'format-block-reserved',
1024      title: "Reserved words",
1025      tag: 'h4',
1026      "short": "Reserved words",
1027      html: [['p',
1028      [" One space after reserved words before the opening parenthesis,\n                except for ",
1029
1030      ['code',
1031      ["function"]], " and ",
1032
1033
1034      ['code',
1035      ["catch"]], " (which is function like): "]],
1036
1037
1038
1039      ['pre',
1040      ["if(close_file)\n"],
1041
1042      { className: "cm-s-default code bad  has-popover",
1043        cat: "bad",
1044        'data-content': "BAD",
1045        'data-original-title': "",
1046        title: "" }],
1047
1048      ['pre',
1049      ["if (close_file)\n"],
1050
1051      { className: "cm-s-default code good  has-popover",
1052        cat: "good",
1053        'data-content': "GOOD",
1054        'data-original-title': "",
1055        title: "" }],
1056
1057      ['pre',
1058      ["for(i=0; !is_last(i); i++);\n"],
1059
1060      { className: "cm-s-default code bad  has-popover",
1061        cat: "bad",
1062        'data-content': "BAD",
1063        'data-original-title': "",
1064        title: "" }],
1065
1066      ['pre',
1067      ["for (i=0; !is_last(i); i++);\n"],
1068
1069      { className: "cm-s-default code good  has-popover",
1070        cat: "good",
1071        'data-content': "GOOD",
1072        'data-original-title': "",
1073        title: "" }],
1074
1075      ['pre',
1076      ["try{ code; } catch (e) { code; }\n"],
1077
1078      { className: "cm-s-default code bad  has-popover",
1079        cat: "bad",
1080        'data-content': "BAD",
1081        'data-original-title': "",
1082        title: "" }],
1083
1084      ['pre',
1085      ["try { code; } catch(e){ code; }\n"],
1086
1087      { className: "cm-s-default code good  has-popover",
1088        cat: "good",
1089        'data-content': "GOOD",
1090        'data-original-title': "",
1091        title: "" }],
1092
1093      ['pre',
1094      ["var t = function (api) { api('test'); };\n"],
1095
1096      { className: "cm-s-default code bad  has-popover",
1097        cat: "bad",
1098        'data-content': "BAD",
1099        'data-original-title': "",
1100        title: "" }],
1101
1102      ['pre',
1103      ["var t = function(api){ api('test'); };\n"],
1104
1105      { className: "cm-s-default code good  has-popover",
1106        cat: "good",
1107        'data-content': "GOOD",
1108        'data-original-title': "",
1109        title: "" }]]
1110
1111    },
1112    {
1113      id: 'format-block-try_catch',
1114      title: "\n  try-catch",
1115
1116      tag: 'h4',
1117      "short": "try-catch",
1118      html: [['p',
1119      [" Multiline ",
1120      ['code',
1121      ["try"]], ": close block on ",
1122
1123
1124      ['code',
1125      ["catch"]], " line (like ",
1126
1127
1128      ['code',
1129      ["do-while"]], "): "]],
1130
1131
1132
1133      ['pre',
1134      ["try { short_code; } catch(e){ code; }\n"],
1135
1136      { className: "cm-s-default code good  has-popover",
1137        cat: "good",
1138        'data-content': "GOOD",
1139        'data-original-title': "",
1140        title: "" }],
1141
1142      ['pre',
1143      ["try {\n    longer_code; }\ncatch(e){ code; }\n"],
1144
1145
1146
1147      { className: "cm-s-default code good  has-popover",
1148        cat: "good",
1149        'data-content': "GOOD",
1150        'data-original-title': "",
1151        title: "" }],
1152
1153      ['pre',
1154      ["try {\n    and_even;\n    longer_code;\n} catch(e){ code; }\n"],
1155
1156
1157
1158
1159      { className: "cm-s-default code good  has-popover",
1160        cat: "good",
1161        'data-content': "GOOD",
1162        'data-original-title': "",
1163        title: "" }],
1164
1165      ['p',
1166      ["Catch variable should be named 'e'"]],
1167
1168      ['pre',
1169      ["try { res = yield etask.nfn_apply(zmongo.collection, '.save', [obj]); }\ncatch(error){ handle_error(zmongo, 'save', error, obj); }\n"],
1170
1171
1172      { className: "cm-s-default code bad  has-popover",
1173        cat: "bad",
1174        'data-content': "BAD",
1175        'data-original-title': "",
1176        title: "" }],
1177
1178      ['pre',
1179      ["try { res = yield etask.nfn_apply(zmongo.collection, '.save', [obj]); }\ncatch(e){ handle_error(zmongo, 'save', e, obj); }\n"],
1180
1181
1182      { className: "cm-s-default code good  has-popover",
1183        cat: "good",
1184        'data-content': "GOOD",
1185        'data-original-title': "",
1186        title: "" }]]
1187
1188    },
1189    {
1190      id: 'format-block-operator',
1191      title: "Operator spacing",
1192      tag: 'h4',
1193      "short": "Operator spacing",
1194      html: [['p',
1195      [" both sides should be equal: either space before and after, or\n                no spaces at all. "]]]
1196
1197
1198    },
1199    {
1200      id: 'format-block-operator-trivial',
1201      title: "\n  Trivial > >= < <= == != expressions",
1202
1203      tag: 'h5',
1204      "short": "Trivial expressions",
1205      html: [['p',
1206      [" Trivial ",
1207      ['code',
1208      ["> >= < <= == !="]], " expressions should not have spaces around them: ",
1209
1210
1211      ['code',
1212      ["a_var"]], ". "]],
1213
1214
1215
1216      ['pre',
1217      ["if (x> 5)\nif (x >5)\nif (x > 5)\n"],
1218
1219
1220
1221      { className: "cm-s-default code bad  has-popover",
1222        cat: "bad",
1223        'data-content': "BAD",
1224        'data-original-title': "",
1225        title: "" }],
1226
1227      ['pre',
1228      ["if (x>5)\n"],
1229
1230      { className: "cm-s-default code good  has-popover",
1231        cat: "good",
1232        'data-content': "GOOD",
1233        'data-original-title': "",
1234        title: "" }],
1235
1236      ['p',
1237      [" Nearly-trivial expressions can be with or without spaces: ",
1238      ['code',
1239      ["a[3]"]], ", ",
1240
1241
1242      ['code',
1243      ["f(x)"]], ", ",
1244
1245
1246      ['code',
1247      ["x.y.z"]], ", ",
1248
1249
1250      ['code',
1251      ["a.b.c(x, y, z)"]], ". "]],
1252
1253
1254
1255      ['pre',
1256      ["if (f(x, y) > g(y, z))\nif (f(x, y)>g(y, z))\nif (x.y == 5)\nif (x.y==5)\nif (x.y>=5)\nif (x.y >= 5)\n"],
1257
1258
1259
1260
1261
1262
1263      { className: "cm-s-default code good  has-popover",
1264        cat: "good",
1265        'data-content': "GOOD",
1266        'data-original-title': "",
1267        title: "" }],
1268
1269      ['p',
1270      [" We consider simple short arithmetics also as nearly-trivial\n                expressions: ",
1271
1272      ['code',
1273      ["x+1"]], ", ",
1274
1275
1276      ['code',
1277      ["2*x"]], ". "]],
1278
1279
1280
1281      ['pre',
1282      ["if (x+1>5)\nif (x+1 > 5)\n"],
1283
1284
1285      { className: "cm-s-default code good  has-popover",
1286        cat: "good",
1287        'data-content': "GOOD",
1288        'data-original-title': "",
1289        title: "" }],
1290
1291      ['p',
1292      ["if one side is not trivial, then must have spaces."]],
1293
1294      ['pre',
1295      ["if (a&&a.b)\nif (a && a.b)\n"],
1296
1297
1298      { className: "cm-s-default code good  has-popover",
1299        cat: "good",
1300        'data-content': "GOOD",
1301        'data-original-title': "",
1302        title: "" }],
1303
1304      ['pre',
1305      ["if (!a&&a.b)\n"],
1306
1307      { className: "cm-s-default code bad  has-popover",
1308        cat: "bad",
1309        'data-content': "BAD",
1310        'data-original-title': "",
1311        title: "" }],
1312
1313      ['pre',
1314      ["if (!a && a.b)\n"],
1315
1316      { className: "cm-s-default code good  has-popover",
1317        cat: "good",
1318        'data-content': "GOOD",
1319        'data-original-title': "",
1320        title: "" }],
1321
1322      ['p',
1323      ["if one side is long, then prefer to have spaces."]],
1324
1325      ['pre',
1326      ["if (a&&Array.isArray(a))\n"],
1327
1328      { className: "cm-s-default code ok  has-popover",
1329        cat: "ok",
1330        'data-content': "OK",
1331        'data-original-title': "",
1332        title: "" }],
1333
1334      ['pre',
1335      ["if (a && Array.isArray(a))\n"],
1336
1337      { className: "cm-s-default code good  has-popover",
1338        cat: "good",
1339        'data-content': "GOOD",
1340        'data-original-title': "",
1341        title: "" }]]
1342
1343    },
1344    {
1345      id: 'format-block-operator-assign',
1346      title: "\n  Assignments spaces",
1347
1348      tag: 'h5',
1349      "short": "Assignments spaces",
1350      html: [['p',
1351      [" Spaces around assignments ",
1352      ['code',
1353      ["= += -= *= /= &= |="]], " are not mandatory in ",
1354
1355
1356      ['code',
1357      ["for()"]], " loops. "]],
1358
1359
1360
1361      ['pre',
1362      ["a=b;\nd+=x;\n"],
1363
1364
1365      { className: "cm-s-default code bad  has-popover",
1366        cat: "bad",
1367        'data-content': "BAD",
1368        'data-original-title': "",
1369        title: "" }],
1370
1371      ['pre',
1372      ["a = b;\nd += x;\n"],
1373
1374
1375      { className: "cm-s-default code good  has-popover",
1376        cat: "good",
1377        'data-content': "GOOD",
1378        'data-original-title': "",
1379        title: "" }],
1380
1381      ['pre',
1382      ["for (i=0; i<10; i+=4);\nfor (i = 0; i<10; i += 4);\n"],
1383
1384
1385      { className: "cm-s-default code good  has-popover",
1386        cat: "good",
1387        'data-content': "GOOD",
1388        'data-original-title': "",
1389        title: "" }]]
1390
1391    },
1392    {
1393      id: 'format-block-operator-unary',
1394      title: "Unary operators",
1395      tag: 'h5',
1396      "short": "Unary operators",
1397      html: [['p',
1398      [" Don't put a space after ",
1399      ['code',
1400      ["++"]],
1401
1402      ['code',
1403      ["--"]],
1404
1405      ['code',
1406      ["!"]], ", and other unary operators. increment after the value, not\n                before. "]],
1407
1408
1409
1410
1411      ['pre',
1412      ["i --;\n++j;\n"],
1413
1414
1415      { className: "cm-s-default code bad  has-popover",
1416        cat: "bad",
1417        'data-content': "BAD",
1418        'data-original-title': "",
1419        title: "" }],
1420
1421      ['pre',
1422      ["i--;\nj++;\n"],
1423
1424
1425      { className: "cm-s-default code good  has-popover",
1426        cat: "good",
1427        'data-content': "GOOD",
1428        'data-original-title': "",
1429        title: "" }],
1430
1431      ['pre',
1432      ["if (! i)\n"],
1433
1434      { className: "cm-s-default code bad  has-popover",
1435        cat: "bad",
1436        'data-content': "BAD",
1437        'data-original-title': "",
1438        title: "" }],
1439
1440      ['pre',
1441      ["if (!i)\n"],
1442
1443      { className: "cm-s-default code good  has-popover",
1444        cat: "good",
1445        'data-content': "GOOD",
1446        'data-original-title': "",
1447        title: "" }],
1448
1449      ['pre',
1450      ["var speed_int = + speed_str;\n"],
1451
1452      { className: "cm-s-default code bad  has-popover",
1453        cat: "bad",
1454        'data-content': "BAD",
1455        'data-original-title': "",
1456        title: "" }],
1457
1458      ['pre',
1459      ["var speed_int = +speed_str;\n"],
1460
1461      { className: "cm-s-default code good  has-popover",
1462        cat: "good",
1463        'data-content': "GOOD",
1464        'data-original-title': "",
1465        title: "" }]]
1466
1467    },
1468    {
1469      id: 'format-block-operator-multi',
1470      title: "\n  Multiple +",
1471
1472      tag: 'h5',
1473      "short": "Multiple +",
1474      html: [['p',
1475      [" Multiple ",
1476      ['code',
1477      ["+"]], " operators are trivial expressions, and thus we prefer not to\n                put spaces around them (such as string concatenation). "]],
1478
1479
1480
1481
1482      ['pre',
1483      ["msg = 'hello ' + name + '!';\n"],
1484
1485      { className: "cm-s-default code bad  has-popover",
1486        cat: "bad",
1487        'data-content': "BAD",
1488        'data-original-title': "",
1489        title: "" }],
1490
1491      ['pre',
1492      ["msg = 'hello '+name+'!';\nmsg = 'hello '+get_my_name()+'!';\nmsg = 'hello ' + get_my_name()+'!';\n"],
1493
1494
1495
1496      { className: "cm-s-default code good  has-popover",
1497        cat: "good",
1498        'data-content': "GOOD",
1499        'data-original-title': "",
1500        title: "" }]]
1501
1502    },
1503    {
1504      id: 'format-block-operator-cond',
1505      title: "\n  Conditionals ? :",
1506
1507      tag: 'h5',
1508      "short": "Conditionals",
1509      html: [['p',
1510      [['code',
1511      ["? :"]], " should have spaces all around them."]],
1512
1513
1514
1515      ['pre',
1516      ["var msg = login_ok?'Welcome':'Please login';\n"],
1517
1518      { className: "cm-s-default code bad  has-popover",
1519        cat: "bad",
1520        'data-content': "BAD",
1521        'data-original-title': "",
1522        title: "" }],
1523
1524      ['pre',
1525      ["var msg = login_ok ? 'Welcome' : 'Please login';\n"],
1526
1527      { className: "cm-s-default code good  has-popover",
1528        cat: "good",
1529        'data-content': "GOOD",
1530        'data-original-title': "",
1531        title: "" }]]
1532
1533    },
1534    {
1535      id: 'format-minimal',
1536      title: "Minimalism",
1537      tag: 'h3',
1538      "short": "Minimal code",
1539      html: []
1540    },
1541    {
1542      id: 'format-minimal-unneeded_parentheses',
1543      title: "\n  Do not use unneeded parentheses in expressions:",
1544
1545      tag: 'h4',
1546      "short": "Unneeded parentheses",
1547      html: [['pre',
1548      ["if ((a!=b) || (c!=d))\n    ...\n"],
1549
1550
1551      { className: "cm-s-default code bad  has-popover",
1552        cat: "bad",
1553        'data-content': "BAD",
1554        'data-original-title': "",
1555        title: "" }],
1556
1557      ['pre',
1558      ["if (a!=b || c!=d)\n    ...\n"],
1559
1560
1561      { className: "cm-s-default code good  has-popover",
1562        cat: "good",
1563        'data-content': "GOOD",
1564        'data-original-title': "",
1565        title: "" }]]
1566
1567    },
1568    {
1569      id: 'format-minimal-empty_line',
1570      title: "\n  Avoid empty lines",
1571
1572      tag: 'h4',
1573      "short": "Avoid empty lines",
1574      html: [['p',
1575      [" Never in any case have two empty lines together.",
1576      ['br'], " A single empty line is allowed in global scope and between\n                functions, but use it sparsely.",
1577
1578
1579      ['br']]]]
1580
1581    },
1582    {
1583      id: 'format-minimal-separate_line',
1584      title: "\n  Separate line",
1585
1586      tag: 'h4',
1587      "short": "Separate line",
1588      html: [['p',
1589      [" Should not separate with more than one blank line between\n                sections, functions etc. "]],
1590
1591
1592      ['pre',
1593      ["function init(){ ...; };\n\n\nfunction end(){ ...; };\n"],
1594
1595
1596
1597
1598      { className: "cm-s-default code bad  has-popover",
1599        cat: "bad",
1600        'data-content': "BAD",
1601        'data-original-title': "",
1602        title: "" }],
1603
1604      ['pre',
1605      ["function init(){ ...; };\n\nfunction end(){ ...; };\n"],
1606
1607
1608
1609      { className: "cm-s-default code good  has-popover",
1610        cat: "good",
1611        'data-content': "GOOD",
1612        'data-original-title': "",
1613        title: "" }],
1614
1615      ['pre',
1616      ["function init(){ ...; };\nfunction end(){ ...; };\n"],
1617
1618
1619      { className: "cm-s-default code good  has-popover",
1620        cat: "good",
1621        'data-content': "GOOD",
1622        'data-original-title': "",
1623        title: "" }],
1624
1625      ['p',
1626      [" Inside functions, should never have an empty line. Use\n                comments to separate. "]],
1627
1628
1629      ['pre',
1630      ["function setup_conn(orig){\n    var conn = net.connect(dst);\n    conn.pipe(orig);\n\n    conn.set_speed('fast');\n    if (conn.rx>MAX_SPEED)\n        conn.set_speed('medium');\n    return conn;\n}\n"],
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640      { className: "cm-s-default code bad  has-popover",
1641        cat: "bad",
1642        'data-content': "BAD",
1643        'data-original-title': "",
1644        title: "" }],
1645
1646      ['pre',
1647      ["function setup_conn(orig){\n    var conn = net.connect(dst);\n    conn.pipe(orig);\n    // setup speed\n    conn.set_speed('fast');\n    if (conn.rx>MAX_SPEED)\n        conn.set_speed('medium');\n    return conn;\n}\n"],
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657      { className: "cm-s-default code ok  has-popover",
1658        cat: "ok",
1659        'data-content': "OK",
1660        'data-original-title': "",
1661        title: "" }],
1662
1663      ['pre',
1664      ["function setup_conn(orig){\n    var conn = net.connect(dst);\n    conn.pipe(orig);\n    conn.set_speed('fast');\n    if (conn.rx>MAX_SPEED)\n        conn.set_speed('medium');\n    return conn;\n}\n"],
1665
1666
1667
1668
1669
1670
1671
1672
1673      { className: "cm-s-default code good  has-popover",
1674        cat: "good",
1675        'data-content': "GOOD",
1676        'data-original-title': "",
1677        title: "" }]]
1678
1679    },
1680    {
1681      id: 'format-minimal-arrow_func',
1682      title: "\n  Arrow function short syntax",
1683
1684      tag: 'h5',
1685      "short": "Arrow function short syntax",
1686      html: [['p',
1687      ["When possible, use arrow function short syntax"]],
1688
1689      ['pre',
1690      ["let t = data=>{ return do_something(data); }\n"],
1691
1692      { className: "cm-s-default code bad  has-popover",
1693        cat: "bad",
1694        'data-content': "BAD",
1695        'data-original-title': "",
1696        title: "" }],
1697
1698      ['pre',
1699      ["let t = data=>do_something(data);\n"],
1700
1701      { className: "cm-s-default code good  has-popover",
1702        cat: "good",
1703        'data-content': "GOOD",
1704        'data-original-title': "",
1705        title: "" }]]
1706
1707    },
1708    {
1709      id: 'format-minimal-separate_line-return',
1710      title: "return statements",
1711      tag: 'h4',
1712      "short": "return statements",
1713      html: []
1714    },
1715    {
1716      id: 'format-minimal-separate_line-return-min',
1717      title: "Minimal return statement",
1718      tag: 'h5',
1719      "short": "Minimal return statement",
1720      html: [['p',
1721      [['code',
1722      ["return"]], " statements should not have parentheses and should not have a\n                space after them:"]],
1723
1724
1725
1726
1727      ['pre',
1728      ["return (0);\n"],
1729
1730      { className: "cm-s-default code bad  has-popover",
1731        cat: "bad",
1732        'data-content': "BAD",
1733        'data-original-title': "",
1734        title: "" }],
1735
1736      ['pre',
1737      ["return 0;\n"],
1738
1739      { className: "cm-s-default code good  has-popover",
1740        cat: "good",
1741        'data-content': "GOOD",
1742        'data-original-title': "",
1743        title: "" }],
1744
1745      ['pre',
1746      ["return ;\n"],
1747
1748      { className: "cm-s-default code bad  has-popover",
1749        cat: "bad",
1750        'data-content': "BAD",
1751        'data-original-title': "",
1752        title: "" }],
1753
1754      ['pre',
1755      ["return;\n"],
1756
1757      { className: "cm-s-default code good  has-popover",
1758        cat: "good",
1759        'data-content': "GOOD",
1760        'data-original-title': "",
1761        title: "" }]]
1762
1763    },
1764    {
1765      id: 'format-minimal-separate_line-return-undefined',
1766      title: "return undefined",
1767      tag: 'h5',
1768      "short": "return undefined",
1769      html: [['p',
1770      ["For ",
1771      ['code',
1772      ["return undefined"]], ", just do ",
1773
1774
1775      ['code',
1776      ["return"]], ", ",
1777
1778
1779      ['code',
1780      ["undefined"]], " is the default of JS."]],
1781
1782
1783
1784      ['p',
1785      ["If a function returns ",
1786      ['code',
1787      ["undefined"]], " at exit, you don't need to call ",
1788
1789
1790      ['code',
1791      ["return"]], "."]],
1792
1793
1794
1795      ['pre',
1796      ["function x(x){\n    if (!x)\n        return undefined;\n    ...;\n    if (x_is_valid(x))\n        return x+5;\n    ...;\n}\n"],
1797
1798
1799
1800
1801
1802
1803
1804
1805      { className: "cm-s-default code bad  has-popover",
1806        cat: "bad",
1807        'data-content': "BAD",
1808        'data-original-title': "",
1809        title: "" }],
1810
1811      ['pre',
1812      ["function x(x){\n    if (!x)\n        return;\n    ...;\n    if (x_is_valid(x))\n        return x+5;\n    ...;\n}\n"],
1813
1814
1815
1816
1817
1818
1819
1820
1821      { className: "cm-s-default code good  has-popover",
1822        cat: "good",
1823        'data-content': "GOOD",
1824        'data-original-title': "",
1825        title: "" }]]
1826
1827    },
1828    {
1829      id: 'format-minimal-return-assign',
1830      title: "\n  return an assignment",
1831
1832      tag: 'h5',
1833      "short": "return an assignment",
1834      html: [['p',
1835      ["You may return an assignment in order to merge assignment and\n                return statments. Do not add unneeded brackets"]],
1836
1837
1838      ['pre',
1839      ["return (a = b);\n"],
1840
1841      { className: "cm-s-default code bad  has-popover",
1842        cat: "bad",
1843        'data-content': "BAD",
1844        'data-original-title': "",
1845        title: "" }],
1846
1847      ['pre',
1848      ["return a = b;\n"],
1849
1850      { className: "cm-s-default code good  has-popover",
1851        cat: "good",
1852        'data-content': "GOOD",
1853        'data-original-title': "",
1854        title: "" }]]
1855
1856    },
1857    {
1858      id: 'format-minimal-return-void_cast',
1859      title: "Cast to void",
1860      tag: 'h5',
1861      "short": "Cast to void",
1862      html: [['p',
1863      ["You may 'cast' to ",
1864      ['code',
1865      ["void"]], " in order to merge an action and ",
1866
1867
1868      ['code',
1869      ["return undefined"]], " into a single line."]],
1870
1871
1872
1873      ['pre',
1874      ["return void sock.close();\n"],
1875
1876      { className: "cm-s-default code good  has-popover",
1877        cat: "good",
1878        'data-content': "GOOD",
1879        'data-original-title': "",
1880        title: "" }],
1881
1882      ['pre',
1883      ["if (ret)\n    return void (cache[id] = ret);\n"],
1884
1885
1886      { className: "cm-s-default code good  has-popover",
1887        cat: "good",
1888        'data-content': "GOOD",
1889        'data-original-title': "",
1890        title: "" }],
1891
1892      ['pre',
1893      ["if (clock)\n    clock = void clock.restore();\n"],
1894
1895
1896      { className: "cm-s-default code good  has-popover",
1897        cat: "good",
1898        'data-content': "GOOD",
1899        'data-original-title': "",
1900        title: "" }]]
1901
1902    },
1903    {
1904      id: 'format-minimal-eqal-zero',
1905      title: "Compare to 0",
1906      tag: 'h4',
1907      "short": "compare to 0",
1908      html: [['p',
1909      ["When 0 stands as non valid or empty option, avoid comparing to\n                0"]],
1910
1911
1912      ['pre',
1913      ["if (total==0)\n    return 'NA';\n"],
1914
1915
1916      { className: "cm-s-default code bad  has-popover",
1917        cat: "bad",
1918        'data-content': "BAD",
1919        'data-original-title': "",
1920        title: "" }],
1921
1922      ['pre',
1923      ["if (!total)\n    return 'NA';\n"],
1924
1925
1926      { className: "cm-s-default code good  has-popover",
1927        cat: "good",
1928        'data-content': "GOOD",
1929        'data-original-title': "",
1930        title: "" }]]
1931
1932    },
1933    {
1934      id: 'format-long_string',
1935      title: "Long strings",
1936      tag: 'h3',
1937      "short": "Long strings",
1938      html: [['p',
1939      [" Breaking up long strings: no space around ",
1940      ['code',
1941      ["+"]], ", and prefer ",
1942
1943
1944      ['code',
1945      ["+"]], " at beginning of next line. "]],
1946
1947
1948
1949      ['pre',
1950      ["msg = 'this ' +\n    'is a long string.';\nmsg = 'this '\n    + 'is a long string.';\n"],
1951
1952
1953
1954
1955      { className: "cm-s-default code bad  has-popover",
1956        cat: "bad",
1957        'data-content': "BAD",
1958        'data-original-title': "",
1959        title: "" }],
1960
1961      ['pre',
1962      ["msg = 'this '+\n    'is a long string.';\nmsg = 'this '\n    +'is a long string.';\n"],
1963
1964
1965
1966
1967      { className: "cm-s-default code ok  has-popover",
1968        cat: "ok",
1969        'data-content': "OK",
1970        'data-original-title': "",
1971        title: "" }],
1972
1973      ['pre',
1974      ["msg = 'this '\n+'is a long string.';\n"],
1975
1976
1977      { className: "cm-s-default code good  has-popover",
1978        cat: "good",
1979        'data-content': "GOOD",
1980        'data-original-title': "",
1981        title: "" }],
1982
1983      ['p',
1984      ["Space, if needed should be at the end of each line and not at\n                the beginning of the next line"]],
1985
1986
1987      ['pre',
1988      ["msg = 'this'\n+' is a long string';\n"],
1989
1990
1991      { className: "cm-s-default code bad  has-popover",
1992        cat: "bad",
1993        'data-content': "BAD",
1994        'data-original-title': "",
1995        title: "" }],
1996
1997      ['pre',
1998      ["msg = 'this '\n+'is a long string';\n"],
1999
2000
2001      { className: "cm-s-default code good  has-popover",
2002        cat: "good",
2003        'data-content': "GOOD",
2004        'data-original-title': "",
2005        title: "" }]]
2006
2007    },
2008    {
2009      id: 'format-file_lvl_closure',
2010      title: "\n  File-level closures",
2011
2012      tag: 'h3',
2013      "short": "File-level closures",
2014      html: [['p',
2015      ["File-level closures: do not indent the whole file. leave a\n                space after the opening, and before the closing:"]],
2016
2017
2018      ['pre',
2019      ["(function($, chrome, console){\n    code;\n    code;\n})(jQuery, chrome, console);\n"],
2020
2021
2022
2023
2024      { className: "cm-s-default code bad  has-popover",
2025        cat: "bad",
2026        'data-content': "BAD",
2027        'data-original-title': "",
2028        title: "" }],
2029
2030      ['pre',
2031      ["(function($, chrome, console){\n\ncode;\ncode;\n\n})(jQuery, chrome, console);\n"],
2032
2033
2034
2035
2036
2037
2038      { className: "cm-s-default code good  has-popover",
2039        cat: "good",
2040        'data-content': "GOOD",
2041        'data-original-title': "",
2042        title: "" }]]
2043
2044    },
2045    {
2046      id: 'format-file_template',
2047      title: "JS file template",
2048      tag: 'h3',
2049      "short": "JS file template",
2050      html: []
2051    },
2052    {
2053      id: 'format-file_template-browser',
2054      title: "\n  IE/Chrome/FF template",
2055
2056      tag: 'h4',
2057      "short": "IE/Chrome/FF template",
2058      html: [['pre',
2059      ["// LICENSE_CODE ZON\n'use strict'; /*jslint browser:true*/\n"],
2060
2061
2062      { className: "cm-s-default code  ",
2063        cat: "" }]]
2064
2065    },
2066    {
2067      id: 'format-file_template-nodejs_app',
2068      title: "NodeJS application template",
2069      tag: 'h4',
2070      "short": "NodeJS application template",
2071      html: [['pre',
2072      ["#!/usr/bin/env node\n// LICENSE_CODE ZON\n'use strict'; /*jslint node:true*/\nrequire('util/config.js');\n"],
2073
2074
2075
2076
2077      { className: "cm-s-default code  ",
2078        cat: "" }]]
2079
2080    },
2081    {
2082      id: 'format-file_template-nodejs_mod',
2083      title: "\n  NodeJS module template",
2084
2085      tag: 'h4',
2086      "short": "NodeJS module template",
2087      html: [['pre',
2088      ["// LICENSE_CODE ZON\n'use strict'; /*jslint node:true*/\nrequire('util/config.js');\n"],
2089
2090
2091
2092      { className: "cm-s-default code  ",
2093        cat: "" }]]
2094
2095    },
2096    {
2097      id: 'format-require',
2098      title: "require()",
2099      tag: 'h3',
2100      "short": "require()",
2101      html: [['p',
2102      [" Local packages should include ",
2103      ['code',
2104      [".js"]], " in the name. Global packages should be the package name only\n                (",
2105
2106
2107
2108      ['code',
2109      ["NODE_PATH"]], " environment variable should be defined). "]],
2110
2111
2112
2113      ['pre',
2114      ["const express = require('/usr/lib/node_modules/express');\n"],
2115
2116      { className: "cm-s-default code bad  has-popover",
2117        cat: "bad",
2118        'data-content': "BAD",
2119        'data-original-title': "",
2120        title: "" }],
2121
2122      ['pre',
2123      ["const express = require('express');\n"],
2124
2125      { className: "cm-s-default code good  has-popover",
2126        cat: "good",
2127        'data-content': "GOOD",
2128        'data-original-title': "",
2129        title: "" }],
2130
2131      ['pre',
2132      ["const get_rules = require('./get_rules');\n"],
2133
2134      { className: "cm-s-default code bad  has-popover",
2135        cat: "bad",
2136        'data-content': "BAD",
2137        'data-original-title': "",
2138        title: "" }],
2139
2140      ['pre',
2141      ["const get_rules = require('./get_rules.js');\n"],
2142
2143      { className: "cm-s-default code good  has-popover",
2144        cat: "good",
2145        'data-content': "GOOD",
2146        'data-original-title': "",
2147        title: "" }],
2148
2149      ['p',
2150      [['code',
2151      ["require"]], " should be called at the top of the file, not locally, so that\n                unit-tests will surface all the problems."]],
2152
2153
2154
2155
2156      ['pre',
2157      ["function readconf(){\n    return require('fs').readFileSync('conf'); }\n"],
2158
2159
2160      { className: "cm-s-default code bad  has-popover",
2161        cat: "bad",
2162        'data-content': "BAD",
2163        'data-original-title': "",
2164        title: "" }],
2165
2166      ['pre',
2167      ["// top of file...\nconst fs = require('fs');\n// later down in the file...\nfunction f(){\n    return fs.readFileSync('conf'); }\n"],
2168
2169
2170
2171
2172
2173      { className: "cm-s-default code good  has-popover",
2174        cat: "good",
2175        'data-content': "GOOD",
2176        'data-original-title': "",
2177        title: "" }],
2178
2179      ['p',
2180      ["Constants and variable names of required modules should\n                normally be the same, according to the module name."]],
2181
2182
2183      ['pre',
2184      ["const rules = require('./get_rules.js'); // in foo.js\nconst actions = require('./get_rules.js'); // in bar.js\n"],
2185
2186
2187      { className: "cm-s-default code bad  has-popover",
2188        cat: "bad",
2189        'data-content': "BAD",
2190        'data-original-title': "",
2191        title: "" }],
2192
2193      ['pre',
2194      ["const get_rules = require('./get_rules.js'); // in foo.js and bar.js\n"],
2195
2196      { className: "cm-s-default code good  has-popover",
2197        cat: "good",
2198        'data-content': "GOOD",
2199        'data-original-title': "",
2200        title: "" }],
2201
2202      ['p',
2203      ["Use ",
2204      ['code',
2205      ["_"]], " instead of ",
2206
2207
2208      ['code',
2209      ["-"]],
2210
2211      ['code',
2212      ["/"]]]],
2213
2214
2215      ['pre',
2216      ["const node_getopt = require('node-getopt');\nconst svc_reconf = require('../svc/reconf.js');\n"],
2217
2218
2219      { className: "cm-s-default code good  has-popover",
2220        cat: "good",
2221        'data-content': "GOOD",
2222        'data-original-title': "",
2223        title: "" }],
2224
2225      ['p',
2226      [" Always prepend ",
2227      ['code',
2228      ["z"]], " to variable names for the following modules from ",
2229
2230
2231      ['code',
2232      ["pkg/util"]], ", and, when necessary, for other modules that clash with global\n                packages. "]],
2233
2234
2235
2236
2237      ['pre',
2238      ["const zconf = require('util/config.js');\nconst zconf = require('util/config_int.js');\nconst zescape = require('util/escape.js');\nconst zhttp = require('util/zhttp.js');\nconst zhttp = require('util/http.js');\nconst zurl = require('util/url.js');\nconst zutil = require('util/util.js');\nconst zos = require('util/os.js');\n"],
2239
2240
2241
2242
2243
2244
2245
2246
2247      { className: "cm-s-default code good  has-popover",
2248        cat: "good",
2249        'data-content': "GOOD",
2250        'data-original-title': "",
2251        title: "" }],
2252
2253      ['p',
2254      ["You may drop the ",
2255      ['code',
2256      ["node-"]], " prefix, or ",
2257
2258
2259      ['code',
2260      ["-js"]], " suffix. "]],
2261
2262
2263
2264      ['pre',
2265      ["const getopt = require('node-getopt');\nconst uglify = require('uglify-js');\n"],
2266
2267
2268      { className: "cm-s-default code good  has-popover",
2269        cat: "good",
2270        'data-content': "GOOD",
2271        'data-original-title': "",
2272        title: "" }],
2273
2274      ['p',
2275      ["Special modules with short names: jquery and lodash."]],
2276
2277      ['pre',
2278      ["var $ = require('jquery');\nvar _ = require('lodash');\n"],
2279
2280
2281      { className: "cm-s-default code good  has-popover",
2282        cat: "good",
2283        'data-content': "GOOD",
2284        'data-original-title': "",
2285        title: "" }]]
2286
2287    },
2288    {
2289      id: 'format-comment',
2290      title: "Comments",
2291      tag: 'h3',
2292      "short": "Comments",
2293      html: []
2294    },
2295    {
2296      id: 'format-comment-comment_cpp',
2297      title: "\n  Prefer C++ comment over C comments.",
2298
2299      tag: 'h4',
2300      "short": "Prefer C++ comment over C comments.",
2301      html: [['pre',
2302      ["/* close all files */\nfclose(fp);\n"],
2303
2304
2305      { className: "cm-s-default code bad  has-popover",
2306        cat: "bad",
2307        'data-content': "BAD",
2308        'data-original-title': "",
2309        title: "" }],
2310
2311      ['pre',
2312      ["// close all files\nfclose(fp);\n"],
2313
2314
2315      { className: "cm-s-default code good  has-popover",
2316        cat: "good",
2317        'data-content': "GOOD",
2318        'data-original-title': "",
2319        title: "" }],
2320
2321      ['pre',
2322      ["/* multi\n * line\n * comment */\n"],
2323
2324
2325
2326      { className: "cm-s-default code bad  has-popover",
2327        cat: "bad",
2328        'data-content': "BAD",
2329        'data-original-title': "",
2330        title: "" }],
2331
2332      ['pre',
2333      ["// multi\n// line\n// comment\n"],
2334
2335
2336
2337      { className: "cm-s-default code good  has-popover",
2338        cat: "good",
2339        'data-content': "GOOD",
2340        'data-original-title': "",
2341        title: "" }]]
2342
2343    },
2344    {
2345      id: 'format-comment-aligned',
2346      title: "Comments aligned",
2347      tag: 'h4',
2348      "short": "Comments aligned",
2349      html: [['p',
2350      ["Comments should be aligned as the code they comment, or one\n                space after the end of the line."]],
2351
2352
2353      ['pre',
2354      ["/*\n * close all files\n */\nfclose(fp);\n"],
2355
2356
2357
2358
2359      { className: "cm-s-default code bad  has-popover",
2360        cat: "bad",
2361        'data-content': "BAD",
2362        'data-original-title': "",
2363        title: "" }],
2364
2365      ['pre',
2366      ["/* close all files */\nfclose(fp);\n"],
2367
2368
2369      { className: "cm-s-default code good  has-popover",
2370        cat: "good",
2371        'data-content': "GOOD",
2372        'data-original-title': "",
2373        title: "" }],
2374
2375      ['pre',
2376      ["fclose(fp); /* close all files */\n"],
2377
2378      { className: "cm-s-default code good  has-popover",
2379        cat: "good",
2380        'data-content': "GOOD",
2381        'data-original-title': "",
2382        title: "" }]]
2383
2384    },
2385    {
2386      id: 'format-comment-long',
2387      title: "Long comments",
2388      tag: 'h4',
2389      "short": "Long comments",
2390      html: [['p',
2391      ["Comments which occupy more than one line should adhere to the\n                following guideline:"]],
2392
2393
2394      ['pre',
2395      ["//\n// close all the files that were opened before the function was called\n// and send them to the output file\n//\nfclose(fp);\n"],
2396
2397
2398
2399
2400
2401      { className: "cm-s-default code bad  has-popover",
2402        cat: "bad",
2403        'data-content': "BAD",
2404        'data-original-title': "",
2405        title: "" }],
2406
2407      ['pre',
2408      ["// close all the files that were opened before the function was called\n// and send them to the output file\nfclose(fp);\n"],
2409
2410
2411
2412      { className: "cm-s-default code good  has-popover",
2413        cat: "good",
2414        'data-content': "GOOD",
2415        'data-original-title': "",
2416        title: "" }]]
2417
2418    },
2419    {
2420      id: 'format-comment-multiline',
2421      title: "\n  Multiline comments",
2422
2423      tag: 'h4',
2424      "short": "Multiline comments",
2425      html: [['p',
2426      ["Multiline comments should always be on their own, not continue\n                on existing statements. If longer, put the comment at the\n                line above."]],
2427
2428
2429
2430      ['pre',
2431      ["var isa_pnp_scan = {\n    search_id: 'a-test', // if search_id.vendor[0]==0 - scan all vendor\n                         // IDs\n                         // if searchId.dwSerial==0 - scan all serial\n                         // numbers\n    cards: 2, // number of cards found\n    card: [card1, card2], // cards found\n};\n"],
2432
2433
2434
2435
2436
2437
2438
2439
2440      { className: "cm-s-default code bad  has-popover",
2441        cat: "bad",
2442        'data-content': "BAD",
2443        'data-original-title': "",
2444        title: "" }],
2445
2446      ['pre',
2447      ["var isa_pnp_scan = {\n    search_id: 'a-test',  // if search_id.vendor[0]==0 - scan\n                          // all vendor IDs\n                          // if searchId.dwSerial==0 - scan all\n                          // serial numbers\n    cards: 2,             // number of cards foun
2447d\n    card: [card1, card2]; // cards found\n};\n"],
2448
2449
2450
2451
2452
2453
2454
2455
2456      { className: "cm-s-default code bad  has-popover",
2457        cat: "bad",
2458        'data-content': "BAD",
2459        'data-original-title': "",
2460        title: "" }],
2461
2462      ['pre',
2463      ["var isa_pnp_scan = {\n    // if search_id.vendor[0]==0 - scan all vendor IDs\n    // if searchId.dwSerial==0 - scan all serial numbers\n    search_id: 's-test',\n    cards: 2, // number of cards found\n    card: [card1, card2], // cards found\n};\n"],
2464
2465
2466
2467
2468
2469
2470
2471      { className: "cm-s-default code good  has-popover",
2472        cat: "good",
2473        'data-content': "GOOD",
2474        'data-original-title': "",
2475        title: "" }]]
2476
2477    },
2478    {
2479      id: 'format-comment-xxx',
2480      title: "XXX - todo mark",
2481      tag: 'h4',
2482      "short": "XXX - todo mark",
2483      html: [['p',
2484      [" Comments of ",
2485      ['code',
2486      ["XXX"]], " should be used for temporary code, that would be changed in\n                the future: hack, quick workaround, non-elegant code, bug.\n                They should be ",
2487
2488
2489
2490
2491      ['code',
2492      ["XXX [login]: COMMENT"]], ", multiple names should be separated with ",
2493
2494
2495      ['code',
2496      ["/"]], ". "]],
2497
2498
2499
2500      ['pre',
2501      ["XXX derry: ANDROID move to compat\nXXX derry: arik: move to compat\nXXX derry arik: move to compat\n"],
2502
2503
2504
2505      { className: "cm-s-default code bad  has-popover",
2506        cat: "bad",
2507        'data-content': "BAD",
2508        'data-original-title': "",
2509        title: "" }],
2510
2511      ['pre',
2512      ["XXX derry: move to compat\nXXX derry ANDROID: move to compat\nXXX derry/arik: move to compat\n"],
2513
2514
2515
2516      { className: "cm-s-default code good  has-popover",
2517        cat: "good",
2518        'data-content': "GOOD",
2519        'data-original-title': "",
2520        title: "" }],
2521
2522      ['p',
2523      [['code',
2524      ["XXX"]], " comments are tasks, so they should always have someone\n                assigned. ",
2525
2526
2527
2528      ['a',
2529      ["Preferably yourself"],
2530      { href: "/dna#individual-solve" }], "! "]],
2531
2532
2533
2534      ['pre',
2535      ["XXX: move to compat\n"],
2536
2537      { className: "cm-s-default code bad  has-popover",
2538        cat: "bad",
2539        'data-content': "BAD",
2540        'data-original-title': "",
2541        title: "" }],
2542
2543      ['pre',
2544      ["XXX some-other-developer: move to compat\n"],
2545
2546      { className: "cm-s-default code bad  has-popover",
2547        cat: "bad",
2548        'data-content': "BAD",
2549        'data-original-title': "",
2550        title: "" }],
2551
2552      ['pre',
2553      ["XXX derry: move to compat\n"],
2554
2555      { className: "cm-s-default code good  has-popover",
2556        cat: "good",
2557        'data-content': "GOOD",
2558        'data-original-title': "",
2559        title: "" }],
2560
2561      ['p',
2562      [" Using XXX comments can be used, when needed, to override any\n                possible rules! "]],
2563
2564
2565      ['pre',
2566      ["if (0)\nit('pause_disconnect', ()=>etask(function*(){\n"],
2567
2568
2569      { className: "cm-s-default code bad  has-popover",
2570        cat: "bad",
2571        'data-content': "BAD",
2572        'data-original-title': "",
2573        title: "" }],
2574
2575      ['pre',
2576      ["if (0) // XXX sergey: lots of sporadic failues\nit('pause_disconnect', ()=>etask(function*(){\n"],
2577
2578
2579      { className: "cm-s-default code good  has-popover",
2580        cat: "good",
2581        'data-content': "GOOD",
2582        'data-original-title': "",
2583        title: "" }],
2584
2585      ['pre',
2586      ["// XXX derry: copied urgent gist as-is to hack around a bug from angular\n// http://github.com/....\n// will fix by 8-Nov-2016\n"],
2587
2588
2589
2590      { className: "cm-s-default code good  has-popover",
2591        cat: "good",
2592        'data-content': "GOOD",
2593        'data-original-title': "",
2594        title: "" }]]
2595
2596    },
2597    {
2598      id: 'format-loop',
2599      title: "Loops",
2600      tag: 'h3',
2601      "short": "Loops",
2602      html: []
2603    },
2604    {
2605      id: 'format-loop-for_vs_while',
2606      title: "\n  for vs while",
2607
2608      tag: 'h4',
2609      "short": "for vs while",
2610      html: [['p',
2611      [" If a ",
2612      ['code',
2613      ["while"]], " loop has an ",
2614
2615
2616      ['code',
2617      ["init"]], " and/or ",
2618
2619
2620      ['code',
2621      ["next"]], " expression, then use a ",
2622
2623
2624      ['code',
2625      ["for"]], " loop: "]],
2626
2627
2628
2629      ['pre',
2630      ["i = 0;\nwhile (i<10)\n{\n     ...;\n     i++;\n}\n"],
2631
2632
2633
2634
2635
2636
2637      { className: "cm-s-default code bad  has-popover",
2638        cat: "bad",
2639        'data-content': "BAD",
2640        'data-original-title': "",
2641        title: "" }],
2642
2643      ['pre',
2644      ["for (i = 0; i<10; i++)\n    ...;\n"],
2645
2646
2647      { className: "cm-s-default code good  has-popover",
2648        cat: "good",
2649        'data-content': "GOOD",
2650        'data-original-title': "",
2651        title: "" }],
2652
2653      ['p',
2654      [" If a ",
2655      ['code',
2656      ["for"]], " loop has only a ",
2657
2658
2659      ['code',
2660      ["condition"]], ", then use ",
2661
2662
2663      ['code',
2664      ["while"]], ": "]],
2665
2666
2667
2668      ['pre',
2669      ["for (; have_more();)\n    ...;\n"],
2670
2671
2672      { className: "cm-s-default code bad  has-popover",
2673        cat: "bad",
2674        'data-content': "BAD",
2675        'data-original-title': "",
2676        title: "" }],
2677
2678      ['pre',
2679      ["while (have_more())\n    ...;\n"],
2680
2681
2682      { className: "cm-s-default code good  has-popover",
2683        cat: "good",
2684        'data-content': "GOOD",
2685        'data-original-title': "",
2686        title: "" }],
2687
2688      ['p',
2689      [" If no ",
2690      ['code',
2691      ["init"]], "/",
2692
2693
2694      ['code',
2695      ["condition"]], "/",
2696
2697
2698      ['code',
2699      ["next"]], ", then any option is ok: "]],
2700
2701
2702
2703      ['pre',
2704      ["for (;;)\n    do_endless_work();\n"],
2705
2706
2707      { className: "cm-s-default code good  has-popover",
2708        cat: "good",
2709        'data-content': "GOOD",
2710        'data-original-title': "",
2711        title: "" }],
2712
2713      ['pre',
2714      ["while (1)\n    do_endless_work();\n"],
2715
2716
2717      { className: "cm-s-default code good  has-popover",
2718        cat: "good",
2719        'data-content': "GOOD",
2720        'data-original-title': "",
2721        title: "" }]]
2722
2723    },
2724    {
2725      id: 'format-loop-for',
2726      title: "for loops",
2727      tag: 'h4',
2728      "short": "for loops",
2729      html: [['p',
2730      [" In ",
2731      ['code',
2732      ["for"]], " loops, when there is a function that gets the next element, it\n                should be done once (inside the step condition):",
2733
2734
2735
2736      ['br'], " assign inside a statement: "]],
2737
2738
2739      ['pre',
2740      ["for (i = 0, result = get_char(); result=='\\r'; result = get_char(), i++)\n    handle_result(result);\n"],
2741
2742
2743      { className: "cm-s-default code bad  has-popover",
2744        cat: "bad",
2745        'data-content': "BAD",
2746        'data-original-title': "",
2747        title: "" }],
2748
2749      ['pre',
2750      ["for (i = 0; (result = get_char())=='\\r'; i++)\n    handle_result(result);\n"],
2751
2752
2753      { className: "cm-s-default code good  has-popover",
2754        cat: "good",
2755        'data-content': "GOOD",
2756        'data-original-title': "",
2757        title: "" }]]
2758
2759    },
2760    {
2761      id: 'format-loop-do_while',
2762      title: "\n  do-while",
2763
2764      tag: 'h4',
2765      "short": "do-while",
2766      html: [['p',
2767      [['code',
2768      ["do-while"]], ": long ",
2769
2770
2771      ['code',
2772      ["do"]], " block should be closed on ",
2773
2774
2775      ['code',
2776      ["while"]], " line: "]],
2777
2778
2779
2780      ['pre',
2781      ["do add_item();\nwhile (have_items);\n"],
2782
2783
2784      { className: "cm-s-default code good  has-popover",
2785        cat: "good",
2786        'data-content': "GOOD",
2787        'data-original-title': "",
2788        title: "" }],
2789
2790      ['pre',
2791      ["do\n    add_item();\nwhile (have_items);\n"],
2792
2793
2794
2795      { className: "cm-s-default code good  has-popover",
2796        cat: "good",
2797        'data-content': "GOOD",
2798        'data-original-title': "",
2799        title: "" }],
2800
2801      ['pre',
2802      ["do {\n    add_item();\n    another_action();\n} while (have_items);\n"],
2803
2804
2805
2806
2807      { className: "cm-s-default code good  has-popover",
2808        cat: "good",
2809        'data-content': "GOOD",
2810        'data-original-title': "",
2811        title: "" }]]
2812
2813    },
2814    {
2815      id: 'format-spacing',
2816      title: "Spacing",
2817      tag: 'h3',
2818      "short": "Spacing",
2819      html: [['p',
2820      ["Put one space before and after an assignment."]],
2821
2822      ['pre',
2823      ["var a=0;\nx= x+1;\nbits|=BIT5;\n"],
2824
2825
2826
2827      { className: "cm-s-default code bad  has-popover",
2828        cat: "bad",
2829        'data-content': "BAD",
2830        'data-original-title': "",
2831        title: "" }],
2832
2833      ['pre',
2834      ["var a = 0;\nx = x+1;\nbits |= BIT5;\n"],
2835
2836
2837
2838      { className: "cm-s-default code good  has-popover",
2839        cat: "good",
2840        'data-content': "GOOD",
2841        'data-original-title': "",
2842        title: "" }],
2843
2844      ['p',
2845      ["If it is in a ",
2846      ['code',
2847      ["for"]], " loop, you can skip the spaces. if you skip one of the spaces,\n                skip both:"]],
2848
2849
2850
2851
2852      ['pre',
2853      ["for (i= 0; i; i--)\n    printf(\"%d\", i);\n"],
2854
2855
2856      { className: "cm-s-default code bad  has-popover",
2857        cat: "bad",
2858        'data-content': "BAD",
2859        'data-original-title': "",
2860        title: "" }],
2861
2862      ['pre',
2863      ["for (i=0; i; i--)\n    printf(\"%d\", i);\n"],
2864
2865
2866      { className: "cm-s-default code good  has-popover",
2867        cat: "good",
2868        'data-content': "GOOD",
2869        'data-original-title': "",
2870        title: "" }],
2871
2872      ['pre',
2873      ["for (i = 0; i; i--)\n    printf(\"%d\", i);\n"],
2874
2875
2876      { className: "cm-s-default code good  has-popover",
2877        cat: "good",
2878        'data-content': "GOOD",
2879        'data-original-title': "",
2880        title: "" }],
2881
2882      ['p',
2883      ["Don't put a space before a statement separator, put one after\n                it:"]],
2884
2885
2886      ['pre',
2887      ["for (i=0 ;i ;i--, j*=2) ;\n"],
2888
2889      { className: "cm-s-default code bad  has-popover",
2890        cat: "bad",
2891        'data-content': "BAD",
2892        'data-original-title': "",
2893        title: "" }],
2894
2895      ['pre',
2896      ["for (i=0; i; i--, j*=2);\n"],
2897
2898      { className: "cm-s-default code good  has-popover",
2899        cat: "good",
2900        'data-content': "GOOD",
2901        'data-original-title': "",
2902        title: "" }],
2903
2904      ['pre',
2905      ["for (i = 0; i; i--, j *= 2);\n"],
2906
2907      { className: "cm-s-default code good  has-popover",
2908        cat: "good",
2909        'data-content': "GOOD",
2910        'data-original-title': "",
2911        title: "" }]]
2912
2913    },
2914    {
2915      id: 'format-callfail',
2916      title: "\n  Check fail in same line of call",
2917
2918      tag: 'h3',
2919      "short": "Check fail in same line of call",
2920      html: [['p',
2921      [" Prefer to check for failures in same line of calling the\n                function. "]],
2922
2923
2924      ['pre',
2925      ["i = str.indexOf(\"\\r\\n\");\nif (i<0)\n    return;\n"],
2926
2927
2928
2929      { className: "cm-s-default code not_preferred  has-popover",
2930        cat: "not_preferred",
2931        'data-content': "NOT PREFERRED",
2932        'data-original-title': "",
2933        title: "" }],
2934
2935      ['pre',
2936      ["if ((i = str.indexOf(\"\\r\\n\"))<0)\n    return;\n"],
2937
2938
2939      { className: "cm-s-default code good  has-popover",
2940        cat: "good",
2941        'data-content': "GOOD",
2942        'data-original-title': "",
2943        title: "" }],
2944
2945      ['pre',
2946      ["m = str.match(\"EOF\");\nif (!m)\n    return;\n"],
2947
2948
2949
2950      { className: "cm-s-default code not_preferred  has-popover",
2951        cat: "not_preferred",
2952        'data-content': "NOT PREFERRED",
2953        'data-original-title': "",
2954        title: "" }],
2955
2956      ['pre',
2957      ["if (!(m = str.match(\"EOF\")))\n    return;\n"],
2958
2959
2960      { className: "cm-s-default code good  has-popover",
2961        cat: "good",
2962        'data-content': "GOOD",
2963        'data-original-title': "",
2964        title: "" }]]
2965
2966    },
2967    {
2968      id: 'format-object',
2969      title: "Object notation",
2970      tag: 'h3',
2971      "short": "Object notation",
2972      html: [['pre',
2973      ["var node =\n{\n    name: 'server',\n    port: 42,\n    status: 'updated',\n    setup_time: 10*1000,\n};\n"],
2974
2975
2976
2977
2978
2979
2980
2981      { className: "cm-s-default code bad  has-popover",
2982        cat: "bad",
2983        'data-content': "BAD",
2984        'data-original-title': "",
2985        title: "" }],
2986
2987      ['pre',
2988      ["var node = {\n    name: 'server',\n    port: 42,\n    status: 'updated',\n    setup_time: 10*1000,\n};\n"],
2989
2990
2991
2992
2993
2994
2995      { className: "cm-s-default code good  has-popover",
2996        cat: "good",
2997        'data-content': "GOOD",
2998        'data-original-title': "",
2999        title: "" }],
3000
3001      ['p',
3002      ["Multiline objects: should have a comma after last property."]],
3003
3004      ['pre',
3005      ["var node = {\n    name: 'server',\n    status: 'updated',\n    setup_time: 10*1000\n};\n"],
3006
3007
3008
3009
3010
3011      { className: "cm-s-default code bad  has-popover",
3012        cat: "bad",
3013        'data-content': "BAD",
3014        'data-original-title': "",
3015        title: "" }],
3016
3017      ['pre',
3018      ["var node = {\n    name: 'server',\n    status: 'updated',\n    setup_time: 10*1000,\n};\n"],
3019
3020
3021
3022
3023
3024      { className: "cm-s-default code good  has-popover",
3025        cat: "good",
3026        'data-content': "GOOD",
3027        'data-original-title': "",
3028        title: "" }],
3029
3030      ['p',
3031      ["Short objects: should be in a single line if they are very\n                short."]],
3032
3033
3034      ['pre',
3035      ["var node = {name: 'server', port: 42,};\n"],
3036
3037      { className: "cm-s-default code bad  has-popover",
3038        cat: "bad",
3039        'data-content': "BAD",
3040        'data-original-title': "",
3041        title: "" }],
3042
3043      ['pre',
3044      ["var node = {\n    name: 'server',\n    port: 42,\n};\n"],
3045
3046
3047
3048
3049      { className: "cm-s-default code ok  has-popover",
3050        cat: "ok",
3051        'data-content': "OK",
3052        'data-original-title': "",
3053        title: "" }],
3054
3055      ['pre',
3056      ["var node = {name: 'server', port: 42};\n"],
3057
3058      { className: "cm-s-default code good  has-popover",
3059        cat: "good",
3060        'data-content': "GOOD",
3061        'data-original-title': "",
3062        title: "" }],
3063
3064      ['p',
3065      ["Object contains short object: should be in a single line."]],
3066
3067      ['pre',
3068      ["var node = {info: {name: 'server', port: 42},\n};\n"],
3069
3070
3071      { className: "cm-s-default code bad  has-popover",
3072        cat: "bad",
3073        'data-content': "BAD",
3074        'data-original-title': "",
3075        title: "" }],
3076
3077      ['pre',
3078      ["var node = {\n    info: {name: 'server', port: 42},\n};\n"],
3079
3080
3081
3082      { className: "cm-s-default code ok  has-popover",
3083        cat: "ok",
3084        'data-content': "OK",
3085        'data-original-title': "",
3086        title: "" }],
3087
3088      ['pre',
3089      ["var node = {info: {name: 'server', port: 42}};\n"],
3090
3091      { className: "cm-s-default code good  has-popover",
3092        cat: "good",
3093        'data-content': "GOOD",
3094        'data-original-title': "",
3095        title: "" }],
3096
3097      ['p',
3098      ["Objects spacing:"]],
3099
3100      ['ul',
3101      [['li',
3102      ["before ",
3103      ['code',
3104      [","]], " and ",
3105
3106
3107      ['code',
3108      [":"]], " signs, there should not be a space, while after those\n                    signs, space is required."]],
3109
3110
3111
3112
3113      ['li',
3114      ["after ",
3115      ['code',
3116      ["{"]], " and before ",
3117
3118
3119      ['code',
3120      ["}"]], " signs, there should not be a space."]]]],
3121
3122
3123
3124
3125      ['pre',
3126      ["var node = {name: 'server', port: 42};\n"],
3127
3128      { className: "cm-s-default code good  has-popover",
3129        cat: "good",
3130        'data-content': "GOOD",
3131        'data-original-title': "",
3132        title: "" }],
3133
3134      ['pre',
3135      ["var node = {name: 'server' , port: 42};\n"],
3136
3137      { className: "cm-s-default code bad  has-popover",
3138        cat: "bad",
3139        'data-content': "BAD",
3140        'data-original-title': "",
3141        title: "" }],
3142
3143      ['pre',
3144      ["var node = {name : 'server', port : 42};\n"],
3145
3146      { className: "cm-s-default code bad  has-popover",
3147        cat: "bad",
3148        'data-content': "BAD",
3149        'data-original-title': "",
3150        title: "" }],
3151
3152      ['pre',
3153      ["var node = { name: 'server', port: 42 };\n"],
3154
3155      { className: "cm-s-default code bad  has-popover",
3156        cat: "bad",
3157        'data-content': "BAD",
3158        'data-original-title': "",
3159        title: "" }]]
3160
3161    },
3162    {
3163      id: 'format-casting',
3164      title: "Casting",
3165      tag: 'h3',
3166      "short": "Casting",
3167      html: [['p',
3168      [" Convert to number: ",
3169      ['code',
3170      ["+val"]],
3171
3172      ['br'], " Convert to signed 32bit int: ",
3173
3174      ['code',
3175      ["val|0"]],
3176
3177      ['br'], " Convert to unsigned 32bit int: ",
3178
3179      ['code',
3180      ["val>>>0"]],
3181
3182      ['br'], " Convert to Boolean: ",
3183
3184      ['code',
3185      ["!!val"]],
3186
3187      ['br'], " Convert Boolean to 0/1: ",
3188
3189      ['code',
3190      ["+bool_val"]], " or ",
3191
3192
3193      ['code',
3194      ["+!!any_val"]],
3195
3196      ['br'],
3197      ['br'], " String literals: prefer ",
3198
3199      ['code',
3200      ["'single quotes'"]], " over ",
3201
3202
3203      ['code',
3204      ["\"double quotes\""]],
3205
3206      ['br']]],
3207
3208      ['pre',
3209      ["\"I am the walrus.\"\n"],
3210
3211      { className: "cm-s-default code ok  has-popover",
3212        cat: "ok",
3213        'data-content': "OK",
3214        'data-original-title': "",
3215        title: "" }],
3216
3217      ['pre',
3218      ["'I am the walrus.'\n"],
3219
3220      { className: "cm-s-default code good  has-popover",
3221        cat: "good",
3222        'data-content': "GOOD",
3223        'data-original-title': "",
3224        title: "" }],
3225
3226      ['pre',
3227      ["\"I'm the walrus.\"\n"],
3228
3229      { className: "cm-s-default code good  has-popover",
3230        cat: "good",
3231        'data-content': "GOOD",
3232        'data-original-title': "",
3233        title: "" }]]
3234
3235    },
3236    {
3237      id: 'format-export',
3238      title: "exports",
3239      tag: 'h3',
3240      "short": "exports",
3241      html: []
3242    },
3243    {
3244      id: 'format-export-e',
3245      title: "\n  Use variable E as alias to exports.",
3246
3247      tag: 'h4',
3248      "short": "exports E",
3249      html: [['pre',
3250      ["exports.foo = function(){ ... };\n"],
3251
3252      { className: "cm-s-default code bad  has-popover",
3253        cat: "bad",
3254        'data-content': "BAD",
3255        'data-original-title': "",
3256        title: "" }],
3257
3258      ['pre',
3259      ["const E = exports;\nE.foo = function(){ ... };\n"],
3260
3261
3262      { className: "cm-s-default code good  has-popover",
3263        cat: "good",
3264        'data-content': "GOOD",
3265        'data-original-title': "",
3266        title: "" }]]
3267
3268    },
3269    {
3270      id: 'format-export-function',
3271      title: "\n  Export functions",
3272
3273      tag: 'h4',
3274      "short": "Export functions",
3275      html: [['p',
3276      [" Only export functions which are used outside of the module,\n                keep everything else local. "]],
3277
3278
3279      ['pre',
3280      ["E.internal_helper = function(){ ... };\n...\nE.internal_helper();\n"],
3281
3282
3283
3284      { className: "cm-s-default code bad  has-popover",
3285        cat: "bad",
3286        'data-content': "BAD",
3287        'data-original-title': "",
3288        title: "" }],
3289
3290      ['pre',
3291      ["function internal_helper(){ ... }\n...\ninternal_helper();\n"],
3292
3293
3294
3295      { className: "cm-s-default code good  has-popover",
3296        cat: "good",
3297        'data-content': "GOOD",
3298        'data-original-title': "",
3299        title: "" }]]
3300
3301    },
3302    {
3303      id: 'format-export-test',
3304      title: "\n  Unit-test exports",
3305
3306      tag: 'h4',
3307      "short": "Unit-test exports",
3308      html: [['p',
3309      [" Use variable ",
3310      ['code',
3311      ["E.t"]], " for exports only used in tests, give the function name to use\n                inside module. "]],
3312
3313
3314
3315
3316      ['pre',
3317      ["// in foo.js\nE.internal_function = function(){ ... };\n...\nE.internal_function();\n\n// in test.js\nfoo.internal_function();\n"],
3318
3319
3320
3321
3322
3323
3324
3325      { className: "cm-s-default code bad  has-popover",
3326        cat: "bad",
3327        'data-content': "BAD",
3328        'data-original-title': "",
3329        title: "" }],
3330
3331      ['pre',
3332      ["// in foo.js\nconst E = exports;\n...\nfunction internal_function(){ ... }\n...\ninternal_function();\n...\nE.t = {internal_function: internal_function, ...};\n// in test.js\nfoo.t.internal_function();\n"],
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343      { className: "cm-s-default code good  has-popover",
3344        cat: "good",
3345        'data-content': "GOOD",
3346        'data-original-title': "",
3347        title: "" }]]
3348
3349    },
3350    {
3351      id: 'format-continuation_method',
3352      title: "\n  Continuation .method()\n",
3353
3354
3355      tag: 'h3',
3356      "short": "Continuation .method()",
3357      html: [['p',
3358      ["Continuation ",
3359      ['code',
3360      [".method()"]], " or ",
3361
3362
3363      ['code',
3364      ["+'str'"]], " on next line can be same indentation as parent line. Same goes\n                for single ",
3365
3366
3367
3368      ['code',
3369      ["var"]], " definition, and ",
3370
3371
3372      ['code',
3373      ["return"]], ". "]],
3374
3375
3376
3377      ['pre',
3378      ["$('<h1>', $('<div>')\n.append('<span>'));\n"],
3379
3380
3381      { className: "cm-s-default code bad  has-popover",
3382        cat: "bad",
3383        'data-content': "BAD",
3384        'data-original-title': "",
3385        title: "" }],
3386
3387      ['pre',
3388      ["$('<h1>', $('<div>')\n    .append('<span>'));\n"],
3389
3390
3391      { className: "cm-s-default code good  has-popover",
3392        cat: "good",
3393        'data-content': "GOOD",
3394        'data-original-title': "",
3395        title: "" }],
3396
3397      ['pre',
3398      ["$('<div>')\n    .append('<span>');\n"],
3399
3400
3401      { className: "cm-s-default code ok  has-popover",
3402        cat: "ok",
3403        'data-content': "OK",
3404        'data-original-title': "",
3405        title: "" }],
3406
3407      ['pre',
3408      ["$('<div>')\n.append('<span>');\n"],
3409
3410
3411      { className: "cm-s-default code good  has-popover",
3412        cat: "good",
3413        'data-content': "GOOD",
3414        'data-original-title': "",
3415        title: "" }],
3416
3417      ['pre',
3418      ["elm = $('<span>')\n.append('<span>');\n"],
3419
3420
3421      { className: "cm-s-default code good  has-popover",
3422        cat: "good",
3423        'data-content': "GOOD",
3424        'data-original-title': "",
3425        title: "" }],
3426
3427      ['pre',
3428      ["var elm = $('<span>')\n.append('<span>');\n"],
3429
3430
3431      { className: "cm-s-default code good  has-popover",
3432        cat: "good",
3433        'data-content': "GOOD",
3434        'data-original-title': "",
3435        title: "" }],
3436
3437      ['pre',
3438      ["var e1 = $('<div>'), e2 = $('<span>')\n.append('<span>');\n"],
3439
3440
3441      { className: "cm-s-default code bad  has-popover",
3442        cat: "bad",
3443        'data-content': "BAD",
3444        'data-original-title': "",
3445        title: "" }],
3446
3447      ['pre',
3448      ["var e1 = $('<div>');\nvar e2 = $('<span>')\n.append('<span>');\n"],
3449
3450
3451
3452      { className: "cm-s-default code good  has-popover",
3453        cat: "good",
3454        'data-content': "GOOD",
3455        'data-original-title': "",
3456        title: "" }],
3457
3458      ['pre',
3459      ["return $('<div>')\n.append('<span>');\n"],
3460
3461
3462      { className: "cm-s-default code good  has-popover",
3463        cat: "good",
3464        'data-content': "GOOD",
3465        'data-original-title': "",
3466        title: "" }],
3467
3468      ['pre',
3469      ["return $('<h2>', $('<div>')\n.append('<span>'));\n"],
3470
3471
3472      { className: "cm-s-default code bad  has-popover",
3473        cat: "bad",
3474        'data-content': "BAD",
3475        'data-original-title': "",
3476        title: "" }],
3477
3478      ['pre',
3479      ["return $('<h2>', $('<div>')\n    .append('<span>'));\n"],
3480
3481
3482      { className: "cm-s-default code good  has-popover",
3483        cat: "good",
3484        'data-content': "GOOD",
3485        'data-original-title': "",
3486        title: "" }],
3487
3488      ['pre',
3489      ["var s = '<div>'\n+'<span>';\n"],
3490
3491
3492      { className: "cm-s-default code good  has-popover",
3493        cat: "good",
3494        'data-content': "GOOD",
3495        'data-original-title': "",
3496        title: "" }],
3497
3498      ['pre',
3499      ["s = x ? '<child>' : '<nothing>'\n+'<span>';\n"],
3500
3501
3502      { className: "cm-s-default code bad  has-popover",
3503        cat: "bad",
3504        'data-content': "BAD",
3505        'data-original-title': "",
3506        title: "" }],
3507
3508      ['pre',
3509      ["s = '<div>'\n+'<span>';\n"],
3510
3511
3512      { className: "cm-s-default code good  has-popover",
3513        cat: "good",
3514        'data-content': "GOOD",
3515        'data-original-title': "",
3516        title: "" }],
3517
3518      ['pre',
3519      ["return '<div>'\n+'<span>';\n"],
3520
3521
3522      { className: "cm-s-default code good  has-popover",
3523        cat: "good",
3524        'data-content': "GOOD",
3525        'data-original-title': "",
3526        title: "" }]]
3527
3528    },
3529    {
3530      id: 'format-dot_method',
3531      title: "\n  . of .method()",
3532
3533      tag: 'h3',
3534      "short": ". of .method()",
3535      html: [['p',
3536      [['code',
3537      ["."]], " of ",
3538
3539
3540      ['code',
3541      [".method()"]], " MUST be the first character on a method call continuation\n                line. "]],
3542
3543
3544
3545
3546      ['pre',
3547      ["set_user(db.open('users').\n  get$(user));\n"],
3548
3549
3550      { className: "cm-s-default code bad  has-popover",
3551        cat: "bad",
3552        'data-content': "BAD",
3553        'data-original-title': "",
3554        title: "" }],
3555
3556      ['pre',
3557      ["set_user(db.open('users')\n  .get$(user));\n"],
3558
3559
3560      { className: "cm-s-default code good  has-popover",
3561        cat: "good",
3562        'data-content': "GOOD",
3563        'data-original-title': "",
3564        title: "" }],
3565
3566      ['pre',
3567      ["$('<h1>', $('<div>').\n    append('<span>'));\n"],
3568
3569
3570      { className: "cm-s-default code bad  has-popover",
3571        cat: "bad",
3572        'data-content': "BAD",
3573        'data-original-title': "",
3574        title: "" }],
3575
3576      ['pre',
3577      ["$('<h1>', $('<div>')\n    .append('<span>'));\n"],
3578
3579
3580      { className: "cm-s-default code good  has-popover",
3581        cat: "good",
3582        'data-content': "GOOD",
3583        'data-original-title': "",
3584        title: "" }]]
3585
3586    },
3587    {
3588      id: 'format-var_declaration',
3589      title: "\n  Variable declarations",
3590
3591      tag: 'h3',
3592      "short": "Variable declarations",
3593      html: [['p',
3594      [['code',
3595      ["var"]], " declarations longer than one line must have their own ",
3596
3597
3598      ['code',
3599      ["var"]], ". "]],
3600
3601
3602
3603      ['pre',
3604      ["var a = 'test',\n    b = f('another', 'test'),\n    c = 'yet another';\n"],
3605
3606
3607
3608      { className: "cm-s-default code bad  has-popover",
3609        cat: "bad",
3610        'data-content': "BAD",
3611        'data-original-title': "",
3612        title: "" }],
3613
3614      ['pre',
3615      ["var a = 'test';\nvar b = f('another', 'test');\nvar c = 'yet another';\n"],
3616
3617
3618
3619      { className: "cm-s-default code good  has-popover",
3620        cat: "good",
3621        'data-content': "GOOD",
3622        'data-original-title': "",
3623        title: "" }],
3624
3625      ['pre',
3626      ["var a = 'test';\nvar b = f('another', 'test'), c = 'yet another';\n"],
3627
3628
3629      { className: "cm-s-default code good  has-popover",
3630        cat: "good",
3631        'data-content': "GOOD",
3632        'data-original-title': "",
3633        title: "" }],
3634
3635      ['pre',
3636      ["var a = 'test', b = f('another', 'test'), c = 'yet another';\n"],
3637
3638      { className: "cm-s-default code good  has-popover",
3639        cat: "good",
3640        'data-content': "GOOD",
3641        'data-original-title': "",
3642        title: "" }],
3643
3644      ['pre',
3645      ["var a = 'test', b = f('another',\n    'test');\nvar c = 'yet another';\n"],
3646
3647
3648
3649      { className: "cm-s-default code bad  has-popover",
3650        cat: "bad",
3651        'data-content': "BAD",
3652        'data-original-title': "",
3653        title: "" }],
3654
3655      ['pre',
3656      ["var a = 'test';\nvar b = f('another',\n    'test');\nvar c = 'yet another';\n"],
3657
3658
3659
3660
3661      { className: "cm-s-default code good  has-popover",
3662        cat: "good",
3663        'data-content': "GOOD",
3664        'data-original-title': "",
3665        title: "" }]]
3666
3667    },
3668    {
3669      id: 'format-var_compare',
3670      title: "Comparing variables",
3671      tag: 'h3',
3672      "short": "Comparing variables",
3673      html: [['p',
3674      [" When comparing to ",
3675      ['code',
3676      ["undefined"]], " use ",
3677
3678
3679      ['code',
3680      ["==="]], " and ",
3681
3682
3683      ['code',
3684      ["!=="]], " On any other case, use ",
3685
3686
3687      ['code',
3688      ["=="]], " and ",
3689
3690
3691      ['code',
3692      ["!="]]]],
3693
3694
3695      ['pre',
3696      ["if (a==='OK')\n"],
3697
3698      { className: "cm-s-default code bad  has-popover",
3699        cat: "bad",
3700        'data-content': "BAD",
3701        'data-original-title': "",
3702        title: "" }],
3703
3704      ['pre',
3705      ["if (typeof a==='undefined')\n"],
3706
3707      { className: "cm-s-default code bad  has-popover",
3708        cat: "bad",
3709        'data-content': "BAD",
3710        'data-original-title': "",
3711        title: "" }],
3712
3713      ['pre',
3714      ["if (a=='OK')\n"],
3715
3716      { className: "cm-s-default code good  has-popover",
3717        cat: "good",
3718        'data-content': "GOOD",
3719        'data-original-title': "",
3720        title: "" }],
3721
3722      ['pre',
3723      ["if (a===undefined)\n"],
3724
3725      { className: "cm-s-default code good  has-popover",
3726        cat: "good",
3727        'data-content': "GOOD",
3728        'data-original-title': "",
3729        title: "" }]]
3730
3731    },
3732    {
3733      id: 'format-use_bind',
3734      title: "\n  Prefer .bind() over this",
3735
3736      tag: 'h3',
3737      "short": "Use bind().",
3738      html: [['p',
3739      [" When assigning functions that depend on ",
3740      ['code',
3741      ["this"]], ", use ",
3742
3743
3744      ['code',
3745      ["bind()"]], ". "]],
3746
3747
3748
3749      ['pre',
3750      ["var log = console.log;\nlog('a'); // TypeError: Illegal invocation\n"],
3751
3752
3753      { className: "cm-s-default code bad  has-popover",
3754        cat: "bad",
3755        'data-content': "BAD",
3756        'data-original-title': "",
3757        title: "" }],
3758
3759      ['pre',
3760      ["var log = console.log.bind(console);\nlog('a');\n"],
3761
3762
3763      { className: "cm-s-default code good  has-popover",
3764        cat: "good",
3765        'data-content': "GOOD",
3766        'data-original-title': "",
3767        title: "" }]]
3768
3769    },
3770    {
3771      id: 'format-locality',
3772      title: "\n  Shorten using locality",
3773
3774      tag: 'h3',
3775      "short": "Locality",
3776      html: [['p',
3777      [" Use locality to shorten names, relying on the contexts of the\n                local code scope. "]],
3778
3779
3780      ['pre',
3781      ["for (let opration_idx=0; operation_idx<operations.length; operation_idx++)\n    ...;\n"],
3782
3783
3784      { className: "cm-s-default code bad  has-popover",
3785        cat: "bad",
3786        'data-content': "BAD",
3787        'data-original-title': "",
3788        title: "" }],
3789
3790      ['pre',
3791      ["for (let i=0; i<operations.length; i++)\n    ...;\n"],
3792
3793
3794      { className: "cm-s-default code good  has-popover",
3795        cat: "good",
3796        'data-content': "GOOD",
3797        'data-original-title': "",
3798        title: "" }],
3799
3800      ['pre',
3801      ["for (let allowed_customer in allowed_customers)\n    ...;\n"],
3802
3803
3804      { className: "cm-s-default code bad  has-popover",
3805        cat: "bad",
3806        'data-content': "BAD",
3807        'data-original-title': "",
3808        title: "" }],
3809
3810      ['pre',
3811      ["for (let c in allowed_customers)\n    ...;\n"],
3812
3813
3814      { className: "cm-s-default code good  has-popover",
3815        cat: "good",
3816        'data-content': "GOOD",
3817        'data-original-title': "",
3818        title: "" }]]
3819
3820    },
3821    {
3822      id: 'format-notation',
3823      title: "\n  UNIX notation naming",
3824
3825      tag: 'h3',
3826      "short": "UNIX notation naming",
3827      html: [['p',
3828      ["Code will be in UNIX notation. UNIX names should not include\n                the data type, rather the meaning of the information in the\n                data."]],
3829
3830
3831
3832      ['pre',
3833      ["var bIsCompleted;\nvar iCount;\n"],
3834
3835
3836      { className: "cm-s-default code bad  has-popover",
3837        cat: "bad",
3838        'data-content': "BAD",
3839        'data-original-title': "",
3840        title: "" }],
3841
3842      ['pre',
3843      ["var is_completed, data, vendor_id, count, buffer, new_name, name;\nfunction read_data_block(){}\nconst MS_PER_SEC = 1000;\n"],
3844
3845
3846
3847      { className: "cm-s-default code good  has-popover",
3848        cat: "good",
3849        'data-content': "GOOD",
3850        'data-original-title': "",
3851        title: "" }]]
3852
3853    },
3854    {
3855      id: 'format-notation-neg',
3856      title: "Positive naming",
3857      tag: 'h4',
3858      "short": "positive naming",
3859      html: [['p',
3860      ["Default to using positive naming, rather than negative\n                (no/not/disable...). This helps avoid double negation (not\n                not)."]],
3861
3862
3863
3864      ['pre',
3865      ["if (!not_customer(customer))\n    disable_customer(customer, false);\n"],
3866
3867
3868      { className: "cm-s-default code bad  has-popover",
3869        cat: "bad",
3870        'data-content': "BAD",
3871        'data-original-title': "",
3872        title: "" }],
3873
3874      ['pre',
3875      ["if (is_customer(customer))\n    enable_customer(customer, true);\n"],
3876
3877
3878      { className: "cm-s-default code good  has-popover",
3879        cat: "good",
3880        'data-content': "GOOD",
3881        'data-original-title': "",
3882        title: "" }],
3883
3884      ['pre',
3885      ["var no_rule = lookup_rule(rule)<0;\nif (!no_rule)\n    rm_rule();\nelse\n    add_rule();\n"],
3886
3887
3888
3889
3890
3891      { className: "cm-s-default code bad  has-popover",
3892        cat: "bad",
3893        'data-content': "BAD",
3894        'data-original-title': "",
3895        title: "" }],
3896
3897      ['pre',
3898      ["var have_rule = lookup_rule(rule)>=0;\nif (have_rule)\n    rm_rule();\nelse\n    add_rule();\n"],
3899
3900
3901
3902
3903
3904      { className: "cm-s-default code good  has-popover",
3905        cat: "good",
3906        'data-content': "GOOD",
3907        'data-original-title': "",
3908        title: "" }]]
3909
3910    },
3911    {
3912      id: 'format-simplicity_usability',
3913      title: "Simplicity\n  and usability",
3914
3915      tag: 'h4',
3916      "short": "simplicity and usability",
3917      html: [['p',
3918      ["Command line options, or option variable (opt), use common\n                usage as default even if negative"]],
3919
3920
3921      ['pre',
3922      ["zlxc --browser\n"],
3923
3924      { className: "cm-s-default code bad  has-popover",
3925        cat: "bad",
3926        'data-content': "BAD",
3927        'data-original-title': "",
3928        title: "" }],
3929
3930      ['pre',
3931      ["zlxc --no-browser\n"],
3932
3933      { className: "cm-s-default code good  has-popover",
3934        cat: "good",
3935        'data-content': "GOOD",
3936        'data-original-title': "",
3937        title: "" }],
3938
3939      ['pre',
3940      ["opt = {exit_on_err: 1};\n"],
3941
3942      { className: "cm-s-default code bad  has-popover",
3943        cat: "bad",
3944        'data-content': "BAD",
3945        'data-original-title': "",
3946        title: "" }],
3947
3948      ['pre',
3949      ["opt = {no_exit: 1};\n"],
3950
3951      { className: "cm-s-default code good  has-popover",
3952        cat: "good",
3953        'data-content': "GOOD",
3954        'data-original-title': "",
3955        title: "" }]]
3956
3957    },
3958    {
3959      id: 'format-default_value',
3960      title: "Default value",
3961      tag: 'h4',
3962      "short": "default value",
3963      html: [['p',
3964      ["Using implicit ",
3965      ['code',
3966      ["undefined"]], " as default value"]],
3967
3968
3969
3970      ['pre',
3971      ["let need_reconf = false;\nif (is_host(':servers'))\n    need_reconf = true;\n"],
3972
3973
3974
3975      { className: "cm-s-default code bad  has-popover",
3976        cat: "bad",
3977        'data-content': "BAD",
3978        'data-original-title': "",
3979        title: "" }],
3980
3981      ['pre',
3982      ["let need_reconf = undefined\nif (is_host(':servers'))\n    need_reconf = true;\n"],
3983
3984
3985
3986      { className: "cm-s-default code bad  has-popover",
3987        cat: "bad",
3988        'data-content': "BAD",
3989        'data-original-title': "",
3990        title: "" }],
3991
3992      ['pre',
3993      ["let need_reconf;\nif (is_host(':servers'))\n    need_reconf = true;\n"],
3994
3995
3996
3997      { className: "cm-s-default code good  has-popover",
3998        cat: "good",
3999        'data-content': "GOOD",
4000        'data-original-title': "",
4001        title: "" }]]
4002
4003    },
4004    {
4005      id: 'format-poly_func',
4006      title: "\n  Multi-signature functions",
4007
4008      tag: 'h3',
4009      "short": "Multi-signature functions",
4010      html: [['p',
4011      [" For functions that have multiple signatures or where there is\n                an optional (not last) argument, you may optionally add the\n                different possible signatures as a comment, in the nodejs\n                signature documentation style. "]],
4012
4013
4014
4015
4016      ['pre',
4017      ["// _apply(opt, func[, _this], args)\n// _apply(opt, object, method, args)\nE._apply = function(opt, func, _this, args){\n    ...\n};\n"],
4018
4019
4020
4021
4022
4023      { className: "cm-s-default code good  has-popover",
4024        cat: "good",
4025        'data-content': "GOOD",
4026        'data-original-title': "",
4027        title: "" }]]
4028
4029    },
4030    {
4031      id: 'format-this_value',
4032      title: "\n  Saving the value of this",
4033
4034      tag: 'h3',
4035      "short": "Saving the value of `this`",
4036      html: [['p',
4037      [" When saving the value of ",
4038      ['code',
4039      ["this"]], " for use in lexically nested functions, use ",
4040
4041
4042      ['code',
4043      ["_this"]], " as the variable name. "]],
4044
4045
4046
4047      ['pre',
4048      ["var self = this;\n"],
4049
4050      { className: "cm-s-default code bad  has-popover",
4051        cat: "bad",
4052        'data-content': "BAD",
4053        'data-original-title': "",
4054        title: "" }],
4055
4056      ['pre',
4057      ["var _this = this;\n"],
4058
4059      { className: "cm-s-default code good  has-popover",
4060        cat: "good",
4061        'data-content': "GOOD",
4062        'data-original-title': "",
4063        title: "" }],
4064
4065      ['pre',
4066      ["function on_end(opt){\n    var _this = this;\n    return function on_end_cb(msg){\n        if (_this.socket)\n             return 'socket';\n    };\n}\n"],
4067
4068
4069
4070
4071
4072
4073
4074      { className: "cm-s-default code good  has-popover",
4075        cat: "good",
4076        'data-content': "GOOD",
4077        'data-original-title': "",
4078        title: "" }],
4079
4080      ['p',
4081      ["Use ",
4082      ['code',
4083      ["__this"]], " and ",
4084
4085
4086      ['code',
4087      ["___this"]], "... for deep code."]],
4088
4089
4090
4091      ['pre',
4092      ["function on_end(opt){\n    var _this = this;\n    return function(msg){\n        if (_this.socket)\n             return 'socket';\n        var __this = this;\n        setTimeout(function(){ __this.socket = undefined; }, 1000);\n    };\n}\n"],
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102      { className: "cm-s-default code good  has-popover",
4103        cat: "good",
4104        'data-content': "GOOD",
4105        'data-original-title': "",
4106        title: "" }]]
4107
4108    },
4109    {
4110      id: 'format-function_classes',
4111      title: "\n  Functions as class definition",
4112
4113      tag: 'h3',
4114      "short": "Functions as class definition",
4115      html: [['p',
4116      ["When a function is a class definition, e.g. needs ",
4117      ['code',
4118      ["new"]], " in order to use it, it should start with capital letter"]],
4119
4120
4121
4122      ['pre',
4123      ["function etask(opt, states){\n    ...\n}\n"],
4124
4125
4126
4127      { className: "cm-s-default code bad  has-popover",
4128        cat: "bad",
4129        'data-content': "BAD",
4130        'data-original-title': "",
4131        title: "" }],
4132
4133      ['pre',
4134      ["function Etask(opt, states){\n    ...\n}\n"],
4135
4136
4137
4138      { className: "cm-s-default code good  has-popover",
4139        cat: "good",
4140        'data-content': "GOOD",
4141        'data-original-title': "",
4142        title: "" }]]
4143
4144    },
4145    {
4146      id: 'format-es6',
4147      title: "ES6",
4148      tag: 'h3',
4149      "short": "ES6",
4150      html: []
4151    },
4152    {
4153      id: 'format-es6-arrow',
4154      title: "Arrow functions",
4155      tag: 'h4',
4156      "short": "Arrow functions",
4157      html: [['p',
4158      [" No spaces around ",
4159      ['code',
4160      ["=>"]], ". Prefer to drop ",
4161
4162
4163      ['code',
4164      ["()"]]]],
4165
4166
4167      ['pre',
4168      ["e.on('play', () => {\n    player.start();\n    started = 1;\n}\n"],
4169
4170
4171
4172
4173      { className: "cm-s-default code bad  has-popover",
4174        cat: "bad",
4175        'data-content': "BAD",
4176        'data-original-title': "",
4177        title: "" }],
4178
4179      ['pre',
4180      ["e.on('play', ()=>{\n    player.start();\n    started = 1;\n}\n"],
4181
4182
4183
4184
4185      { className: "cm-s-default code good  has-popover",
4186        cat: "good",
4187        'data-content': "GOOD",
4188        'data-original-title': "",
4189        title: "" }],
4190
4191      ['pre',
4192      ["socket.on('connect', ()=> state = 'CONNECTED' );\n"],
4193
4194      { className: "cm-s-default code bad  has-popover",
4195        cat: "bad",
4196        'data-content': "BAD",
4197        'data-original-title': "",
4198        title: "" }],
4199
4200      ['pre',
4201      ["socket.on('connect', ()=>state = 'CONNECTED');\n"],
4202
4203      { className: "cm-s-default code good  has-popover",
4204        cat: "good",
4205        'data-content': "GOOD",
4206        'data-original-title': "",
4207        title: "" }],
4208
4209      ['pre',
4210      ["docs.forEach(doc => add(doc));\n"],
4211
4212      { className: "cm-s-default code bad  has-popover",
4213        cat: "bad",
4214        'data-content': "BAD",
4215        'data-original-title': "",
4216        title: "" }],
4217
4218      ['pre',
4219      ["docs.forEach(doc=>add(doc));\n"],
4220
4221      { className: "cm-s-default code good  has-popover",
4222        cat: "good",
4223        'data-content': "GOOD",
4224        'data-original-title': "",
4225        title: "" }],
4226
4227      ['pre',
4228      ["docs.forEach((doc, index)=>{\n    if (index)\n        add(doc, index);\n});\n"],
4229
4230
4231
4232
4233      { className: "cm-s-default code good  has-popover",
4234        cat: "good",
4235        'data-content': "GOOD",
4236        'data-original-title': "",
4237        title: "" }],
4238
4239      ['p',
4240      ["Drop ",
4241      ['code',
4242      ["()"]], " around single argument."]],
4243
4244
4245
4246      ['pre',
4247      ["docs.forEach((doc)=>add(doc));\n"],
4248
4249      { className: "cm-s-default code bad  has-popover",
4250        cat: "bad",
4251        'data-content': "BAD",
4252        'data-original-title': "",
4253        title: "" }],
4254
4255      ['pre',
4256      ["docs.forEach(doc=>add(doc));\n"],
4257
4258      { className: "cm-s-default code good  has-popover",
4259        cat: "good",
4260        'data-content': "GOOD",
4261        'data-original-title': "",
4262        title: "" }],
4263
4264      ['p',
4265      ["Prefer to drop ",
4266      ['code',
4267      ["{}"]], " around single short statement."]],
4268
4269
4270
4271      ['pre',
4272      ["docs.forEach(doc=>{ add(doc); });\n"],
4273
4274      { className: "cm-s-default code ok  has-popover",
4275        cat: "ok",
4276        'data-content': "OK",
4277        'data-original-title': "",
4278        title: "" }],
4279
4280      ['pre',
4281      ["docs.forEach(doc=>add(doc));\n"],
4282
4283      { className: "cm-s-default code good  has-popover",
4284        cat: "good",
4285        'data-content': "GOOD",
4286        'data-original-title': "",
4287        title: "" }]]
4288
4289    },
4290    {
4291      id: 'format-es6-preferred_method',
4292      title: "\n  Preferred Methods",
4293
4294      tag: 'h4',
4295      "short": "Preferred Methods",
4296      html: [['p',
4297      [" never use ",
4298      ['code',
4299      [".indexOf()"]], " for arrays/strings when ",
4300
4301
4302      ['code',
4303      [".includes()"]], " fits. "]],
4304
4305
4306
4307      ['pre',
4308      ["if (apps.indexOf(zserver_match[1])<0)\n    apps.push(zserver_match[1]);\n"],
4309
4310
4311      { className: "cm-s-default code bad  has-popover",
4312        cat: "bad",
4313        'data-content': "BAD",
4314        'data-original-title': "",
4315        title: "" }],
4316
4317      ['pre',
4318      ["if (!apps.includes(zserver_match[1]))\n    apps.push(zserver_match[1]);\n"],
4319
4320
4321      { className: "cm-s-default code good  has-popover",
4322        cat: "good",
4323        'data-content': "GOOD",
4324        'data-original-title': "",
4325        title: "" }],
4326
4327      ['p',
4328      [" never user ",
4329      ['code',
4330      [".indexOf()"]], " for strings when ",
4331
4332
4333      ['code',
4334      [".startsWith()"]], " fits. "]],
4335
4336
4337
4338      ['pre',
4339      ["return !patch[0].indexOf(changed_file)\n    || !patch[1].indexOf(changed_file);\n"],
4340
4341
4342      { className: "cm-s-default code bad  has-popover",
4343        cat: "bad",
4344        'data-content': "BAD",
4345        'data-original-title': "",
4346        title: "" }],
4347
4348      ['pre',
4349      ["return patch[0].startsWith(changed_file)\n    || patch[1].startsWith(changed_file);\n"],
4350
4351
4352      { className: "cm-s-default code good  has-popover",
4353        cat: "good",
4354        'data-content': "GOOD",
4355        'data-original-title': "",
4356        title: "" }]]
4357
4358    },
4359    {
4360      id: 'format-es6-generator',
4361      title: "Generators",
4362      tag: 'h4',
4363      "short": "Generators",
4364      html: [['p',
4365      ["No spaces around ",
4366      ['code',
4367      ["*"]], "."]],
4368
4369
4370
4371      ['pre',
4372      ["etask(function* (){\n    ...\n});\n"],
4373
4374
4375
4376      { className: "cm-s-default code bad  has-popover",
4377        cat: "bad",
4378        'data-content': "BAD",
4379        'data-original-title': "",
4380        title: "" }],
4381
4382      ['pre',
4383      ["etask(function*(){\n    ...\n});\n"],
4384
4385
4386
4387      { className: "cm-s-default code good  has-popover",
4388        cat: "good",
4389        'data-content': "GOOD",
4390        'data-original-title': "",
4391        title: "" }],
4392
4393      ['pre',
4394      ["etask(function * get_request(){\n    ...\n});\n"],
4395
4396
4397
4398      { className: "cm-s-default code bad  has-popover",
4399        cat: "bad",
4400        'data-content': "BAD",
4401        'data-original-title': "",
4402        title: "" }],
4403
4404      ['pre',
4405      ["etask(function*get_request(){\n    ...\n});\n"],
4406
4407
4408
4409      { className: "cm-s-default code good  has-popover",
4410        cat: "good",
4411        'data-content': "GOOD",
4412        'data-original-title': "",
4413        title: "" }]]
4414
4415    },
4416    {
4417      id: 'format-es6-class',
4418      title: "Class definition",
4419      tag: 'h4',
4420      "short": "Class definition",
4421      html: [['p',
4422      ["Class name start with capital leter"]],
4423
4424      ['pre',
4425      ["class SimpleView {}\n"],
4426
4427      { className: "cm-s-default code bad  has-popover",
4428        cat: "bad",
4429        'data-content': "BAD",
4430        'data-original-title': "",
4431        title: "" }],
4432
4433      ['pre',
4434      ["class simple_view {}\n"],
4435
4436      { className: "cm-s-default code bad  has-popover",
4437        cat: "bad",
4438        'data-content': "BAD",
4439        'data-original-title': "",
4440        title: "" }],
4441
4442      ['pre',
4443      ["class Simple_view {}\n"],
4444
4445      { className: "cm-s-default code good  has-popover",
4446        cat: "good",
4447        'data-content': "GOOD",
4448        'data-original-title': "",
4449        title: "" }],
4450
4451      ['p',
4452      ["Add space between class name and ",
4453      ['code',
4454      ["{"]]]],
4455
4456
4457      ['pre',
4458      ["class A{}\n"],
4459
4460      { className: "cm-s-default code bad  has-popover",
4461        cat: "bad",
4462        'data-content': "BAD",
4463        'data-original-title': "",
4464        title: "" }],
4465
4466      ['pre',
4467      ["class A {}\n"],
4468
4469      { className: "cm-s-default code good  has-popover",
4470        cat: "good",
4471        'data-content': "GOOD",
4472        'data-original-title': "",
4473        title: "" }]]
4474
4475    },
4476    {
4477      id: 'format-es6-class-etask',
4478      title: "Etask methods",
4479      tag: 'h4',
4480      "short": "Etask methods",
4481      html: [['p',
4482      ["Indentation reducing is allowed, but class methods should be\n                indented"]],
4483
4484
4485      ['pre',
4486      ["class A {\n    prop(){\n        return etask(function*(){\n            code;\n        });\n    }\n}\n"],
4487
4488
4489
4490
4491
4492
4493
4494      { className: "cm-s-default code good  has-popover",
4495        cat: "good",
4496        'data-content': "GOOD",
4497        'data-original-title': "",
4498        title: "" }],
4499
4500      ['pre',
4501      ["class A {\n    prop(){ return etask(function*(){\n        code;\n    }); }\n}\n"],
4502
4503
4504
4505
4506
4507      { className: "cm-s-default code ok  has-popover",
4508        cat: "ok",
4509        'data-content': "OK",
4510        'data-original-title': "",
4511        title: "" }],
4512
4513      ['pre',
4514      ["class A {\nprop(){\n    let _this = this;\nreturn etask(function*(){\n    code;\n    });\n}\n}\n"],
4515
4516
4517
4518
4519
4520
4521
4522
4523      { className: "cm-s-default code bad  has-popover",
4524        cat: "bad",
4525        'data-content': "BAD",
4526        'data-original-title': "",
4527        title: "" }],
4528
4529      ['pre',
4530      ["class A {\n    prop(){\n        let _this = this;\n    return etask(function*(){\n        code;\n    }); }\n}\n"],
4531
4532
4533
4534
4535
4536
4537
4538      { className: "cm-s-default code good  has-popover",
4539        cat: "good",
4540        'data-content': "GOOD",
4541        'data-original-title': "",
4542        title: "" }]]
4543
4544    },
4545    {
4546      id: 'prog_tech',
4547      title: "Programming technique",
4548      tag: 'h2',
4549      "short": "Programming technique",
4550      html: []
4551    },
4552    {
4553      id: 'prog_tech-generic',
4554      title: "Generic code",
4555      tag: 'h3',
4556      "short": "Generic code",
4557      html: [['p',
4558      [" Code should be written generically only if during the time you\n                are writing it, it is called at least twice, if not more,\n                and save code in the caller.",
4559
4560
4561      ['br'], " Generic code need a deeper unit-tests then regular code. "]],
4562
4563
4564      ['pre',
4565      ["E.first_weekday_of_month = function(wd, d){\n    ...\n};\n"],
4566
4567
4568
4569      { className: "cm-s-default code bad  has-popover",
4570        cat: "bad",
4571        'data-content': "BAD",
4572        'data-original-title': "",
4573        title: "" }],
4574
4575      ['pre',
4576      ["E.strftime = function(fmt, d, opt){\n    ...\n};\n"],
4577
4578
4579
4580      { className: "cm-s-default code good  has-popover",
4581        cat: "good",
4582        'data-content': "GOOD",
4583        'data-original-title': "",
4584        title: "" }]]
4585
4586    },
4587    {
4588      id: 'prog_tech-early_return',
4589      title: "\n  Early return",
4590
4591      tag: 'h3',
4592      "short": "Early return",
4593      html: [['p',
4594      ["Avoid ",
4595      ['code',
4596      ["if()"]], " on 50% or more of a function."]],
4597
4598
4599
4600      ['pre',
4601      ["let inited;\nE.init = ()=>{\n    if (!inited)\n    {\n        inited = true;\n        register_app();\n        set_timers();\n    }\n};\n"],
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611      { className: "cm-s-default code bad  has-popover",
4612        cat: "bad",
4613        'data-content': "BAD",
4614        'data-original-title': "",
4615        title: "" }],
4616
4617      ['pre',
4618      ["let inited;\nE.init = ()=>{\n    if (inited)\n        return;\n    inited = true;\n    register_app();\n    set_timers();\n};\n"],
4619
4620
4621
4622
4623
4624
4625
4626
4627      { className: "cm-s-default code good  has-popover",
4628        cat: "good",
4629        'data-content': "GOOD",
4630        'data-original-title': "",
4631        title: "" }]]
4632
4633    },
4634    {
4635      id: 'prog_tech-defensive_code',
4636      title: "No defensive code",
4637      tag: 'h3',
4638      "short": "No defensive code",
4639      html: [['p',
4640      ["No function argument validation"]],
4641
4642      ['pre',
4643      ["function send_msg(client, msg, opt){\n    if (client===undefined || msg===undefined)\n        throw new Error('send_msg: wrong params');\n    opt = opt||{};\n    msg = prepare_msg(msg);\n    ...\n}\n"],
4644
4645
4646
4647
4648
4649
4650
4651      { className: "cm-s-default code bad  has-popover",
4652        cat: "bad",
4653        'data-content': "BAD",
4654        'data-original-title': "",
4655        title: "" }],
4656
4657      ['pre',
4658      ["function send_msg(client, msg, opt){\n    opt = opt||{};\n    msg = prepare_msg(msg);\n    ...\n}\n"],
4659
4660
4661
4662
4663
4664      { className: "cm-s-default code good  has-popover",
4665        cat: "good",
4666        'data-content': "GOOD",
4667        'data-original-title': "",
4668        title: "" }]]
4669
4670    },
4671    {
4672      id: 'prog_tech-assign_truth',
4673      title: "\n  Assigning in a truth value (if or while)",
4674
4675      tag: 'h3',
4676      "short": "Assigning in a truth value",
4677      html: [['p',
4678      [" Assigning truth value in ",
4679      ['code',
4680      ["if"]],
4681
4682      ['code',
4683      ["while"]],
4684
4685      ['code',
4686      ["for"]], " helps shorten and simplify code. "]],
4687
4688
4689
4690      ['pre',
4691      ["for (i = 0; get_result(i); i++)\n    handle_result(get_result(i));\n"],
4692
4693
4694      { className: "cm-s-default code bad  has-popover",
4695        cat: "bad",
4696        'data-content': "BAD",
4697        'data-original-title': "",
4698        title: "" }],
4699
4700      ['pre',
4701      ["for (i = 0;; i++)\n{\n    result = get_result(i);\n    if (!result)\n        break;\n    handle_result(result);\n}\n"],
4702
4703
4704
4705
4706
4707
4708
4709      { className: "cm-s-default code bad  has-popover",
4710        cat: "bad",
4711        'data-content': "BAD",
4712        'data-original-title': "",
4713        title: "" }],
4714
4715      ['pre',
4716      ["for (i = 0; result = get_result(i); i++)\n    handle_result(result);\n"],
4717
4718
4719      { className: "cm-s-default code good  has-popover",
4720        cat: "good",
4721        'data-content': "GOOD",
4722        'data-original-title': "",
4723        title: "" }],
4724
4725      ['pre',
4726      ["if (compute_num())\n    return compute_num();\n"],
4727
4728
4729      { className: "cm-s-default code bad  has-popover",
4730        cat: "bad",
4731        'data-content': "BAD",
4732        'data-original-title': "",
4733        title: "" }],
4734
4735      ['pre',
4736      ["if (x = compute_num())\n    return x;\n"],
4737
4738
4739      { className: "cm-s-default code good  has-popover",
4740        cat: "good",
4741        'data-content': "GOOD",
4742        'data-original-title': "",
4743        title: "" }],
4744
4745      ['pre',
4746      ["while (1)\n{\n    i = input();\n    if (!i)\n        break;\n    handle_input(i);\n}\n"],
4747
4748
4749
4750
4751
4752
4753
4754      { className: "cm-s-default code bad  has-popover",
4755        cat: "bad",
4756        'data-content': "BAD",
4757        'data-original-title': "",
4758        title: "" }],
4759
4760      ['pre',
4761      ["while (i = input())\n    handle_input(i);\n"],
4762
4763
4764      { className: "cm-s-default code good  has-popover",
4765        cat: "good",
4766        'data-content': "GOOD",
4767        'data-original-title': "",
4768        title: "" }]]
4769
4770    },
4771    {
4772      id: 'prog_tech-diable_test',
4773      title: "\n  Temporary disabling a test",
4774
4775      tag: 'h3',
4776      "short": "Temporary disable test",
4777      html: [['p',
4778      [" When temporary disabling test code that fail:",
4779      ['br'], " Do not indent the code of the disabled tests. "]],
4780
4781
4782      ['pre',
4783      ["if (0) // XXX yoni: fails on BAT\n    jtest_eq(...);\nif (0) // XXX derry: need fix for Ubuntu\n{\n    jtest1();\n    jtest2();\n}\n"],
4784
4785
4786
4787
4788
4789
4790
4791      { className: "cm-s-default code bad  has-popover",
4792        cat: "bad",
4793        'data-content': "BAD",
4794        'data-original-title': "",
4795        title: "" }],
4796
4797      ['pre',
4798      ["if (0) // XXX yoni: fails on BAT\njtest_eq(...);\nif (0){ // XXX derry: need fix for Ubuntu\njtest1();\njtest2();\n}\n"],
4799
4800
4801
4802
4803
4804
4805      { className: "cm-s-default code good  has-popover",
4806        cat: "good",
4807        'data-content': "GOOD",
4808        'data-original-title': "",
4809        title: "" }],
4810
4811      ['p',
4812      ["If it is only one test (one statement), then don't use ",
4813      ['code',
4814      ["{ }"]], " even if the statement is written in 2 lines:"]],
4815
4816
4817
4818      ['pre',
4819      ["if (0) // XXX: yoni: fails on BAT\n{\njtest_run(xxx, yyy,\n    zzz);\n}\n"],
4820
4821
4822
4823
4824
4825      { className: "cm-s-default code bad  has-popover",
4826        cat: "bad",
4827        'data-content': "BAD",
4828        'data-original-title': "",
4829        title: "" }],
4830
4831      ['pre',
4832      ["if (0) // XXX: yoni: fails on BAT\njtest_run(xxx, yyy,\n    zzz);\n"],
4833
4834
4835
4836      { className: "cm-s-default code good  has-popover",
4837        cat: "good",
4838        'data-content': "GOOD",
4839        'data-original-title': "",
4840        title: "" }],
4841
4842      ['p',
4843      ["Open '{' on the same if() line:"]],
4844
4845      ['pre',
4846      ["// XXX: yoni: fails on BAT\nif (0)\n{\njtest_run(xxx, yyy, zzz);\njtest_run(xxx, yyy, zzz);\n}\n"],
4847
4848
4849
4850
4851
4852
4853      { className: "cm-s-default code bad  has-popover",
4854        cat: "bad",
4855        'data-content': "BAD",
4856        'data-original-title': "",
4857        title: "" }],
4858
4859      ['pre',
4860      ["if (0){ // XXX: yoni: fails on BAT\njtest_run(xxx, yyy, zzz);\njtest_run(xxx, yyy, zzz);\n}\n"],
4861
4862
4863
4864
4865      { className: "cm-s-default code good  has-popover",
4866        cat: "good",
4867        'data-content': "GOOD",
4868        'data-original-title': "",
4869        title: "" }]]
4870
4871    },
4872    {
4873      id: 'prog_tech-perf',
4874      title: "Performance",
4875      tag: 'h3',
4876      "short": "Performance",
4877      html: [['p',
4878      [" 99% of the code is not performance critical. So always try to\n                write shorter, simpler, more natural and modern code. If ES6\n                gives nicer simpler constructs - we use them.",
4879
4880
4881      ['br'], " But, in the rare 1% of the code that performs tight loops, we\n                deviate from 'nice simple c
4881ode', and write a little longer\n                code, to avoid ",
4882
4883
4884
4885      ['a',
4886      [" JS VM JIT in-efficiencies"],
4887      { href: "http://www.incaseofstairs.com/2015/06/es6-feature-performance/" }], ".",
4888
4889
4890      ['br'], " We normally check V8, and re-check check these issues\n                periodically as newer versions of JS VM's come out. "]]]
4891
4892
4893
4894    },
4895    {
4896      id: 'prog_tech-perf-for_of',
4897      title: "\n  for..of: 3x-20x slower",
4898
4899      tag: 'h4',
4900      "short": "for..of",
4901      html: [['pre',
4902      ["for (let p of patterns)\n    add_pattern(p);\n"],
4903
4904
4905      { className: "cm-s-default code bad  has-popover",
4906        cat: "bad",
4907        'data-content': "BAD",
4908        'data-original-title': "",
4909        title: "" }],
4910
4911      ['pre',
4912      ["for (let i=0; i<patterns.length; i++)\n    add_pattern(patterns[i]);\n"],
4913
4914
4915      { className: "cm-s-default code good  has-popover",
4916        cat: "good",
4917        'data-content': "GOOD",
4918        'data-original-title': "",
4919        title: "" }]]
4920
4921    },
4922    {
4923      id: 'prog_tech-wrong_perf',
4924      title: "\n  Wrong performance assumptions",
4925
4926      tag: 'h3',
4927      "short": "Wrong performance assumptions",
4928      html: [['p',
4929      [" We list here commonly mistaken performance assumptions. They\n                might have been correct in the past, but JS VMs get better\n                and better - so these performance improvement assumptions\n                are not longer correct. "]]]
4930
4931
4932
4933
4934    },
4935    {
4936      id: 'prog_tech-wrong_perf-map',
4937      title: "\n  Map is faster than Object",
4938
4939      tag: 'h4',
4940      "short": "Map vs Object",
4941      html: [['p',
4942      [" For keys that are plain positive numbers, Object may be faster\n                due to Array optimizations in the VM. But for keys that are\n                strings - Map is faster. "]],
4943
4944
4945
4946      ['pre',
4947      ["let cache = {};\ncache[key] = value;\n"],
4948
4949
4950      { className: "cm-s-default code bad  has-popover",
4951        cat: "bad",
4952        'data-content': "BAD",
4953        'data-original-title': "",
4954        title: "" }],
4955
4956      ['pre',
4957      ["let cache = new Map();\ncache.set(key, value);\n"],
4958
4959
4960      { className: "cm-s-default code good  has-popover",
4961        cat: "good",
4962        'data-content': "GOOD",
4963        'data-original-title': "",
4964        title: "" }]]
4965
4966    },
4967    {
4968      id: 'deep_fix',
4969      title: "Deep Fix",
4970      tag: 'h3',
4971      html: [['div',
4972      [" When you (or someone else) find a coding mistake in your code:\n                ",
4973
4974      ['div',
4975      ["BAD: just fixing that specific mistake you found"],
4976      { className: "bad" }],
4977
4978      ['div',
4979      ["OK: fixing also all such mistakes you made in your own\n                    code"],
4980
4981      { className: "good" }],
4982
4983      ['div',
4984      ["GOOD: fixing all such mistakes, in the whole codebase,\n                    using smart rgrep's to find them."],
4985
4986      { className: "good" }],
4987
4988      ['div',
4989      ["GREAT: if this is a common mistake people tend to repeat,\n                    then once a month repeat the search to find such NEW\n                    mistakes."],
4990
4991
4992      { className: "good" }],
4993
4994      ['div',
4995      ["EXCELLENT: add a rule to zlint to auto detect and if\n                    possible auto fix the mistake."],
4996
4997      { className: "good" }]]]]
4998
4999
5000    },
5001    {
5002      id: 'hola',
5003      title: "Hola specific API",
5004      tag: 'h2',
5005      "short": "Hola specific API",
5006      html: []
5007    },
5008    {
5009      id: 'hola-disable-feature',
5010      title: "Disable feature",
5011      tag: 'h3',
5012      "short": "Disable feature",
5013      html: [['li',
5014      ["dynamic using reconf: preferred"]],
5015
5016      ['li',
5017      ["env: usually when needed in init, for example port numbers"]],
5018
5019      ['li',
5020      ["if (0): unittests and non production code"]],
5021
5022      ['p',
5023      ["TBA: code examples"]]]
5024
5025    },
5026    {
5027      id: 'hola-etask',
5028      title: "etask",
5029      tag: 'h3',
5030      "short": "etask",
5031      html: []
5032    },
5033    {
5034      id: 'hola-etask-overview',
5035      title: "Overview",
5036      tag: 'h4',
5037      "short": "Overview",
5038      html: [['p',
5039      [['code',
5040      ["etask"]], " is Hola's library for writing asynchronous code in a concise\n                synchronous like manner. "]]]
5041
5042
5043
5044
5045    },
5046    {
5047      id: 'hola-etask-why-etask',
5048      title: "Why etask?",
5049      tag: 'h4',
5050      "short": "Why etask?",
5051      html: [['p',
5052      [" Promises/async functions don't support structured cancelation,\n                and callbacks are difficult to coordinate/compose.",
5053
5054      ['br'],
5055      ['code',
5056      ["etask"]], " supports cancelation by default and can manage callback and\n                promise driven subtasks easily.",
5057
5058
5059
5060      ['br'], " For example, if we wanted to find a specific user from the DB,\n                the simplest synchronous code would look like this: "]],
5061
5062
5063
5064      ['pre',
5065      ["function user_find_sync(){\n    let conn = mongodb.connect();\n    let iter = mongodb.find(conn.users, {});\n    let u;\n    while ((u = mongodb.get_next(iter)))\n    {\n        if (correct_user(u))\n            break;\n    }\n    mongodb.close(conn);\n    return u && u.username;\n}\n"],
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078      { className: "cm-s-default code  ",
5079        cat: "" }],
5080
5081      ['p',
5082      [" But this is synchronous, blocking code. JavaScript is async\n                and single threaded, so blocking calls are a huge\n                performance problem.",
5083
5084
5085      ['br'], " So lets see how to port the sync code to async code. Lets\n                start with the ideal solution, using Hola's ",
5086
5087
5088      ['code',
5089      ["etask"]], "s and ES6 generators. "]],
5090
5091
5092
5093      ['p',
5094      ["etask ES6 (perfect!):"]],
5095
5096      ['pre',
5097      ["let user_find_es6 = ()=>etask(function*(){\n    let conn = yield mongodb.connect();\n    let iter = yield mongodb.find(conn.users, {});\n    let u;\n    while (u = yield mongodb.find_next(iter))\n    {\n        if (yield correct_user(u))\n            break;\n    }\n    yield mongodb.close(conn);\n    return u && u.username;\n}\n"],
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110      { className: "cm-s-default code good  has-popover",
5111        cat: "good",
5112        'data-content': "GOOD",
5113        'data-original-title': "",
5114        title: "" }],
5115
5116      ['p',
5117      ["Compare this with other possible approaches:"]],
5118
5119      ['p',
5120      ["callbacks (",
5121      ['a',
5122      ["callback-hell..."],
5123      { href: "http://callbackhell.com/" }], "):"]],
5124
5125
5126
5127      ['pre',
5128      ["let conn, iter;\nfunction user_find_cbs(cb){\n    mongodb.connect(mongo_connected_cb, cb);\n}\n\nfunction mongo_connected_cb(cb){\n    mongodb.find(conn.users, {}, users_find_cb, cb);\n}\n\nfunction users_find_cb(iter, cb){\n    mongodb.get_next(iter, filter_users_cb);\n}\n\nfunction filter_users_cb(u, cb){\n    if (!u)\n        return mongo_disconnect(cb);\n    correct_user(correct_user_cb, u, cb);\n}\n\nfunction correct_user_cb(u, is_correct, cb){\n    if (is_correct)\n        return mongo_disconnect(cb, u.username);\n    mongo_connected_cb(cb);\n}\n\nfunction mongo_disconnect(cb, username){\n    mongodb.close(conn, disconnected_cb, cb, username);\n}\n\nfunction disconnected_cb(cb, username){\n    cb(username);\n}\n"],
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161      { className: "cm-s-default code bad  has-popover",
5162        cat: "bad",
5163        'data-content': "BAD",
5164        'data-original-title': "",
5165        title: "" }],
5166
5167      ['p',
5168      ["promise (includes ugly recursion to emulate a loop, nested ",
5169      ['code',
5170      ["then"]], ", and obscure execution flow):"]],
5171
5172
5173
5174      ['pre',
5175      ["function user_find(){\n    return mongodb.connect()\n    .then(function(conn){ return mongodb.find(conn.users, {}); })\n    .then(function filter(){\n         return mongodb.find_next(iter).then(function(u){\n            if (!u)\n            {\n                return mongodb.close(conn)\n                .then(function(){ return cb(); });\n            }\n            return correct_user(u).then(function(is_correct){\n                if (is_correct)\n                {\n                    return mongodb.close(conn).then(function(){\n                        user_find_end(user.username); });\n                }\n                return filter(iter);\n            });\n        });\n    });\n}\n"],
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197      { className: "cm-s-default code bad  has-popover",
5198        cat: "bad",
5199        'data-content': "BAD",
5200        'data-original-title': "",
5201        title: "" }],
5202
5203      ['p',
5204      [['code',
5205      ["async function"]], " (no support for cancelation if the parent function exits\n                early):"]],
5206
5207
5208
5209
5210      ['pre',
5211      ["async function user_find(){\n      let conn = await mongodb.connect();\n      let iter = await mongodb.find(conn.users, {});\n      let u;\n      while (u = await mongodb.find_next(iter))\n      {\n          if (await correct_user(u))\n              break;\n      }\n      await mongodb.close(conn);\n      return u && u.username;\n  }\n"],
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224      { className: "cm-s-default code bad  has-popover",
5225        cat: "bad",
5226        'data-content': "BAD",
5227        'data-original-title': "",
5228        title: "" }],
5229
5230      ['p',
5231      ["etask ES5 (when generators are not available):"]],
5232
5233      ['pre',
5234      ["function user_find(){\n    return etask([function(){\n        return mongodb.connect();\n    }, function(conn){\n        return mongodb.find(conn.users, {});\n    }, function(iter){\n        return etask.while([function(){\n            return mongodb.find_next(iter);\n        }, function(u){\n            if (!u)\n                return this.break();\n            return correct_user(u);\n        }, function(is_correct){\n            if (is_correct)\n                this.break(u.username);\n        }]);\n    }, function(u){\n        username = u;\n        return mongodb.close(conn);\n    }, function(){\n        return username;\n    }]);\n}\n"],
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258      { className: "cm-s-default code good  has-popover",
5259        cat: "good",
5260        'data-content': "GOOD",
5261        'data-original-title': "",
5262        title: "" }]]
5263
5264    },
5265    {
5266      id: 'hola-etask-cheat_sheet',
5267      title: "Cheat sheet",
5268      tag: 'h4',
5269      "short": "Cheat sheet",
5270      html: [['table',
5271      [['tbody',
5272      [['tr',
5273      [['td',
5274      ["synchronous"]],
5275
5276      ['td',
5277      ["etask ES5"]],
5278
5279      ['td',
5280      ["etask ES6"]]]],
5281
5282
5283      ['tr',
5284      [['td',
5285      [['code',
5286      ["for"]]]],
5287
5288
5289      ['td',
5290      [['code',
5291      ["this.for()"]]]],
5292
5293
5294      ['td',
5295      [['code',
5296      ["for"]]]]]],
5297
5298
5299
5300      ['tr',
5301      [['td',
5302      [['code',
5303      ["continue"]]]],
5304
5305
5306      ['td',
5307      [['code',
5308      ["this.continue()"]]]],
5309
5310
5311      ['td',
5312      [['code',
5313      ["continue"]]]]]],
5314
5315
5316
5317      ['tr',
5318      [['td',
5319      [['code',
5320      ["return"]]]],
5321
5322
5323      ['td',
5324      [['code',
5325      ["this.return()"]]]],
5326
5327
5328      ['td',
5329      [['code',
5330      ["return"]]]]]]]]]]]
5331
5332
5333
5334
5335
5336    },
5337    {
5338      id: 'hola-etask-usage',
5339      title: "Usage examples",
5340      tag: 'h4',
5341      html: [['p',
5342      ["Simple calls to etask or promise returning functions:"]],
5343
5344      ['pre',
5345      ["let process_items = ()=>etask(function*(){\n    let items = yield get_items();\n    for (let item of items)\n    {\n        if (!(yield item_valid(item))\n            return false;\n    }\n    return true;\n});\n"],
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355      { className: "cm-s-default code good  has-popover",
5356        cat: "good",
5357        'data-content': "GOOD",
5358        'data-original-title': "",
5359        title: "" }],
5360
5361      ['p',
5362      ["Call a callback driven function:"]],
5363
5364      ['pre',
5365      ["let make_request = url=>etask(function*(){\n    return yield etask.nfn_apply(request, [url]);\n});\n"],
5366
5367
5368
5369      { className: "cm-s-default code good  has-popover",
5370        cat: "good",
5371        'data-content': "GOOD",
5372        'data-original-title': "",
5373        title: "" }],
5374
5375      ['p',
5376      ["Wait on an event emitter:"]],
5377
5378      ['pre',
5379      ["let save_request = (req, file)=>etask(function*(){\n    req.pipe(file)\n    .on('end', ()=>this.continue())\n    .on('error', e=>this.throw(e));\n    return yield this.wait();\n});\n"],
5380
5381
5382
5383
5384
5385
5386      { className: "cm-s-default code ok  has-popover",
5387        cat: "ok",
5388        'data-content': "OK",
5389        'data-original-title': "",
5390        title: "" }],
5391
5392      ['pre',
5393      ["let save_request = (req, file)=>etask(function*(){\n    req.pipe(file)\n    .on('end', this.continue_fn())\n    .on('error', this.throw_fn());\n    return yield this.wait();\n});\n"],
5394
5395
5396
5397
5398
5399
5400      { className: "cm-s-default code good  has-popover",
5401        cat: "good",
5402        'data-content': "GOOD",
5403        'data-original-title': "",
5404        title: "" }],
5405
5406      ['p',
5407      ["Scheduled resource cleanup (like Go's ",
5408      ['code',
5409      ["defer"]], " statement):"]],
5410
5411
5412
5413      ['pre',
5414      ["let do_something = ()=>etask(function*(){\n    let temp_dir = yield make_temp_dir();\n    // temp dir will be cleaned up whether the function succeeds or throws\n    this.finally(()=>unlink(temp_dir));\n    yield do_step1();\n    yield do_step2();\n    return yield do_step3();\n});\n"],
5415
5416
5417
5418
5419
5420
5421
5422
5423      { className: "cm-s-default code good  has-popover",
5424        cat: "good",
5425        'data-content': "GOOD",
5426        'data-original-title': "",
5427        title: "" }]]
5428
5429    },
5430    {
5431      id: 'hola-etask-coding',
5432      title: "Coding",
5433      tag: 'h4',
5434      "short": "Coding",
5435      html: [['p',
5436      ["When possible, use ES6 arrow function with no brackets and no ",
5437      ['code',
5438      ["return"]]]],
5439
5440
5441      ['pre',
5442      ["let t = function(fn, domain, expected){\n    let i = 7;\n    return etask(function*(){\n        ...\n    };\n});\n"],
5443
5444
5445
5446
5447
5448
5449      { className: "cm-s-default code bad  has-popover",
5450        cat: "bad",
5451        'data-content': "BAD",
5452        'data-original-title': "",
5453        title: "" }],
5454
5455      ['pre',
5456      ["let t = (fn, domain, expected)=>etask(function*(){\n    let i = 7;\n    ...\n});\n"],
5457
5458
5459
5460
5461      { className: "cm-s-default code good  has-popover",
5462        cat: "good",
5463        'data-content': "GOOD",
5464        'data-original-title': "",
5465        title: "" }],
5466
5467      ['p',
5468      [['code',
5469      ["return etask()"]], " in the middle of a function should be indented to the function\n                level. Should be used rarely, only when fast path needed "]],
5470
5471
5472
5473
5474      ['pre',
5475      ["let get_headers = req=>{\n    let cache;\n    if (cache = cache_getreq)\n        return cache;\n    return etask(function*get_headers(){\n        ...\n}); }\n"],
5476
5477
5478
5479
5480
5481
5482
5483      { className: "cm-s-default code bad  has-popover",
5484        cat: "bad",
5485        'data-content': "BAD",
5486        'data-original-title': "",
5487        title: "" }],
5488
5489      ['pre',
5490      ["let get_headers = req=>{\n    let cache;\n    if (cache = cache_get(req))\n        return cache;\nreturn etask(function*get_headers(){\n    ...\n}); }\n"],
5491
5492
5493
5494
5495
5496
5497
5498      { className: "cm-s-default code good  has-popover",
5499        cat: "good",
5500        'data-content': "GOOD",
5501        'data-original-title': "",
5502        title: "" }],
5503
5504      ['p',
5505      ["etask class indentation"]],
5506
5507      ['pre',
5508      ["class Read_client {\nsearch(q){\n    let _this = this;\nreturn etask(function*(){\n    ...\n}); }\n}\n"],
5509
5510
5511
5512
5513
5514
5515
5516      { className: "cm-s-default code bad  has-popover",
5517        cat: "bad",
5518        'data-content': "BAD",
5519        'data-original-title': "",
5520        title: "" }],
5521
5522      ['pre',
5523      ["class Read_client {\n    search(q){\n        let _this = this;\n        return etask(function*(){\n            ...\n        });\n    }\n}\n"],
5524
5525
5526
5527
5528
5529
5530
5531
5532      { className: "cm-s-default code ok  has-popover",
5533        cat: "ok",
5534        'data-content': "OK",
5535        'data-original-title': "",
5536        title: "" }],
5537
5538      ['pre',
5539      ["class Read_client {\n    search(q){\n        let _this = this;\n    return etask(function*(){\n        ...\n    }); }\n}\n"],
5540
5541
5542
5543
5544
5545
5546
5547      { className: "cm-s-default code good  has-popover",
5548        cat: "good",
5549        'data-content': "GOOD",
5550        'data-original-title': "",
5551        title: "" }],
5552
5553      ['pre',
5554      ["class Read_client {\n    search(q){ let _this = this; return etask(function*(){\n        ...\n    }); }\n}\n"],
5555
5556
5557
5558
5559
5560      { className: "cm-s-default code good  has-popover",
5561        cat: "good",
5562        'data-content': "GOOD",
5563        'data-original-title': "",
5564        title: "" }],
5565
5566      ['p',
5567      ["No hidden (automatic) ",
5568      ['code',
5569      ["yield"]], " in return."]],
5570
5571
5572
5573      ['pre',
5574      ["let insert_cid_to_mongo = cid=>etask(function*(){\n    let client = yield mongodb.findOne(...cid...);\n    return mongodb.update(...client...);\n});\n"],
5575
5576
5577
5578
5579      { className: "cm-s-default code bad  has-popover",
5580        cat: "bad",
5581        'data-content': "BAD",
5582        'data-original-title': "",
5583        title: "" }],
5584
5585      ['pre',
5586      ["let insert_cid_to_mongo = cid=>etask(function*(){\n    let client = yield mongodb.findOne(...cid...);\n    return yield mongodb.update(...client...);\n});\n"],
5587
5588
5589
5590
5591      { className: "cm-s-default code good  has-popover",
5592        cat: "good",
5593        'data-content': "GOOD",
5594        'data-original-title': "",
5595        title: "" }],
5596
5597      ['p',
5598      ["etask name for lib API"]],
5599
5600      ['pre',
5601      ["E.find_all = (zmongo, selector, opt)=>etask(function*(){\n    ...\n});\n"],
5602
5603
5604
5605      { className: "cm-s-default code bad  has-popover",
5606        cat: "bad",
5607        'data-content': "BAD",
5608        'data-original-title': "",
5609        title: "" }],
5610
5611      ['pre',
5612      ["E.find_all = (zmongo, selector, opt)=>etask(function*mongo_find_all(){\n    ...\n});\n"],
5613
5614
5615
5616      { className: "cm-s-default code good  has-popover",
5617        cat: "good",
5618        'data-content': "GOOD",
5619        'data-original-title': "",
5620        title: "" }],
5621
5622      ['p',
5623      ["No etask name for internal functions"]],
5624
5625      ['pre',
5626      ["let generate_daily = user=>etask(function*generate_daily(){\n    ...\n});\n"],
5627
5628
5629
5630      { className: "cm-s-default code bad  has-popover",
5631        cat: "bad",
5632        'data-content': "BAD",
5633        'data-original-title': "",
5634        title: "" }],
5635
5636      ['pre',
5637      ["let generate_daily = user=>etask(function*(){\n    ...\n});\n"],
5638
5639
5640
5641      { className: "cm-s-default code good  has-popover",
5642        cat: "good",
5643        'data-content': "GOOD",
5644        'data-original-title': "",
5645        title: "" }],
5646
5647      ['p',
5648      [" Avoid enclosing a large portion of a function in a try block.",
5649      ['br'], " Prefer this.on('uncaught', ...) and this.finally when\n                applicable. (",
5650
5651
5652      ['a',
5653      ["why?"],
5654      { className: "why",
5655        'data-why-popup': "",
5656        popup: "why_no_try_catch" }], ") "]],
5657
5658
5659
5660      ['div',
5661      [" Code is shorter and the indentation reduce readability. "],
5662      { id: "why_no_try_catch",
5663        className: "why_popup" }],
5664
5665      ['pre',
5666      ["let get_zone_bw = config=>(req, res)=>etask(function*(){\n    let zone = yield check_zone(config, req, res);\n    try {\n        let data = yield get_graphite_bw(req, zone.customer, [zone.name]);\n        res.json(data);\n    } catch(e){\n        zerr(zerr.e2s(e));\n        return void res.status(500).send('err');\n    }\n});\n"],
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677      { className: "cm-s-default code bad  has-popover",
5678        cat: "bad",
5679        'data-content': "BAD",
5680        'data-original-title': "",
5681        title: "" }],
5682
5683      ['pre',
5684      ["let get_zone_bw = config=>(req, res)=>etask(function*(){\n    let zone = yield check_zone(config, req, res);\n    this.on('uncaught', err_handler(res));\n    let data = yield get_graphite_bw(req, zone.customer, [zone.name]);\n    res.json(data);\n});\n"],
5685
5686
5687
5688
5689
5690
5691      { className: "cm-s-default code good  has-popover",
5692        cat: "good",
5693        'data-content': "GOOD",
5694        'data-original-title': "",
5695        title: "" }]]
5696
5697    },
5698    {
5699      id: 'hola-react',
5700      title: "React code",
5701      tag: 'h3',
5702      "short": "React code",
5703      html: [['p',
5704      [" Read ",
5705      ['a',
5706      ["React docs"],
5707      { href: "https://reactjs.org/docs/getting-started.html" }], " and follow guidlines and recommendations unless they conflict\n                with Hola React conventions. "]]]
5708
5709
5710
5711
5712    },
5713    {
5714      id: 'hola-react-dry',
5715      title: "Use Components to stay DRY",
5716      tag: 'h4',
5717      html: [['p',
5718      [" Use the same guidlines for code repetition as regular\n                functions: ",
5719
5720      ['a',
5721      ["Try not repeat yourself"],
5722      { href: "http://hola.org/dna/tree_code#lift-tdry" }], ". "]],
5723
5724
5725
5726      ['p',
5727      ["Move shared JSX to a util component to repeat markup"]],
5728
5729      ['pre',
5730      ["<div className=\"feature\">\n  <h3>title1</h3>\n  <p>text</p>\n</div>\n<div className=\"feature\">\n  <h3>title2</h3>\n  <p>text2</p>\n</div>\n"],
5731
5732
5733
5734
5735
5736
5737
5738
5739      { className: "cm-s-default code bad  has-popover",
5740        cat: "bad",
5741        'data-content': "BAD",
5742        'data-original-title': "",
5743        title: "" }],
5744
5745      ['pre',
5746      ["let Feature = props=>\n    <div className=\"feature\">\n      <h3>{props.title}</h3>\n      <p>{props.children}</p>\n    </div>;\n<Feature title=\"title1\">text1</Feature>\n<Feature title=\"title2\">text2</Feature>\n"],
5747
5748
5749
5750
5751
5752
5753
5754      { className: "cm-s-default code good  has-popover",
5755        cat: "good",
5756        'data-content': "GOOD",
5757        'data-original-title': "",
5758        title: "" }]]
5759
5760    },
5761    {
5762      id: 'hola-react-jsx',
5763      title: "JSX",
5764      tag: 'h4',
5765      html: [['p',
5766      [" JSX coding convention follows ",
5767      ['a',
5768      ["HTML coding"],
5769      { href: "/dna/html_code" }], ". When switching from JS code to JSX code use 4 chars\n                indentation on the first. Rest follow HTML convention of 2\n                chars indentation. "]],
5770
5771
5772
5773
5774
5775      ['pre',
5776      ["return <View>\n  </View>;\n"],
5777
5778
5779      { className: "cm-s-default code bad  has-popover",
5780        cat: "bad",
5781        'data-content': "BAD",
5782        'data-original-title': "",
5783        title: "" }],
5784
5785      ['pre',
5786      ["return <View></View>;\n"],
5787
5788      { className: "cm-s-default code good  has-popover",
5789        cat: "good",
5790        'data-content': "GOOD",
5791        'data-original-title': "",
5792        title: "" }],
5793
5794      ['pre',
5795      ["return <View>\n    </View>;\n"],
5796
5797
5798      { className: "cm-s-default code good  has-popover",
5799        cat: "good",
5800        'data-content': "GOOD",
5801        'data-original-title': "",
5802        title: "" }],
5803
5804      ['pre',
5805      ["return <View>\n      <Button/>\n    </View>;\n"],
5806
5807
5808
5809      { className: "cm-s-default code good  has-popover",
5810        cat: "good",
5811        'data-content': "GOOD",
5812        'data-original-title': "",
5813        title: "" }],
5814
5815      ['pre',
5816      ["return (\n    <View>\n      <Button/>\n    </View>);\n"],
5817
5818
5819
5820
5821      { className: "cm-s-default code bad  has-popover",
5822        cat: "bad",
5823        'data-content': "BAD",
5824        'data-original-title': "",
5825        title: "" }],
5826
5827      ['pre',
5828      ["return (\n    <View>\n      <Button/>\n    </View>\n);\n"],
5829
5830
5831
5832
5833
5834      { className: "cm-s-default code good  has-popover",
5835        cat: "good",
5836        'data-content': "GOOD",
5837        'data-original-title': "",
5838        title: "" }],
5839
5840      ['pre',
5841      ["return (\n    <View>\n      {show_panel &&\n          <Panel/>}\n    </View>)\n);\n"],
5842
5843
5844
5845
5846
5847
5848      { className: "cm-s-default code bad  has-popover",
5849        cat: "bad",
5850        'data-content': "BAD",
5851        'data-original-title': "",
5852        title: "" }],
5853
5854      ['pre',
5855      ["return (\n    <View>\n      {show_panel &&\n        <Panel/>}\n    </View>\n);\n"],
5856
5857
5858
5859
5860
5861
5862      { className: "cm-s-default code good  has-popover",
5863        cat: "good",
5864        'data-content': "GOOD",
5865        'data-original-title': "",
5866        title: "" }]]
5867
5868    },
5869    {
5870      id: 'hola-react-css',
5871      title: "CSS",
5872      tag: 'h4',
5873      html: [['p',
5874      ["Use ",
5875      ['a',
5876      ["CSS conventions for react"],
5877      { href: "/dna/css_code#react" }]]]]
5878
5879
5880    },
5881    {
5882      id: 'hola-unittest',
5883      title: "Unittest",
5884      tag: 'h3',
5885      "short": "unittest",
5886      html: [['p',
5887      ["TBD"]]]
5888
5889    }];
5890
5891    return E;
5892  });})();
5893//# sourceMappingURL=js_code.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.