A place to cache linked articles (think custom and personal wayback machine)
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang=fr>
  4. <!-- Has to be within the first 1024 bytes, hence before the <title>
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset=utf-8>
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name=viewport content="width=device-width,minimum-scale=1,initial-scale=1,shrink-to-fit=no">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>Auto-formatting JavaScript Code Style (archive) — David Larlet</title>
  13. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  14. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons/apple-touch-icon.png">
  15. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons/favicon-32x32.png">
  16. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons/favicon-16x16.png">
  17. <link rel="manifest" href="/manifest.json">
  18. <link rel="mask-icon" href="/static/david/icons/safari-pinned-tab.svg" color="#5bbad5">
  19. <link rel="shortcut icon" href="/static/david/icons/favicon.ico">
  20. <meta name="apple-mobile-web-app-title" content="David Larlet">
  21. <meta name="application-name" content="David Larlet">
  22. <meta name="msapplication-TileColor" content="#da532c">
  23. <meta name="msapplication-config" content="/static/david/icons/browserconfig.xml">
  24. <meta name="theme-color" content="#f0f0ea">
  25. <!-- That good ol' feed, subscribe :p. -->
  26. <link rel=alternate type="application/atom+xml" title=Feed href="/david/log/">
  27. <meta name="robots" content="noindex, nofollow">
  28. <meta content="origin-when-cross-origin" name="referrer">
  29. <!-- Canonical URL for SEO purposes -->
  30. <link rel="canonical" href="https://medium.com/@addyosmani/auto-formatting-javascript-code-style-fe0f98a923b8">
  31. <style>
  32. /* http://meyerweb.com/eric/tools/css/reset/ */
  33. html, body, div, span,
  34. h1, h2, h3, h4, h5, h6, p, blockquote, pre,
  35. a, abbr, address, big, cite, code,
  36. del, dfn, em, img, ins,
  37. small, strike, strong, tt, var,
  38. dl, dt, dd, ol, ul, li,
  39. fieldset, form, label, legend,
  40. table, caption, tbody, tfoot, thead, tr, th, td,
  41. article, aside, canvas, details, embed,
  42. figure, figcaption, footer, header, hgroup,
  43. menu, nav, output, ruby, section, summary,
  44. time, mark, audio, video {
  45. margin: 0;
  46. padding: 0;
  47. border: 0;
  48. font-size: 100%;
  49. font: inherit;
  50. vertical-align: baseline;
  51. }
  52. /* HTML5 display-role reset for older browsers */
  53. article, aside, details, figcaption, figure,
  54. footer, header, hgroup, menu, nav, section { display: block; }
  55. body { line-height: 1; }
  56. blockquote, q { quotes: none; }
  57. blockquote:before, blockquote:after,
  58. q:before, q:after {
  59. content: '';
  60. content: none;
  61. }
  62. table {
  63. border-collapse: collapse;
  64. border-spacing: 0;
  65. }
  66. /* http://practicaltypography.com/equity.html */
  67. /* https://calendar.perfplanet.com/2016/no-font-face-bulletproof-syntax/ */
  68. /* https://www.filamentgroup.com/lab/js-web-fonts.html */
  69. @font-face {
  70. font-family: 'EquityTextB';
  71. src: url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff2') format('woff2'),
  72. url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff') format('woff');
  73. font-weight: 300;
  74. font-style: normal;
  75. font-display: swap;
  76. }
  77. @font-face {
  78. font-family: 'EquityTextB';
  79. src: url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff2') format('woff2'),
  80. url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff') format('woff');
  81. font-weight: 300;
  82. font-style: italic;
  83. font-display: swap;
  84. }
  85. @font-face {
  86. font-family: 'EquityTextB';
  87. src: url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff2') format('woff2'),
  88. url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff') format('woff');
  89. font-weight: 700;
  90. font-style: normal;
  91. font-display: swap;
  92. }
  93. @font-face {
  94. font-family: 'ConcourseT3';
  95. src: url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff2') format('woff2'),
  96. url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff') format('woff');
  97. font-weight: 300;
  98. font-style: normal;
  99. font-display: swap;
  100. }
  101. /* http://practice.typekit.com/lesson/caring-about-opentype-features/ */
  102. body {
  103. /* http://www.cssfontstack.com/ Palatino 99% Win 86% Mac */
  104. font-family: "EquityTextB", Palatino, serif;
  105. background-color: #f0f0ea;
  106. color: #07486c;
  107. font-kerning: normal;
  108. -moz-osx-font-smoothing: grayscale;
  109. -webkit-font-smoothing: subpixel-antialiased;
  110. text-rendering: optimizeLegibility;
  111. font-variant-ligatures: common-ligatures contextual;
  112. font-feature-settings: "kern", "liga", "clig", "calt";
  113. }
  114. pre, code, kbd, samp, var, tt {
  115. font-family: 'TriplicateT4c', monospace;
  116. }
  117. em {
  118. font-style: italic;
  119. color: #323a45;
  120. }
  121. strong {
  122. font-weight: bold;
  123. color: black;
  124. }
  125. nav {
  126. background-color: #323a45;
  127. color: #f0f0ea;
  128. display: flex;
  129. justify-content: space-around;
  130. padding: 1rem .5rem;
  131. }
  132. nav:last-child {
  133. border-bottom: 1vh solid #2d7474;
  134. }
  135. nav a {
  136. color: #f0f0ea;
  137. }
  138. nav abbr {
  139. border-bottom: 1px dotted white;
  140. }
  141. h1 {
  142. border-top: 1vh solid #2d7474;
  143. border-bottom: .2vh dotted #2d7474;
  144. background-color: #e3e1e1;
  145. color: #323a45;
  146. text-align: center;
  147. padding: 5rem 0 4rem 0;
  148. width: 100%;
  149. font-family: 'ConcourseT3';
  150. display: flex;
  151. flex-direction: column;
  152. }
  153. h1.single {
  154. padding-bottom: 10rem;
  155. }
  156. h1 span {
  157. position: absolute;
  158. top: 1vh;
  159. left: 20%;
  160. line-height: 0;
  161. }
  162. h1 span a {
  163. line-height: 1.7;
  164. padding: 1rem 1.2rem .6rem 1.2rem;
  165. border-radius: 0 0 6% 6%;
  166. background: #2d7474;
  167. font-size: 1.3rem;
  168. color: white;
  169. text-decoration: none;
  170. }
  171. h2 {
  172. margin: 4rem 0 1rem;
  173. border-top: .2vh solid #2d7474;
  174. padding-top: 1vh;
  175. }
  176. h3 {
  177. text-align: center;
  178. margin: 3rem 0 .75em;
  179. }
  180. hr {
  181. height: .4rem;
  182. width: .4rem;
  183. border-radius: .4rem;
  184. background: #07486c;
  185. margin: 2.5rem auto;
  186. }
  187. time {
  188. display: bloc;
  189. margin-left: 0 !important;
  190. }
  191. ul, ol {
  192. margin: 2rem;
  193. }
  194. ul {
  195. list-style-type: square;
  196. }
  197. a {
  198. text-decoration-skip-ink: auto;
  199. text-decoration-thickness: 0.05em;
  200. text-underline-offset: 0.09em;
  201. }
  202. article {
  203. max-width: 50rem;
  204. display: flex;
  205. flex-direction: column;
  206. margin: 2rem auto;
  207. }
  208. article.single {
  209. border-top: .2vh dotted #2d7474;
  210. margin: -6rem auto 1rem auto;
  211. background: #f0f0ea;
  212. padding: 2rem;
  213. }
  214. article p:last-child {
  215. margin-bottom: 1rem;
  216. }
  217. p {
  218. padding: 0 .5rem;
  219. margin-left: 3rem;
  220. }
  221. p + p,
  222. figure + p {
  223. margin-top: 2rem;
  224. }
  225. blockquote {
  226. background-color: #e3e1e1;
  227. border-left: .5vw solid #2d7474;
  228. display: flex;
  229. flex-direction: column;
  230. align-items: center;
  231. padding: 1rem;
  232. margin: 1.5rem;
  233. }
  234. blockquote cite {
  235. font-style: italic;
  236. }
  237. blockquote p {
  238. margin-left: 0;
  239. }
  240. figure {
  241. border-top: .2vh solid #2d7474;
  242. background-color: #e3e1e1;
  243. text-align: center;
  244. padding: 1.5rem 0;
  245. margin: 1rem 0 0;
  246. font-size: 1.5rem;
  247. width: 100%;
  248. }
  249. figure img {
  250. max-width: 250px;
  251. max-height: 250px;
  252. border: .5vw solid #323a45;
  253. padding: 1px;
  254. }
  255. figcaption {
  256. padding: 1rem;
  257. line-height: 1.4;
  258. }
  259. aside {
  260. display: flex;
  261. flex-direction: column;
  262. background-color: #e3e1e1;
  263. padding: 1rem 0;
  264. border-bottom: .2vh solid #07486c;
  265. }
  266. aside p {
  267. max-width: 50rem;
  268. margin: 0 auto;
  269. }
  270. /* https://fvsch.com/code/css-locks/ */
  271. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  272. font-size: 1rem;
  273. line-height: calc( 1.5em + 0.2 * 1rem );
  274. }
  275. h1 {
  276. font-size: 1.9rem;
  277. line-height: calc( 1.2em + 0.2 * 1rem );
  278. }
  279. h2 {
  280. font-size: 1.6rem;
  281. line-height: calc( 1.3em + 0.2 * 1rem );
  282. }
  283. h3 {
  284. font-size: 1.35rem;
  285. line-height: calc( 1.4em + 0.2 * 1rem );
  286. }
  287. @media (min-width: 20em) {
  288. /* The (100vw - 20rem) / (50 - 20) part
  289. resolves to 0-1rem, depending on the
  290. viewport width (between 20em and 50em). */
  291. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  292. font-size: calc( 1rem + .6 * (100vw - 20rem) / (50 - 20) );
  293. line-height: calc( 1.5em + 0.2 * (100vw - 50rem) / (20 - 50) );
  294. margin-left: 0;
  295. }
  296. h1 {
  297. font-size: calc( 1.9rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  298. line-height: calc( 1.2em + 0.2 * (100vw - 50rem) / (20 - 50) );
  299. }
  300. h2 {
  301. font-size: calc( 1.5rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  302. line-height: calc( 1.3em + 0.2 * (100vw - 50rem) / (20 - 50) );
  303. }
  304. h3 {
  305. font-size: calc( 1.35rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  306. line-height: calc( 1.4em + 0.2 * (100vw - 50rem) / (20 - 50) );
  307. }
  308. }
  309. @media (min-width: 50em) {
  310. /* The right part of the addition *must* be a
  311. rem value. In this example we *could* change
  312. the whole declaration to font-size:2.5rem,
  313. but if our baseline value was not expressed
  314. in rem we would have to use calc. */
  315. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  316. font-size: calc( 1rem + .6 * 1rem );
  317. line-height: 1.5em;
  318. }
  319. p, li, pre, details {
  320. margin-left: 3rem;
  321. }
  322. h1 {
  323. font-size: calc( 1.9rem + 1.5 * 1rem );
  324. line-height: 1.2em;
  325. }
  326. h2 {
  327. font-size: calc( 1.5rem + 1.5 * 1rem );
  328. line-height: 1.3em;
  329. }
  330. h3 {
  331. font-size: calc( 1.35rem + 1.5 * 1rem );
  332. line-height: 1.4em;
  333. }
  334. figure img {
  335. max-width: 500px;
  336. max-height: 500px;
  337. }
  338. }
  339. figure.unsquared {
  340. margin-bottom: 1.5rem;
  341. }
  342. figure.unsquared img {
  343. height: inherit;
  344. }
  345. @media print {
  346. body { font-size: 100%; }
  347. a:after { content: " (" attr(href) ")"; }
  348. a, a:link, a:visited, a:after {
  349. text-decoration: underline;
  350. text-shadow: none !important;
  351. background-image: none !important;
  352. background: white;
  353. color: black;
  354. }
  355. abbr[title] { border-bottom: 0; }
  356. abbr[title]:after { content: " (" attr(title) ")"; }
  357. img { page-break-inside: avoid; }
  358. @page { margin: 2cm .5cm; }
  359. h1, h2, h3 { page-break-after: avoid; }
  360. p3 { orphans: 3; widows: 3; }
  361. img {
  362. max-width: 250px !important;
  363. max-height: 250px !important;
  364. }
  365. nav, aside { display: none; }
  366. }
  367. ul.with_columns {
  368. column-count: 1;
  369. }
  370. @media (min-width: 20em) {
  371. ul.with_columns {
  372. column-count: 2;
  373. }
  374. }
  375. @media (min-width: 50em) {
  376. ul.with_columns {
  377. column-count: 3;
  378. }
  379. }
  380. ul.with_two_columns {
  381. column-count: 1;
  382. }
  383. @media (min-width: 20em) {
  384. ul.with_two_columns {
  385. column-count: 1;
  386. }
  387. }
  388. @media (min-width: 50em) {
  389. ul.with_two_columns {
  390. column-count: 2;
  391. }
  392. }
  393. .gallery {
  394. display: flex;
  395. flex-wrap: wrap;
  396. justify-content: space-around;
  397. }
  398. .gallery figure img {
  399. margin-left: 1rem;
  400. margin-right: 1rem;
  401. }
  402. .gallery figure figcaption {
  403. font-family: 'ConcourseT3'
  404. }
  405. footer {
  406. font-family: 'ConcourseT3';
  407. display: flex;
  408. flex-direction: column;
  409. border-top: 3px solid white;
  410. padding: 4rem 0;
  411. background-color: #07486c;
  412. color: white;
  413. }
  414. footer > * {
  415. max-width: 50rem;
  416. margin: 0 auto;
  417. }
  418. footer a {
  419. color: #f1c40f;
  420. }
  421. footer .avatar {
  422. width: 200px;
  423. height: 200px;
  424. border-radius: 50%;
  425. float: left;
  426. -webkit-shape-outside: circle();
  427. shape-outside: circle();
  428. margin-right: 2rem;
  429. padding: 2px 5px 5px 2px;
  430. background: white;
  431. border-left: 1px solid #f1c40f;
  432. border-top: 1px solid #f1c40f;
  433. border-right: 5px solid #f1c40f;
  434. border-bottom: 5px solid #f1c40f;
  435. }
  436. </style>
  437. <h1>
  438. <span><a id="jumper" href="#jumpto" title="Un peu perdu ?">?</a></span>
  439. Auto-formatting JavaScript Code Style (archive)
  440. <time>Pour la pérennité des contenus liés. Non-indexé, retrait sur simple email.</time>
  441. </h1>
  442. <section>
  443. <article>
  444. <h3><a href="https://medium.com/@addyosmani/auto-formatting-javascript-code-style-fe0f98a923b8">Source originale du contenu</a></h3>
  445. <figure name="46d5" id="46d5" class="graf--figure graf--first"><div class="aspectRatioPlaceholder is-locked"><p class="aspect-ratio-fill"/><img class="graf-image" data-image-id="1*KLFQyME1EhxoWNsqk6Od8Q.gif" data-width="1400" data-height="738" data-action="zoom" data-action-value="1*KLFQyME1EhxoWNsqk6Od8Q.gif" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*KLFQyME1EhxoWNsqk6Od8Q.gif"/></div></figure>
  446. <h2 name="29c0" id="29c0" class="graf--h2">Auto-formatting JavaScript Code Style</h2>
  447. <p name="b239" id="b239" class="graf--p graf--empty"><br/></p>
  448. <p name="d206" id="d206" class="graf--p">Today, we’re going to look at the powerful new <strong class="markup--strong markup--p-strong">auto-formatting</strong> feature in <a href="http://jscs.info" data-href="http://jscs.info" class="markup--anchor markup--p-anchor" rel="nofollow"><strong class="markup--strong markup--p-strong">JSCS</strong></a> for automatically applying style guide rules in our scripts. This has been <a href="https://github.com/jscs-dev/node-jscs/issues/516" data-href="https://github.com/jscs-dev/node-jscs/issues/516" class="markup--anchor markup--p-anchor" rel="nofollow">in-development</a> for some time and is in my view, a game changer.</p>
  449. <h3 name="61ad" id="61ad" class="graf--h3">JSCS</h3>
  450. <p name="aed0" id="aed0" class="graf--p">In a number of the OSS projects we hack on at Google, we love using JSCS<strong class="markup--strong markup--p-strong"> </strong>for linting JS against rules in our style guide. JSCS excels at catching style issues like mixing spaces and tabs, inconsistent quote marks, trailing whitespace &amp; it can enforce several other <a href="http://jscs.info/rules.html" data-href="http://jscs.info/rules.html" class="markup--anchor markup--p-anchor" rel="nofollow">validation rules</a>.</p>
  451. <p name="3558" id="3558" class="graf--p">For convenience, JSCS includes presets for the <a href="https://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml" data-href="https://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml" class="markup--anchor markup--p-anchor" rel="nofollow">Google</a>, <a href="https://github.com/felixge/node-style-guide" data-href="https://github.com/felixge/node-style-guide" class="markup--anchor markup--p-anchor" rel="nofollow">Node</a> and <a href="https://contribute.jquery.org/style-guide/js/" data-href="https://contribute.jquery.org/style-guide/js/" class="markup--anchor markup--p-anchor" rel="nofollow">jQuery</a> style guides, amongst others. This makes setup super convenient. Custom configuration can be applied via a <a href="https://github.com/google/web-starter-kit/blob/master/.jscsrc" data-href="https://github.com/google/web-starter-kit/blob/master/.jscsrc" class="markup--anchor markup--p-anchor" rel="nofollow">.jscsrc</a> file and for the projects I work on we usually only require minimal additional tweaking here.</p>
  452. <p name="5c5d" id="5c5d" class="graf--p">I generally use JSCS in both my editor (Sublime Text 3) thanks to <a href="https://packagecontrol.io/packages/SublimeLinter-jscs" data-href="https://packagecontrol.io/packages/SublimeLinter-jscs" class="markup--anchor markup--p-anchor" rel="nofollow">SublimeLinter-JSCS</a>:</p>
  453. <figure name="7313" id="7313" class="graf--figure"><div class="aspectRatioPlaceholder is-locked"><p class="aspect-ratio-fill"/><img class="graf-image" data-image-id="1*uiYye9J142y8fIZGRnufEw.png" data-width="1444" data-height="696" data-action="zoom" data-action-value="1*uiYye9J142y8fIZGRnufEw.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*uiYye9J142y8fIZGRnufEw.png"/></div><figcaption class="imageCaption">My theme of choice is Seti UI in case you’re interested</figcaption></figure>
  454. <p name="2a0b" id="2a0b" class="graf--p">As well as in my build process thanks to <a href="https://www.npmjs.com/package/gulp-jscs" data-href="https://www.npmjs.com/package/gulp-jscs" class="markup--anchor markup--p-anchor" rel="nofollow">gulp-jscs</a> by <a href="http://github.com/SindreSorhus" data-href="http://github.com/SindreSorhus" class="markup--anchor markup--p-anchor" rel="nofollow">Sindre Sorhus</a>. The CLI works great too if you prefer to use JSCS directly or are using npm scripts/make for your build:</p>
  455. <figure name="f800" id="f800" class="graf--figure"><div class="aspectRatioPlaceholder is-locked"><p class="aspect-ratio-fill"/><img class="graf-image" data-image-id="1*OnQr3FoHNj4dHwIi7f9FyQ.png" data-width="2114" data-height="934" data-action="zoom" data-action-value="1*OnQr3FoHNj4dHwIi7f9FyQ.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*OnQr3FoHNj4dHwIi7f9FyQ.png"/></div></figure>
  456. <h3 name="1e26" id="1e26" class="graf--h3">Auto-formatting JS to match a Style Guide. OMG!</h3>
  457. <p name="e3e6" id="e3e6" class="graf--p graf--empty"><br/></p>
  458. <p name="6934" id="6934" class="graf--p">Validation alone is powerful, but as of <a href="https://github.com/jscs-dev/node-jscs/releases/tag/v1.12.0" data-href="https://github.com/jscs-dev/node-jscs/releases/tag/v1.12.0" class="markup--anchor markup--p-anchor" rel="nofollow">JSCS 1.12.0</a>, the tool now supports <strong class="markup--strong markup--p-strong">automatically</strong> <strong class="markup--strong markup--p-strong">formatting</strong> your code to adhere to your style guide. This is freakin’ amazing and really takes style enforcement to a whole other level. Auto-formatting is available by passing the `-x` flag to JSCS.</p>
  459. <figure name="35b8" id="35b8" class="graf--figure"><div class="aspectRatioPlaceholder is-locked"><p class="aspect-ratio-fill"/><img class="graf-image" data-image-id="1*qlpIXZBqGXx7GMsk02wD0g.png" data-width="1458" data-height="424" data-action="zoom" data-action-value="1*qlpIXZBqGXx7GMsk02wD0g.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*qlpIXZBqGXx7GMsk02wD0g.png"/></div></figure>
  460. <p name="f18d" id="f18d" class="graf--p">Thanks go out to Mike Sherov and the rest of the <a href="https://github.com/jscs-dev/node-jscs/graphs/contributors" data-href="https://github.com/jscs-dev/node-jscs/graphs/contributors" class="markup--anchor markup--p-anchor" rel="nofollow">JSCS team</a> for making this possible. I’m extremely excited to see this work land.</p>
  461. <figure name="969c" id="969c" class="graf--figure"><div class="aspectRatioPlaceholder is-locked"><p class="aspect-ratio-fill"/><img class="graf-image" data-image-id="1*QQf3SVpKD7WRW_Thhg8I7g.gif" data-width="270" data-height="246" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*QQf3SVpKD7WRW_Thhg8I7g.gif"/></div></figure>
  462. <p name="5ef1" id="5ef1" class="graf--p">The simplicity of the above demo really doesn’t do the nuance and complexity involved in shipping this feature justice, but we can try a more detailed example in my text editor.</p>
  463. <h3 name="ea3f" id="ea3f" class="graf--h3">Auto-formatting JS Code Style in Sublime</h3>
  464. <p name="7618" id="7618" class="graf--p graf--empty"><br/></p>
  465. <p name="560a" id="560a" class="graf--p">Let’s take the code snippet from earlier, which contained issues like inconsistent indentation, missing spaces after opening brackets and operators sticking to expressions where they shouldn’t.</p>
  466. <figure name="951f" id="951f" class="graf--figure"><div class="aspectRatioPlaceholder is-locked"><p class="aspect-ratio-fill"/><img class="graf-image" data-image-id="1*YxPlWntHlg4b9QFm-r1Y3A.png" data-width="1302" data-height="364" data-action="zoom" data-action-value="1*YxPlWntHlg4b9QFm-r1Y3A.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*YxPlWntHlg4b9QFm-r1Y3A.png"/></div></figure>
  467. <p name="ccfb" id="ccfb" class="graf--p">I’m going to use a new Sublime Text plugin called <a href="https://packagecontrol.io/packages/JSCS-Formatter" data-href="https://packagecontrol.io/packages/JSCS-Formatter" class="markup--anchor markup--p-anchor" rel="nofollow"><strong class="markup--strong markup--p-strong">JSCSFormatter</strong></a><strong class="markup--strong markup--p-strong"> </strong>by <a href="https://github.com/TheSavior" data-href="https://github.com/TheSavior" class="markup--anchor markup--p-anchor" rel="nofollow">Eli White</a>, which will automatically fix style guide issues based on your existing JSCS configuration.</p>
  468. <h4 name="89d4" id="89d4" class="graf--h4">Setup</h4>
  469. <p name="c584" id="c584" class="graf--p">Assuming you have Node and <a href="https://packagecontrol.io/" data-href="https://packagecontrol.io/" class="markup--anchor markup--p-anchor" rel="nofollow">Package Control</a> already installed on your system:</p>
  470. <ul class="postList"><li name="3193" id="3193" class="graf--li">Install JSCS globally using npm (`npm install -g jscs`)</li><li name="9b31" id="9b31" class="graf--li">Next, open up the Command Palette in Sublime and type <em class="markup--em markup--li-em">Install Package</em>.</li><li name="7708" id="7708" class="graf--li">When the plugin list displays, search for `jscs format`. Select the entry ‘JSCSFormatter’</li><li name="5249" id="5249" class="graf--li">Install JSCSFormatter. Party!</li></ul>
  471. <h4 name="b581" id="b581" class="graf--h4">Usage</h4>
  472. <p name="5111" id="5111" class="graf--p">From the Command Palette, we can now just select ‘JSCSFormatter: Format this file’ to automatically format the current file based on the rules specified in your JSCS configuration:</p>
  473. <figure name="5411" id="5411" class="graf--figure"><div class="aspectRatioPlaceholder is-locked"><p class="aspect-ratio-fill"/><img class="graf-image" data-image-id="1*dHoCZWvu7WEMQC6u4wJhHQ.png" data-width="1618" data-height="720" data-action="zoom" data-action-value="1*dHoCZWvu7WEMQC6u4wJhHQ.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*dHoCZWvu7WEMQC6u4wJhHQ.png"/></div></figure>
  474. <p name="5d1d" id="5d1d" class="graf--p"><strong class="markup--strong markup--p-strong">BOOM!</strong>:</p>
  475. <figure name="ce94" id="ce94" class="graf--figure"><div class="aspectRatioPlaceholder is-locked"><p class="aspect-ratio-fill"/><img class="graf-image" data-image-id="1*rvs5GF0kH1MavpajxX3YRA.png" data-width="1458" data-height="716" data-action="zoom" data-action-value="1*rvs5GF0kH1MavpajxX3YRA.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*rvs5GF0kH1MavpajxX3YRA.png"/></div></figure>
  476. <p name="ad3d" id="ad3d" class="graf--p">Note: JSCS 1.12.0 includes support for auto-formatting a number of popular rules, including <strong class="markup--strong markup--p-strong">EOF, spacing and indentation validation</strong>. Any augmentation of the AST is not yet supported, however JSCS will eventually support all rules. The other good news is that the internal `token-assert` module makes writing custom autoformatting rules quite trivial.</p>
  477. <p name="67a2" id="67a2" class="graf--p">That said, there are still more rules they would love to support and help is always <a href="http://jscs.info/contributing.html" data-href="http://jscs.info/contributing.html" class="markup--anchor markup--p-anchor" rel="nofollow">welcome</a>. Examples of more specific rules that they are interested in adding include disallowing commas before line breaks and disallowing anonymous functions.</p>
  478. <h3 name="3483" id="3483" class="graf--h3">Wrapping up</h3>
  479. <p name="5b2c" id="5b2c" class="graf--p graf--empty"><br/></p>
  480. <p name="91f3" id="91f3" class="graf--p">The <a href="http://jscs.info/overview.html" data-href="http://jscs.info/overview.html" class="markup--anchor markup--p-anchor" rel="nofollow">tooling</a> around JSCS is constantly growing and support has been available for Atom, VIM, WebStorm, Brackets and a number of other editors for a while.</p>
  481. <p name="50d1" id="50d1" class="graf--p graf--last">If you haven’t been using JSCS for style validation, hopefully the idea of <strong class="markup--strong markup--p-strong">automatically formatting your source </strong>will make it sweet enough to try out. Thanks once again to the mammoth efforts of the JSCS team for improving developer tooling in this space. Y’all rock.</p>
  482. </article>
  483. </section>
  484. <nav id="jumpto">
  485. <p>
  486. <a href="/david/blog/">Accueil du blog</a> |
  487. <a href="https://medium.com/@addyosmani/auto-formatting-javascript-code-style-fe0f98a923b8">Source originale</a> |
  488. <a href="/david/stream/2019/">Accueil du flux</a>
  489. </p>
  490. </nav>
  491. <footer>
  492. <div>
  493. <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
  494. <p>
  495. Bonjour/Hi!
  496. Je suis <a href="/david/" title="Profil public">David&nbsp;Larlet</a>, je vis actuellement à Montréal et j’alimente cet espace depuis 15 ans. <br>
  497. Si tu as apprécié cette lecture, n’hésite pas à poursuivre ton exploration. Par exemple via les <a href="/david/blog/" title="Expériences bienveillantes">réflexions bimestrielles</a>, la <a href="/david/stream/2019/" title="Pensées (dés)articulées">veille hebdomadaire</a> ou en t’abonnant au <a href="/david/log/" title="S’abonner aux publications via RSS">flux RSS</a> (<a href="/david/blog/2019/flux-rss/" title="Tiens c’est quoi un flux RSS ?">so 2005</a>).
  498. </p>
  499. <p>
  500. Je m’intéresse à la place que je peux avoir dans ce monde. En tant qu’humain, en tant que membre d’une famille et en tant qu’associé d’une coopérative. De temps en temps, je fais aussi des <a href="https://github.com/davidbgk" title="Principalement sur Github mais aussi ailleurs">trucs techniques</a>. Et encore plus rarement, <a href="/david/talks/" title="En ce moment je laisse plutôt la place aux autres">j’en parle</a>.
  501. </p>
  502. <p>
  503. Voici quelques articles choisis :
  504. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  505. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  506. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  507. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  508. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  509. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  510. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  511. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  512. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  513. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  514. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  515. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  516. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  517. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  518. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  519. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  520. </p>
  521. <p>
  522. On peut <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">échanger par courriel</a>. Si éventuellement tu souhaites que l’on travaille ensemble, tu devrais commencer par consulter le <a href="http://larlet.com">profil dédié à mon activité professionnelle</a> et/ou contacter directement <a href="http://scopyleft.fr/">scopyleft</a>, la <abbr title="Société coopérative et participative">SCOP</abbr> dont je fais partie depuis six ans. Je recommande au préalable de lire <a href="/david/blog/2018/cout-site/" title="Attention ce qui va suivre peut vous choquer">combien coûte un site</a> et pourquoi je suis plutôt favorable à une <a href="/david/pro/devis/" title="Discutons-en !">non-demande de devis</a>.
  523. </p>
  524. <p>
  525. Je ne traque pas ta navigation mais mon
  526. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  527. conserve des logs d’accès.
  528. </p>
  529. </div>
  530. </footer>
  531. <script type="text/javascript">
  532. ;(_ => {
  533. const jumper = document.getElementById('jumper')
  534. jumper.addEventListener('click', e => {
  535. e.preventDefault()
  536. const anchor = e.target.getAttribute('href')
  537. const targetEl = document.getElementById(anchor.substring(1))
  538. targetEl.scrollIntoView({behavior: 'smooth'})
  539. })
  540. })()
  541. </script>