RuleTable.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // tslint:disable:no-var-requires
  2. import * as React from 'react';
  3. const tslintMetaJson = require('../tslint-meta.json');
  4. const tslintRulesJson = require('../tslint-rules.json');
  5. const tslintTestsJson = require('../tslint-tests.json');
  6. import { parseDescription } from '../utils';
  7. interface RuleTableProps {
  8. onlyShowOff: boolean;
  9. }
  10. export default class RuleTable extends React.Component<RuleTableProps> {
  11. public render() {
  12. return (
  13. <div className="container-fluid">
  14. <div className="flex-left flex-wrap units-gap hide-on-mobile">
  15. <h3 className="unit-1-3 unit-1-on-mobile site-table-header-text">规则说明</h3>
  16. <h3 className="unit-1-3 unit-1-on-mobile text-danger site-table-header-text">
  17. 错误的示例
  18. </h3>
  19. <h3 className="unit-1-3 unit-1-on-mobile text-success site-table-header-text">
  20. 正确的示例
  21. </h3>
  22. </div>
  23. {Object.keys(tslintRulesJson).map(this.renderOneRule.bind(this))}
  24. </div>
  25. );
  26. }
  27. private renderOneRule(ruleName) {
  28. if (!this.shouldShowRule(ruleName)) {
  29. return null;
  30. }
  31. return (
  32. <div
  33. id={ruleName}
  34. className={`flex-left flex-wrap top-gap-big units-gap site-row ${
  35. tslintRulesJson[ruleName] === false ? 'site-row-off site-row-wide' : ''
  36. }`}
  37. >
  38. <div className="unit-1-3 unit-1-on-mobile site-desc">
  39. <a href={`https://palantir.github.io/tslint/rules/${ruleName}/`}>{ruleName}</a>
  40. <p
  41. className="top-gap-0"
  42. dangerouslySetInnerHTML={{
  43. __html: parseDescription(tslintMetaJson[ruleName].description)
  44. }}
  45. />
  46. {this.renderReason(ruleName)}
  47. </div>
  48. <div className="unit-1-3 unit-1-on-mobile">{this.renderRuleTestBad(ruleName)}</div>
  49. <div className="unit-1-3 unit-1-on-mobile">{this.renderRuleTestGood(ruleName)}</div>
  50. </div>
  51. );
  52. }
  53. /**
  54. * 渲染此条规则配置的原因
  55. * @param ruleName 规则名称
  56. */
  57. private renderReason(ruleName: string) {
  58. if (tslintMetaJson[ruleName].reason === undefined) {
  59. return null;
  60. }
  61. return (
  62. <p
  63. className="text-muted text-small"
  64. style={{ marginTop: 5 }}
  65. dangerouslySetInnerHTML={{
  66. __html: parseDescription(tslintMetaJson[ruleName].reason)
  67. }}
  68. />
  69. );
  70. }
  71. private renderRuleTestGood(ruleName: string) {
  72. if (!tslintTestsJson[ruleName]) return null;
  73. if (!tslintTestsJson[ruleName].good) return null;
  74. return (
  75. <pre className="language-javascript site-code">
  76. <code
  77. dangerouslySetInnerHTML={{
  78. __html: tslintTestsJson[ruleName].good.replace(
  79. /(\/\/ )(good)/g,
  80. '$1<span class="bg-success text-inverse site-code-tag">$2</span>'
  81. )
  82. }}
  83. />
  84. </pre>
  85. );
  86. }
  87. private renderRuleTestBad(ruleName: string) {
  88. if (!tslintTestsJson[ruleName]) return null;
  89. if (!tslintTestsJson[ruleName].bad) return null;
  90. return (
  91. <pre className="language-javascript site-code">
  92. <code
  93. dangerouslySetInnerHTML={{
  94. __html: tslintTestsJson[ruleName].bad.replace(
  95. /(\/\/ )(bad)/g,
  96. '$1<span class="bg-danger text-inverse site-code-tag">$2</span>'
  97. )
  98. }}
  99. />
  100. </pre>
  101. );
  102. }
  103. private shouldShowRule(ruleName: string) {
  104. if (this.props.onlyShowOff && tslintRulesJson[ruleName] === false) {
  105. return false;
  106. }
  107. return true;
  108. }
  109. }