readme.html 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142
  1. <!DOCTYPE html><html><head><meta charset="utf-8"><style>body {
  2. width: 45em;
  3. border: 1px solid #ddd;
  4. outline: 1300px solid #fff;
  5. margin: 16px auto;
  6. }
  7. body .markdown-body
  8. {
  9. padding: 30px;
  10. }
  11. @font-face {
  12. font-family: fontawesome-mini;
  13. src: url(data:font/woff;charset=utf-8;base64,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) format('woff');
  14. }
  15. @font-face {
  16. font-family: octicons-anchor;
  17. src: url(data:font/woff;charset=utf-8;base64,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) format('woff');
  18. }
  19. .markdown-body {
  20. font-family: sans-serif;
  21. -ms-text-size-adjust: 100%;
  22. -webkit-text-size-adjust: 100%;
  23. color: #333333;
  24. overflow: hidden;
  25. font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
  26. font-size: 16px;
  27. line-height: 1.6;
  28. word-wrap: break-word;
  29. }
  30. .markdown-body a {
  31. background: transparent;
  32. }
  33. .markdown-body a:active,
  34. .markdown-body a:hover {
  35. outline: 0;
  36. }
  37. .markdown-body b,
  38. .markdown-body strong {
  39. font-weight: bold;
  40. }
  41. .markdown-body mark {
  42. background: #ff0;
  43. color: #000;
  44. font-style: italic;
  45. font-weight: bold;
  46. }
  47. .markdown-body sub,
  48. .markdown-body sup {
  49. font-size: 75%;
  50. line-height: 0;
  51. position: relative;
  52. vertical-align: baseline;
  53. }
  54. .markdown-body sup {
  55. top: -0.5em;
  56. }
  57. .markdown-body sub {
  58. bottom: -0.25em;
  59. }
  60. .markdown-body h1 {
  61. font-size: 2em;
  62. margin: 0.67em 0;
  63. }
  64. .markdown-body img {
  65. border: 0;
  66. }
  67. .markdown-body hr {
  68. -moz-box-sizing: content-box;
  69. box-sizing: content-box;
  70. height: 0;
  71. }
  72. .markdown-body pre {
  73. overflow: auto;
  74. }
  75. .markdown-body code,
  76. .markdown-body kbd,
  77. .markdown-body pre,
  78. .markdown-body samp {
  79. font-family: monospace, monospace;
  80. font-size: 1em;
  81. }
  82. .markdown-body input {
  83. color: inherit;
  84. font: inherit;
  85. margin: 0;
  86. }
  87. .markdown-body html input[disabled] {
  88. cursor: default;
  89. }
  90. .markdown-body input {
  91. line-height: normal;
  92. }
  93. .markdown-body input[type="checkbox"] {
  94. box-sizing: border-box;
  95. padding: 0;
  96. }
  97. .markdown-body table {
  98. border-collapse: collapse;
  99. border-spacing: 0;
  100. }
  101. .markdown-body td,
  102. .markdown-body th {
  103. padding: 0;
  104. }
  105. .markdown-body .codehilitetable {
  106. border: 0;
  107. border-spacing: 0;
  108. }
  109. .markdown-body .codehilitetable tr {
  110. border: 0;
  111. }
  112. .markdown-body .codehilitetable pre,
  113. .markdown-body .codehilitetable div.codehilite {
  114. margin: 0;
  115. }
  116. .markdown-body .linenos,
  117. .markdown-body .code,
  118. .markdown-body .codehilitetable td {
  119. border: 0;
  120. padding: 0;
  121. }
  122. .markdown-body td:not(.linenos) .linenodiv {
  123. padding: 0 !important;
  124. }
  125. .markdown-body .code {
  126. width: 100%;
  127. }
  128. .markdown-body .linenos div pre,
  129. .markdown-body .linenodiv pre,
  130. .markdown-body .linenodiv {
  131. border: 0;
  132. -webkit-border-radius: 0;
  133. -moz-border-radius: 0;
  134. border-radius: 0;
  135. -webkit-border-top-left-radius: 3px;
  136. -webkit-border-bottom-left-radius: 3px;
  137. -moz-border-radius-topleft: 3px;
  138. -moz-border-radius-bottomleft: 3px;
  139. border-top-left-radius: 3px;
  140. border-bottom-left-radius: 3px;
  141. }
  142. .markdown-body .code div pre,
  143. .markdown-body .code div {
  144. border: 0;
  145. -webkit-border-radius: 0;
  146. -moz-border-radius: 0;
  147. border-radius: 0;
  148. -webkit-border-top-right-radius: 3px;
  149. -webkit-border-bottom-right-radius: 3px;
  150. -moz-border-radius-topright: 3px;
  151. -moz-border-radius-bottomright: 3px;
  152. border-top-right-radius: 3px;
  153. border-bottom-right-radius: 3px;
  154. }
  155. .markdown-body * {
  156. -moz-box-sizing: border-box;
  157. box-sizing: border-box;
  158. }
  159. .markdown-body input {
  160. font: 13px Helvetica, arial, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol";
  161. line-height: 1.4;
  162. }
  163. .markdown-body a {
  164. color: #4183c4;
  165. text-decoration: none;
  166. }
  167. .markdown-body a:hover,
  168. .markdown-body a:focus,
  169. .markdown-body a:active {
  170. text-decoration: underline;
  171. }
  172. .markdown-body hr {
  173. height: 0;
  174. margin: 15px 0;
  175. overflow: hidden;
  176. background: transparent;
  177. border: 0;
  178. border-bottom: 1px solid #ddd;
  179. }
  180. .markdown-body hr:before,
  181. .markdown-body hr:after {
  182. display: table;
  183. content: " ";
  184. }
  185. .markdown-body hr:after {
  186. clear: both;
  187. }
  188. .markdown-body h1,
  189. .markdown-body h2,
  190. .markdown-body h3,
  191. .markdown-body h4,
  192. .markdown-body h5,
  193. .markdown-body h6 {
  194. margin-top: 15px;
  195. margin-bottom: 15px;
  196. line-height: 1.1;
  197. }
  198. .markdown-body h1 {
  199. font-size: 30px;
  200. }
  201. .markdown-body h2 {
  202. font-size: 21px;
  203. }
  204. .markdown-body h3 {
  205. font-size: 16px;
  206. }
  207. .markdown-body h4 {
  208. font-size: 14px;
  209. }
  210. .markdown-body h5 {
  211. font-size: 12px;
  212. }
  213. .markdown-body h6 {
  214. font-size: 11px;
  215. }
  216. .markdown-body blockquote {
  217. margin: 0;
  218. }
  219. .markdown-body ul,
  220. .markdown-body ol {
  221. padding: 0;
  222. margin-top: 0;
  223. margin-bottom: 0;
  224. }
  225. .markdown-body ol ol,
  226. .markdown-body ul ol {
  227. list-style-type: lower-roman;
  228. }
  229. .markdown-body ul ul ol,
  230. .markdown-body ul ol ol,
  231. .markdown-body ol ul ol,
  232. .markdown-body ol ol ol {
  233. list-style-type: lower-alpha;
  234. }
  235. .markdown-body dd {
  236. margin-left: 0;
  237. }
  238. .markdown-body code,
  239. .markdown-body pre,
  240. .markdown-body samp {
  241. font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
  242. font-size: 12px;
  243. }
  244. .markdown-body pre {
  245. margin-top: 0;
  246. margin-bottom: 0;
  247. }
  248. .markdown-body kbd {
  249. background-color: #e7e7e7;
  250. background-image: -moz-linear-gradient(#fefefe, #e7e7e7);
  251. background-image: -webkit-linear-gradient(#fefefe, #e7e7e7);
  252. background-image: linear-gradient(#fefefe, #e7e7e7);
  253. background-repeat: repeat-x;
  254. border-radius: 2px;
  255. border: 1px solid #cfcfcf;
  256. color: #000;
  257. padding: 3px 5px;
  258. line-height: 10px;
  259. font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace;
  260. display: inline-block;
  261. }
  262. .markdown-body>*:first-child {
  263. margin-top: 0 !important;
  264. }
  265. .markdown-body>*:last-child {
  266. margin-bottom: 0 !important;
  267. }
  268. .markdown-body .headeranchor-link {
  269. position: absolute;
  270. top: 0;
  271. bottom: 0;
  272. left: 0;
  273. display: block;
  274. padding-right: 6px;
  275. padding-left: 30px;
  276. margin-left: -30px;
  277. }
  278. .markdown-body .headeranchor-link:focus {
  279. outline: none;
  280. }
  281. .markdown-body h1,
  282. .markdown-body h2,
  283. .markdown-body h3,
  284. .markdown-body h4,
  285. .markdown-body h5,
  286. .markdown-body h6 {
  287. position: relative;
  288. margin-top: 1em;
  289. margin-bottom: 16px;
  290. font-weight: bold;
  291. line-height: 1.4;
  292. }
  293. .markdown-body h1 .headeranchor,
  294. .markdown-body h2 .headeranchor,
  295. .markdown-body h3 .headeranchor,
  296. .markdown-body h4 .headeranchor,
  297. .markdown-body h5 .headeranchor,
  298. .markdown-body h6 .headeranchor {
  299. display: none;
  300. color: #000;
  301. vertical-align: middle;
  302. }
  303. .markdown-body h1:hover .headeranchor-link,
  304. .markdown-body h2:hover .headeranchor-link,
  305. .markdown-body h3:hover .headeranchor-link,
  306. .markdown-body h4:hover .headeranchor-link,
  307. .markdown-body h5:hover .headeranchor-link,
  308. .markdown-body h6:hover .headeranchor-link {
  309. height: 1em;
  310. padding-left: 8px;
  311. margin-left: -30px;
  312. line-height: 1;
  313. text-decoration: none;
  314. }
  315. .markdown-body h1:hover .headeranchor-link .headeranchor,
  316. .markdown-body h2:hover .headeranchor-link .headeranchor,
  317. .markdown-body h3:hover .headeranchor-link .headeranchor,
  318. .markdown-body h4:hover .headeranchor-link .headeranchor,
  319. .markdown-body h5:hover .headeranchor-link .headeranchor,
  320. .markdown-body h6:hover .headeranchor-link .headeranchor {
  321. display: inline-block;
  322. }
  323. .markdown-body h1 {
  324. padding-bottom: 0.3em;
  325. font-size: 2.25em;
  326. line-height: 1.2;
  327. border-bottom: 1px solid #eee;
  328. }
  329. .markdown-body h2 {
  330. padding-bottom: 0.3em;
  331. font-size: 1.75em;
  332. line-height: 1.225;
  333. border-bottom: 1px solid #eee;
  334. }
  335. .markdown-body h3 {
  336. font-size: 1.5em;
  337. line-height: 1.43;
  338. }
  339. .markdown-body h4 {
  340. font-size: 1.25em;
  341. }
  342. .markdown-body h5 {
  343. font-size: 1em;
  344. }
  345. .markdown-body h6 {
  346. font-size: 1em;
  347. color: #777;
  348. }
  349. .markdown-body p,
  350. .markdown-body blockquote,
  351. .markdown-body ul,
  352. .markdown-body ol,
  353. .markdown-body dl,
  354. .markdown-body table,
  355. .markdown-body pre,
  356. .markdown-body .admonition {
  357. margin-top: 0;
  358. margin-bottom: 16px;
  359. }
  360. .markdown-body hr {
  361. height: 4px;
  362. padding: 0;
  363. margin: 16px 0;
  364. background-color: #e7e7e7;
  365. border: 0 none;
  366. }
  367. .markdown-body ul,
  368. .markdown-body ol {
  369. padding-left: 2em;
  370. }
  371. .markdown-body ul ul,
  372. .markdown-body ul ol,
  373. .markdown-body ol ol,
  374. .markdown-body ol ul {
  375. margin-top: 0;
  376. margin-bottom: 0;
  377. }
  378. .markdown-body li>p {
  379. margin-top: 16px;
  380. }
  381. .markdown-body dl {
  382. padding: 0;
  383. }
  384. .markdown-body dl dt {
  385. padding: 0;
  386. margin-top: 16px;
  387. font-size: 1em;
  388. font-style: italic;
  389. font-weight: bold;
  390. }
  391. .markdown-body dl dd {
  392. padding: 0 16px;
  393. margin-bottom: 16px;
  394. }
  395. .markdown-body blockquote {
  396. padding: 0 15px;
  397. color: #777;
  398. border-left: 4px solid #ddd;
  399. }
  400. .markdown-body blockquote>:first-child {
  401. margin-top: 0;
  402. }
  403. .markdown-body blockquote>:last-child {
  404. margin-bottom: 0;
  405. }
  406. .markdown-body table {
  407. display: block;
  408. width: 100%;
  409. overflow: auto;
  410. word-break: normal;
  411. word-break: keep-all;
  412. }
  413. .markdown-body table th {
  414. font-weight: bold;
  415. }
  416. .markdown-body table th,
  417. .markdown-body table td {
  418. padding: 6px 13px;
  419. border: 1px solid #ddd;
  420. }
  421. .markdown-body table tr {
  422. background-color: #fff;
  423. border-top: 1px solid #ccc;
  424. }
  425. .markdown-body table tr:nth-child(2n) {
  426. background-color: #f8f8f8;
  427. }
  428. .markdown-body img {
  429. max-width: 100%;
  430. -moz-box-sizing: border-box;
  431. box-sizing: border-box;
  432. }
  433. .markdown-body code,
  434. .markdown-body samp {
  435. padding: 0;
  436. padding-top: 0.2em;
  437. padding-bottom: 0.2em;
  438. margin: 0;
  439. font-size: 85%;
  440. background-color: rgba(0,0,0,0.04);
  441. border-radius: 3px;
  442. }
  443. .markdown-body code:before,
  444. .markdown-body code:after {
  445. letter-spacing: -0.2em;
  446. content: "\00a0";
  447. }
  448. .markdown-body pre>code {
  449. padding: 0;
  450. margin: 0;
  451. font-size: 100%;
  452. word-break: normal;
  453. white-space: pre;
  454. background: transparent;
  455. border: 0;
  456. }
  457. .markdown-body .codehilite {
  458. margin-bottom: 16px;
  459. }
  460. .markdown-body .codehilite pre,
  461. .markdown-body pre {
  462. padding: 16px;
  463. overflow: auto;
  464. font-size: 85%;
  465. line-height: 1.45;
  466. background-color: #f7f7f7;
  467. border-radius: 3px;
  468. }
  469. .markdown-body .codehilite pre {
  470. margin-bottom: 0;
  471. word-break: normal;
  472. }
  473. .markdown-body pre {
  474. word-wrap: normal;
  475. }
  476. .markdown-body pre code {
  477. display: inline;
  478. max-width: initial;
  479. padding: 0;
  480. margin: 0;
  481. overflow: initial;
  482. line-height: inherit;
  483. word-wrap: normal;
  484. background-color: transparent;
  485. border: 0;
  486. }
  487. .markdown-body pre code:before,
  488. .markdown-body pre code:after {
  489. content: normal;
  490. }
  491. /* Admonition */
  492. .markdown-body .admonition {
  493. -webkit-border-radius: 3px;
  494. -moz-border-radius: 3px;
  495. position: relative;
  496. border-radius: 3px;
  497. border: 1px solid #e0e0e0;
  498. border-left: 6px solid #333;
  499. padding: 10px 10px 10px 30px;
  500. }
  501. .markdown-body .admonition table {
  502. color: #333;
  503. }
  504. .markdown-body .admonition p {
  505. padding: 0;
  506. }
  507. .markdown-body .admonition-title {
  508. font-weight: bold;
  509. margin: 0;
  510. }
  511. .markdown-body .admonition>.admonition-title {
  512. color: #333;
  513. }
  514. .markdown-body .attention>.admonition-title {
  515. color: #a6d796;
  516. }
  517. .markdown-body .caution>.admonition-title {
  518. color: #d7a796;
  519. }
  520. .markdown-body .hint>.admonition-title {
  521. color: #96c6d7;
  522. }
  523. .markdown-body .danger>.admonition-title {
  524. color: #c25f77;
  525. }
  526. .markdown-body .question>.admonition-title {
  527. color: #96a6d7;
  528. }
  529. .markdown-body .note>.admonition-title {
  530. color: #d7c896;
  531. }
  532. .markdown-body .admonition:before,
  533. .markdown-body .attention:before,
  534. .markdown-body .caution:before,
  535. .markdown-body .hint:before,
  536. .markdown-body .danger:before,
  537. .markdown-body .question:before,
  538. .markdown-body .note:before {
  539. font: normal normal 16px fontawesome-mini;
  540. -moz-osx-font-smoothing: grayscale;
  541. -webkit-user-select: none;
  542. -moz-user-select: none;
  543. -ms-user-select: none;
  544. user-select: none;
  545. line-height: 1.5;
  546. color: #333;
  547. position: absolute;
  548. left: 0;
  549. top: 0;
  550. padding-top: 10px;
  551. padding-left: 10px;
  552. }
  553. .markdown-body .admonition:before {
  554. content: "\f056\00a0";
  555. color: 333;
  556. }
  557. .markdown-body .attention:before {
  558. content: "\f058\00a0";
  559. color: #a6d796;
  560. }
  561. .markdown-body .caution:before {
  562. content: "\f06a\00a0";
  563. color: #d7a796;
  564. }
  565. .markdown-body .hint:before {
  566. content: "\f05a\00a0";
  567. color: #96c6d7;
  568. }
  569. .markdown-body .danger:before {
  570. content: "\f057\00a0";
  571. color: #c25f77;
  572. }
  573. .markdown-body .question:before {
  574. content: "\f059\00a0";
  575. color: #96a6d7;
  576. }
  577. .markdown-body .note:before {
  578. content: "\f040\00a0";
  579. color: #d7c896;
  580. }
  581. .markdown-body .admonition::after {
  582. content: normal;
  583. }
  584. .markdown-body .attention {
  585. border-left: 6px solid #a6d796;
  586. }
  587. .markdown-body .caution {
  588. border-left: 6px solid #d7a796;
  589. }
  590. .markdown-body .hint {
  591. border-left: 6px solid #96c6d7;
  592. }
  593. .markdown-body .danger {
  594. border-left: 6px solid #c25f77;
  595. }
  596. .markdown-body .question {
  597. border-left: 6px solid #96a6d7;
  598. }
  599. .markdown-body .note {
  600. border-left: 6px solid #d7c896;
  601. }
  602. .markdown-body .admonition>*:first-child {
  603. margin-top: 0 !important;
  604. }
  605. .markdown-body .admonition>*:last-child {
  606. margin-bottom: 0 !important;
  607. }
  608. /* progress bar*/
  609. .markdown-body .progress {
  610. display: block;
  611. width: 300px;
  612. margin: 10px 0;
  613. height: 24px;
  614. -webkit-border-radius: 3px;
  615. -moz-border-radius: 3px;
  616. border-radius: 3px;
  617. background-color: #ededed;
  618. position: relative;
  619. box-shadow: inset -1px 1px 3px rgba(0, 0, 0, .1);
  620. }
  621. .markdown-body .progress-label {
  622. position: absolute;
  623. text-align: center;
  624. font-weight: bold;
  625. width: 100%; margin: 0;
  626. line-height: 24px;
  627. color: #333;
  628. text-shadow: 1px 1px 0 #fefefe, -1px -1px 0 #fefefe, -1px 1px 0 #fefefe, 1px -1px 0 #fefefe, 0 1px 0 #fefefe, 0 -1px 0 #fefefe, 1px 0 0 #fefefe, -1px 0 0 #fefefe, 1px 1px 2px #000;
  629. -webkit-font-smoothing: antialiased !important;
  630. white-space: nowrap;
  631. overflow: hidden;
  632. }
  633. .markdown-body .progress-bar {
  634. height: 24px;
  635. float: left;
  636. -webkit-border-radius: 3px;
  637. -moz-border-radius: 3px;
  638. border-radius: 3px;
  639. background-color: #96c6d7;
  640. box-shadow: inset 0 1px 0 rgba(255, 255, 255, .5), inset 0 -1px 0 rgba(0, 0, 0, .1);
  641. background-size: 30px 30px;
  642. background-image: -webkit-linear-gradient(
  643. 135deg, rgba(255, 255, 255, .4) 27%,
  644. transparent 27%,
  645. transparent 52%, rgba(255, 255, 255, .4) 52%,
  646. rgba(255, 255, 255, .4) 77%,
  647. transparent 77%, transparent
  648. );
  649. background-image: -moz-linear-gradient(
  650. 135deg,
  651. rgba(255, 255, 255, .4) 27%, transparent 27%,
  652. transparent 52%, rgba(255, 255, 255, .4) 52%,
  653. rgba(255, 255, 255, .4) 77%, transparent 77%,
  654. transparent
  655. );
  656. background-image: -ms-linear-gradient(
  657. 135deg,
  658. rgba(255, 255, 255, .4) 27%, transparent 27%,
  659. transparent 52%, rgba(255, 255, 255, .4) 52%,
  660. rgba(255, 255, 255, .4) 77%, transparent 77%,
  661. transparent
  662. );
  663. background-image: -o-linear-gradient(
  664. 135deg,
  665. rgba(255, 255, 255, .4) 27%, transparent 27%,
  666. transparent 52%, rgba(255, 255, 255, .4) 52%,
  667. rgba(255, 255, 255, .4) 77%, transparent 77%,
  668. transparent
  669. );
  670. background-image: linear-gradient(
  671. 135deg,
  672. rgba(255, 255, 255, .4) 27%, transparent 27%,
  673. transparent 52%, rgba(255, 255, 255, .4) 52%,
  674. rgba(255, 255, 255, .4) 77%, transparent 77%,
  675. transparent
  676. );
  677. }
  678. .markdown-body .progress-100plus .progress-bar {
  679. background-color: #a6d796;
  680. }
  681. .markdown-body .progress-80plus .progress-bar {
  682. background-color: #c6d796;
  683. }
  684. .markdown-body .progress-60plus .progress-bar {
  685. background-color: #d7c896;
  686. }
  687. .markdown-body .progress-40plus .progress-bar {
  688. background-color: #d7a796;
  689. }
  690. .markdown-body .progress-20plus .progress-bar {
  691. background-color: #d796a6;
  692. }
  693. .markdown-body .progress-0plus .progress-bar {
  694. background-color: #c25f77;
  695. }
  696. .markdown-body .candystripe-animate .progress-bar{
  697. -webkit-animation: animate-stripes 3s linear infinite;
  698. -moz-animation: animate-stripes 3s linear infinite;
  699. animation: animate-stripes 3s linear infinite;
  700. }
  701. @-webkit-keyframes animate-stripes {
  702. 0% {
  703. background-position: 0 0;
  704. }
  705. 100% {
  706. background-position: 60px 0;
  707. }
  708. }
  709. @-moz-keyframes animate-stripes {
  710. 0% {
  711. background-position: 0 0;
  712. }
  713. 100% {
  714. background-position: 60px 0;
  715. }
  716. }
  717. @keyframes animate-stripes {
  718. 0% {
  719. background-position: 0 0;
  720. }
  721. 100% {
  722. background-position: 60px 0;
  723. }
  724. }
  725. .markdown-body .gloss .progress-bar {
  726. box-shadow:
  727. inset 0 4px 12px rgba(255, 255, 255, .7),
  728. inset 0 -12px 0 rgba(0, 0, 0, .05);
  729. }
  730. /* Multimarkdown Critic Blocks */
  731. .markdown-body .critic_mark {
  732. background: #ff0;
  733. }
  734. .markdown-body .critic_delete {
  735. color: #c82829;
  736. text-decoration: line-through;
  737. }
  738. .markdown-body .critic_insert {
  739. color: #718c00 ;
  740. text-decoration: underline;
  741. }
  742. .markdown-body .critic_comment {
  743. color: #8e908c;
  744. font-style: italic;
  745. }
  746. .markdown-body .headeranchor {
  747. font: normal normal 16px octicons-anchor;
  748. line-height: 1;
  749. display: inline-block;
  750. text-decoration: none;
  751. -webkit-font-smoothing: antialiased;
  752. -moz-osx-font-smoothing: grayscale;
  753. -webkit-user-select: none;
  754. -moz-user-select: none;
  755. -ms-user-select: none;
  756. user-select: none;
  757. }
  758. .headeranchor:before {
  759. content: '\f05c';
  760. }
  761. .markdown-body .task-list-item {
  762. list-style-type: none;
  763. }
  764. .markdown-body .task-list-item+.task-list-item {
  765. margin-top: 3px;
  766. }
  767. .markdown-body .task-list-item input {
  768. margin: 0 4px 0.25em -20px;
  769. vertical-align: middle;
  770. }
  771. /* Media */
  772. @media only screen and (min-width: 480px) {
  773. .markdown-body {
  774. font-size:14px;
  775. }
  776. }
  777. @media only screen and (min-width: 768px) {
  778. .markdown-body {
  779. font-size:16px;
  780. }
  781. }
  782. @media print {
  783. .markdown-body * {
  784. background: transparent !important;
  785. color: black !important;
  786. filter:none !important;
  787. -ms-filter: none !important;
  788. }
  789. .markdown-body {
  790. font-size:12pt;
  791. max-width:100%;
  792. outline:none;
  793. border: 0;
  794. }
  795. .markdown-body a,
  796. .markdown-body a:visited {
  797. text-decoration: underline;
  798. }
  799. .markdown-body .headeranchor-link {
  800. display: none;
  801. }
  802. .markdown-body a[href]:after {
  803. content: " (" attr(href) ")";
  804. }
  805. .markdown-body abbr[title]:after {
  806. content: " (" attr(title) ")";
  807. }
  808. .markdown-body .ir a:after,
  809. .markdown-body a[href^="javascript:"]:after,
  810. .markdown-body a[href^="#"]:after {
  811. content: "";
  812. }
  813. .markdown-body pre {
  814. white-space: pre;
  815. white-space: pre-wrap;
  816. word-wrap: break-word;
  817. }
  818. .markdown-body pre,
  819. .markdown-body blockquote {
  820. border: 1px solid #999;
  821. padding-right: 1em;
  822. page-break-inside: avoid;
  823. }
  824. .markdown-body .progress,
  825. .markdown-body .progress-bar {
  826. -moz-box-shadow: none;
  827. -webkit-box-shadow: none;
  828. box-shadow: none;
  829. }
  830. .markdown-body .progress {
  831. border: 1px solid #ddd;
  832. }
  833. .markdown-body .progress-bar {
  834. height: 22px;
  835. border-right: 1px solid #ddd;
  836. }
  837. .markdown-body tr,
  838. .markdown-body img {
  839. page-break-inside: avoid;
  840. }
  841. .markdown-body img {
  842. max-width: 100% !important;
  843. }
  844. .markdown-body p,
  845. .markdown-body h2,
  846. .markdown-body h3 {
  847. orphans: 3;
  848. widows: 3;
  849. }
  850. .markdown-body h2,
  851. .markdown-body h3 {
  852. page-break-after: avoid;
  853. }
  854. }
  855. </style><title>readme</title></head><body><article class="markdown-body"><h2 id="vuemvvm"><a name="user-content-vuemvvm" href="#vuemvvm" class="headeranchor-link" aria-hidden="true"><span class="headeranchor"></span></a>剖析Vue实现原理,实现一个MVVM</h2>
  856. <blockquote>
  857. <p>本文主要是在分析Vue源码的基础上,对其相关核心思想和逻辑进行简化,并通过实现一个简单的实现来阐述相关原理和思想,文中并不会涉及太多源码片段的解析,但其核心思想都会在文中表现出来,对阅读Vue源码会有更好的帮助,相信会让你的思路更加清晰~</p>
  858. </blockquote>
  859. <h4 id="1vuehello-world"><a name="user-content-1vuehello-world" href="#1vuehello-world" class="headeranchor-link" aria-hidden="true"><span class="headeranchor"></span></a>1、一个简单的Vue例子:<a href="///E://personal/%E5%89%8D%E7%AB%AF/mvvm/vue-demo/index.html">Hello World!</a></h4>
  860. <p><strong>code:</strong> <br />
  861. <pre><code>&lt;div id=&quot;vue-app&quot;&gt;
  862. &lt;input type=&quot;text&quot; v-model=&quot;word&quot;&gt;
  863. &lt;p&gt;{{word}}&lt;/p&gt;
  864. &lt;button v-on:click=&quot;sayHi&quot;&gt;change model&lt;/button&gt;
  865. &lt;/div&gt;
  866. &lt;script src=&quot;http://cdn.bootcss.com/vue/1.0.25/vue.js&quot;&gt;&lt;/script&gt;
  867. &lt;script&gt;
  868. var vm = new Vue({
  869. el: '#vue-app',
  870. data: {
  871. word: 'Hello World!'
  872. },
  873. methods: {
  874. sayHi: function() {
  875. this.word = 'Hi, everybody!';
  876. }
  877. }
  878. });
  879. &lt;/script&gt;
  880. </code></pre></p>
  881. <h4 id="2my-mvvm"><a name="user-content-2my-mvvm" href="#2my-mvvm" class="headeranchor-link" aria-hidden="true"><span class="headeranchor"></span></a>2、如题,今天要跟大家分享的就是实现上面的功能,是这样子的:<a href="///E://personal/%E5%89%8D%E7%AB%AF/mvvm/mvvm.html">My mvvm</a></h4>
  882. <p><strong>code:</strong><br />
  883. <pre><code>&lt;div id=&quot;mvvm-app&quot;&gt;
  884. &lt;input type=&quot;text&quot; v-model=&quot;name&quot;&gt;
  885. &lt;input type=&quot;text&quot; v-model=&quot;child.name&quot;&gt;
  886. &lt;p v-class=&quot;className&quot; class=&quot;abc&quot;&gt;
  887. {{child.child.name}}
  888. &lt;/p&gt;
  889. &lt;span v-text=&quot;child.name&quot;&gt;&lt;/span&gt;
  890. &lt;p v-html=&quot;child.html&quot;&gt;&lt;/p&gt;
  891. &lt;button v-on:click=&quot;clickBtn&quot;&gt;change model&lt;/button&gt;
  892. &lt;/div&gt;
  893. &lt;script src=&quot;./js/observer.js&quot;&gt;&lt;/script&gt;
  894. &lt;script src=&quot;./js/watcher.js&quot;&gt;&lt;/script&gt;
  895. &lt;script src=&quot;./js/compile.js&quot;&gt;&lt;/script&gt;
  896. &lt;script src=&quot;./js/mvvm.js&quot;&gt;&lt;/script&gt;
  897. &lt;script&gt;
  898. var vm = new MVVM({
  899. el: '#mvvm-app',
  900. data: {
  901. name: 'hello ',
  902. className: 'btn',
  903. spanText: 'hello world!',
  904. child: {
  905. name: '孩子名字',
  906. html: '&lt;span style=&quot;color: #f00;&quot;&gt;red&lt;/span&gt;',
  907. child: {
  908. name: '孩子的孩子名字 '
  909. }
  910. }
  911. },
  912. methods: {
  913. clickBtn: function(e) {
  914. var randomStrArr = ['childOne', 'childTwo', 'childThree'];
  915. this.child.name = randomStrArr[parseInt(Math.random() * 3)];
  916. }
  917. }
  918. });
  919. &lt;/script&gt;
  920. </code></pre></p>
  921. <h4 id="3"><a name="user-content-3" href="#3" class="headeranchor-link" aria-hidden="true"><span class="headeranchor"></span></a>3、目前实现数据绑定的几种做法</h4>
  922. <blockquote>
  923. <p>观察者模式(backbone.js)</p>
  924. <p>脏值检查(angular.js) </p>
  925. <p>数据劫持(vue.js) </p>
  926. </blockquote>
  927. <p>观察者模式一般通过sub, pub的方式实现数据和视图的绑定监听,更新数据方式通常 <code>vm.set('property', value)</code>, 这种方式现在毕竟太low了,我们更希望通过 <code>vm.property = value</code>这种方式更新数据,同时自动更新视图。</p>
  928. <p>angular.js 是通过脏值检测的方式比对数据是否有变更,来决定是否更新视图,最简单的方式就是通过 <code>setInterval()</code> 定时轮询检测数据变动,当然Google不会这么low,angular只有在指定的事件触发时进入脏值检测,大致如下:</p>
  929. <ul>
  930. <li>DOM事件,譬如用户输入文本,点击按钮等。( ng-click ) </li>
  931. <li>XHR响应事件 ( $http ) </li>
  932. <li>浏览器Location变更事件 ( $location ) </li>
  933. <li>Timer事件( $timeout , $interval ) </li>
  934. <li>执行 $digest() 或 $apply()</li>
  935. </ul>
  936. <p><strong> vue.js 则是数据劫持结合观察者模式,通过<code>Object.defineProperty()</code>来劫持各个属性的<code>setter</code>,<code>getter</code>,在数据变动时发布消息给订阅者,触发相应的监听回调。</strong></p>
  937. <h4 id="4vue-github"><a name="user-content-4vue-github" href="#4vue-github" class="headeranchor-link" aria-hidden="true"><span class="headeranchor"></span></a>4、Vue的生命周期 (<a href="https://github.com/vuejs/vue/">Github</a>)</h4>
  938. <p><img src="https://vuejs.org.cn/images/lifecycle.png" width="640px"></p>
  939. <h4 id="5"><a name="user-content-5" href="#5" class="headeranchor-link" aria-hidden="true"><span class="headeranchor"></span></a>5、我们要实现的关键点:</h4>
  940. <ul>
  941. <li>数据监听 Observer.js 和消息订阅器 Dep.js</li>
  942. <li>订阅者 Watcher.js</li>
  943. <li>指令编译器 Compile.js</li>
  944. <li>入口 mvvm</li>
  945. </ul>
  946. <h4 id="6objectdefineproperty"><a name="user-content-6objectdefineproperty" href="#6objectdefineproperty" class="headeranchor-link" aria-hidden="true"><span class="headeranchor"></span></a>6、一切基于此Object.defineProperty()</h4>
  947. <p><em>IE8+</em></p>
  948. <p><strong>code:</strong><br />
  949. <pre><code>function defineReative(data) {
  950. var val;
  951. Object.defineProperty(data, 'name', {
  952. enumerable: true, // 可枚举
  953. configurable: true, // 不能再define
  954. get: function() {
  955. return val;
  956. },
  957. set: function(newVal) {
  958. console.log('你变了:', val, ' ==&gt; ', newVal);
  959. val = newVal;
  960. }
  961. });
  962. }
  963. var data = {};
  964. defineReative(data);
  965. </code></pre></p>
  966. <h4 id="7observerjs"><a name="user-content-7observerjs" href="#7observerjs" class="headeranchor-link" aria-hidden="true"><span class="headeranchor"></span></a>7、实现Observer.js</h4>
  967. <p>负责监听源数据所有属性,一旦发生变化,通知订阅者更新视图</p>
  968. <p><a href="///E://personal/%E5%89%8D%E7%AB%AF/mvvm/js/observer.js">code</a></p>
  969. <h4 id="8compilejs"><a name="user-content-8compilejs" href="#8compilejs" class="headeranchor-link" aria-hidden="true"><span class="headeranchor"></span></a>8、实现Compile.js</h4>
  970. <p>负责解析模板指令,不同的指令绑定不同的处理回调及视图更新方法</p>
  971. <p><a href="///E://personal/%E5%89%8D%E7%AB%AF/mvvm/js/compile.js">code</a></p>
  972. <h4 id="9observe-compile-watcherjs"><a name="user-content-9observe-compile-watcherjs" href="#9observe-compile-watcherjs" class="headeranchor-link" aria-hidden="true"><span class="headeranchor"></span></a>9、如何连接observe 和 compile &ndash;&gt; watcher.js(桥梁)</h4>
  973. <p>充当数据更新的订阅者,每一个属性的变化都会通知它,在compile阶段实例化并注入回调函数</p>
  974. <p>每一个属性都有一个watcher</p>
  975. <p><a href="///E://personal/%E5%89%8D%E7%AB%AF/mvvm/js/watcher.js">code</a></p></article></body></html>