Проверьте CSS в Javascript

У меня есть приложение, которое принимает произвольную строку от пользователя. Я ищу, чтобы проверить, что эта строка является допустимой CSS3.

Я заинтересован в различных уровнях проверки. например, было бы неплохо указать, проверяю ли я входные данные, например:

  • background-color: #FFF
  • div { background-color: #FFF }

Как я могу написать такую ​​функцию:

isValidCss('background-color: red;') === true

или же

getCssErrors('background-color: foobar;') === { /* some error message */ }


  • Мне нужно выполнить эту операцию без сетевых зависимостей. Например, https://github.com/twolfson/css-validator неприемлемо, поскольку он отправляет сетевые запросы в службу проверки CSS W3C.

  • CSSLint кажется очевидным потенциальным кандидатом, чтобы помочь с этим, но он, похоже, предназначен для использования в качестве LINTer для IDE, поэтому я не уверен, как интегрировать его в приложение. Советы о том, как это сделать, могут быть правильным ответом на этот вопрос.

1 ответ

Я только что пришел с идеей, которая немного хитра, но должна выполнять свою работу в некоторых случаях. Все зависит от ваших предпочтений.

Теория для типов второй струны (background-color: #fff) назначить входную строку в element.style.cssText лайк lm.style.cssText = 'background-color: 12px' а затем получить значение с помощью lm.style.cssText, Это не возвращает никакого значения для cssText потому что он имеет проблемы с синтаксисом и не может ничего оценивать. но если вы укажете background-color: #fff это вернется background-color указано в cssText,

для типов третьей строки, вы можете использовать .matches метод тоже. .matches Метод генерирует синтаксическую ошибку, если у входной строки есть проблемы с валидностью.

Я не уверен, как проверить первое значение (#fff) потому что в CSS есть сотни вариантов значений, даже валидатор w3c не передает эти значения как отдельные элементы.

но для строк второго и третьего типов конечный код должен выглядеть примерно так:

;!( function( w, d ) {

  'use strict';
  
  var init = function( e ) {
  
        var input = prompt( 'put a string to validate' ),
            div = d.createElement( 'div' ),
            
            tmp,
            
            selectorError = false,
            body = false,
            selector = false;
        
        if ( !input )
          return false;
        
        console.log( "input is-> " + input );
        
        body = /([\s\S]+\{)?([^}]+)/gim.exec( input );
        body = ( body && body[ 2 ] ) || false;
        
        // selector specified
        if ( selector = /([\s\S]+)\{/gim.exec( input ) ) {
        
          selector = selector[ 1 ];
          console.log( 'selector-> ' + selector );
          
          try {
          
            div.matches( selector );
            
          } catch ( e ) {
          
            selectorError = true;
            
          } finally {
          
            console.log( 'selector is ' + ( selectorError ? 'not ' : '' ) + 'valid' );
          
          }
       
        }
        
        console.log( 'body-> ' + body );
        
        tmp = div.style.cssText;
        
        div.style.cssText = body;
        
        if ( tmp == div.style.cssText )
          console.log( 'body is not valid.' );
        else
          console.log( 'body is valid.' );
  
      },
      
      button = d.querySelector( 'button' );
      
  button.onclick = init;

})( this, document );
button {
  margin-bottom: 200px
}
<ul>

  <div>Some ready strings to copy/paste:</div>
  
  <li>div { background: #fff }</li>
  <li>div { background: 12px }</li>
  <li>div { background-color: 12px }</li>
  <li>background-size: #fff</li>
  <li>background-color: #fff</li>
  <li>background-color: 12px</li>


</ul>

<button>Ask me for input</button>

Приведенный выше пример демонстрирует творческую идею, с которой я столкнулся. не готовый к использованию код.

Я хотел бы обсудить и другие варианты.

Другие вопросы по тегам