Software zum Installieren eines Smart-Mirror Frameworks , zum Nutzen von hochschulrelevanten Informationen, auf einem Raspberry-Pi.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.js 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. // @ts-nocheck
  2. 'use strict';
  3. const _ = require('lodash');
  4. const atRuleParamIndex = require('../../utils/atRuleParamIndex');
  5. const isCustomSelector = require('../../utils/isCustomSelector');
  6. const isStandardSyntaxAtRule = require('../../utils/isStandardSyntaxAtRule');
  7. const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule');
  8. const isStandardSyntaxSelector = require('../../utils/isStandardSyntaxSelector');
  9. const keywordSets = require('../../reference/keywordSets');
  10. const optionsMatches = require('../../utils/optionsMatches');
  11. const parseSelector = require('../../utils/parseSelector');
  12. const report = require('../../utils/report');
  13. const ruleMessages = require('../../utils/ruleMessages');
  14. const validateOptions = require('../../utils/validateOptions');
  15. const vendor = require('../../utils/vendor');
  16. const ruleName = 'selector-pseudo-class-no-unknown';
  17. const messages = ruleMessages(ruleName, {
  18. rejected: (selector) => `Unexpected unknown pseudo-class selector "${selector}"`,
  19. });
  20. function rule(actual, options) {
  21. return (root, result) => {
  22. const validOptions = validateOptions(
  23. result,
  24. ruleName,
  25. { actual },
  26. {
  27. actual: options,
  28. possible: {
  29. ignorePseudoClasses: [_.isString],
  30. },
  31. optional: true,
  32. },
  33. );
  34. if (!validOptions) {
  35. return;
  36. }
  37. function check(selector, node) {
  38. parseSelector(selector, result, node, (selectorTree) => {
  39. selectorTree.walkPseudos((pseudoNode) => {
  40. const value = pseudoNode.value;
  41. if (!isStandardSyntaxSelector(value)) {
  42. return;
  43. }
  44. if (isCustomSelector(value)) {
  45. return;
  46. }
  47. // Ignore pseudo-elements
  48. if (value.slice(0, 2) === '::') {
  49. return;
  50. }
  51. if (optionsMatches(options, 'ignorePseudoClasses', pseudoNode.value.slice(1))) {
  52. return;
  53. }
  54. let index = null;
  55. const name = value.slice(1).toLowerCase();
  56. if (node.type === 'atrule' && node.name === 'page') {
  57. if (keywordSets.atRulePagePseudoClasses.has(name)) {
  58. return;
  59. }
  60. index = atRuleParamIndex(node) + pseudoNode.sourceIndex;
  61. } else {
  62. if (
  63. vendor.prefix(name) ||
  64. keywordSets.pseudoClasses.has(name) ||
  65. keywordSets.pseudoElements.has(name)
  66. ) {
  67. return;
  68. }
  69. let prevPseudoElement = pseudoNode;
  70. do {
  71. prevPseudoElement = prevPseudoElement.prev();
  72. if (prevPseudoElement && prevPseudoElement.value.slice(0, 2) === '::') {
  73. break;
  74. }
  75. } while (prevPseudoElement);
  76. if (prevPseudoElement) {
  77. const prevPseudoElementValue = vendor.unprefixed(
  78. prevPseudoElement.value.toLowerCase().slice(2),
  79. );
  80. if (
  81. keywordSets.webkitProprietaryPseudoElements.has(prevPseudoElementValue) &&
  82. keywordSets.webkitProprietaryPseudoClasses.has(name)
  83. ) {
  84. return;
  85. }
  86. }
  87. index = pseudoNode.sourceIndex;
  88. }
  89. report({
  90. message: messages.rejected(value),
  91. node,
  92. index,
  93. ruleName,
  94. result,
  95. });
  96. });
  97. });
  98. }
  99. root.walk((node) => {
  100. let selector = null;
  101. if (node.type === 'rule') {
  102. if (!isStandardSyntaxRule(node)) {
  103. return;
  104. }
  105. selector = node.selector;
  106. } else if (node.type === 'atrule' && node.name === 'page' && node.params) {
  107. if (!isStandardSyntaxAtRule(node)) {
  108. return;
  109. }
  110. selector = node.params;
  111. }
  112. // Return if selector empty, it is meaning node type is not a rule or a at-rule
  113. if (!selector) {
  114. return;
  115. }
  116. // Return early before parse if no pseudos for performance
  117. if (!selector.includes(':')) {
  118. return;
  119. }
  120. check(selector, node);
  121. });
  122. };
  123. }
  124. rule.ruleName = ruleName;
  125. rule.messages = messages;
  126. module.exports = rule;