djlint 1.28.0 → 1.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.coveragerc +9 -0
- package/.editorconfig +21 -0
- package/.flake8 +0 -0
- package/.github/FUNDING.yml +2 -0
- package/.github/ISSUE_TEMPLATE/config.yml +6 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
- package/.github/ISSUE_TEMPLATE/formatter_but_report.md +30 -0
- package/.github/ISSUE_TEMPLATE/linter_bug_report.md +34 -0
- package/.github/ISSUE_TEMPLATE/translation.md +14 -0
- package/.github/config.yml +4 -0
- package/.github/pull_request_template.md +10 -0
- package/.github/workflows/cancel.yml +17 -0
- package/.github/workflows/demo.yml +98 -0
- package/.github/workflows/issues.yml +23 -0
- package/.github/workflows/linkcheck.yaml +21 -0
- package/.github/workflows/lint.yml +25 -0
- package/.github/workflows/release.yml +57 -0
- package/.github/workflows/test.yml +85 -0
- package/.pre-commit-config.yaml +45 -0
- package/.pre-commit-hooks.yaml +71 -0
- package/.prettierignore +7 -0
- package/.prettierrc +11 -0
- package/.releaserc +16 -0
- package/CHANGELOG.md +13 -0
- package/MANIFEST.in +2 -0
- package/build_demo.sh +17 -0
- package/docs/.eleventy.js +425 -0
- package/docs/.eleventyignore +2 -0
- package/docs/.prettierignore +3 -0
- package/docs/.prettierrc +11 -0
- package/docs/package.json +73 -0
- package/docs/readme.md +17 -0
- package/docs/src/_data/configuration.json +646 -0
- package/docs/src/_data/eleventyComputed.js +22 -0
- package/docs/src/_data/i18n/index.js +159 -0
- package/docs/src/_data/js.js +7 -0
- package/docs/src/_data/locales.js +17 -0
- package/docs/src/_data/site.json +8 -0
- package/docs/src/_includes/demo.njk +157 -0
- package/docs/src/_includes/docs_layout.njk +34 -0
- package/docs/src/_includes/foot.njk +26 -0
- package/docs/src/_includes/index.njk +187 -0
- package/docs/src/_includes/languages_layout.njk +11 -0
- package/docs/src/_includes/layout.njk +111 -0
- package/docs/src/_includes/nav.njk +85 -0
- package/docs/src/_utils/minify-html.js +14 -0
- package/docs/src/_utils/rollupper.js +91 -0
- package/docs/src/_utils/scripts.11ty.js +27 -0
- package/docs/src/demo.njk +4 -0
- package/docs/src/docs/best-practices.md +78 -0
- package/docs/src/docs/changelog.md +452 -0
- package/docs/src/docs/configuration.md +145 -0
- package/docs/src/docs/docs.json +4 -0
- package/docs/src/docs/formatter.md +82 -0
- package/docs/src/docs/getting-started.md +126 -0
- package/docs/src/docs/ignoring-code.md +75 -0
- package/docs/src/docs/integrations.md +120 -0
- package/docs/src/docs/languages/angular.md +31 -0
- package/docs/src/docs/languages/django.md +40 -0
- package/docs/src/docs/languages/golang.md +31 -0
- package/docs/src/docs/languages/handlebars.md +31 -0
- package/docs/src/docs/languages/jinja.md +39 -0
- package/docs/src/docs/languages/languages.json +3 -0
- package/docs/src/docs/languages/mustache.md +31 -0
- package/docs/src/docs/languages/nunjucks.md +39 -0
- package/docs/src/docs/languages/twig.md +41 -0
- package/docs/src/docs/linter.md +199 -0
- package/docs/src/fr/demo.njk +4 -0
- package/docs/src/fr/docs/best-practices.md +78 -0
- package/docs/src/fr/docs/changelog.md +452 -0
- package/docs/src/fr/docs/configuration.md +144 -0
- package/docs/src/fr/docs/docs.json +3 -0
- package/docs/src/fr/docs/formatter.md +83 -0
- package/docs/src/fr/docs/getting-started.md +127 -0
- package/docs/src/fr/docs/ignoring-code.md +75 -0
- package/docs/src/fr/docs/integrations.md +100 -0
- package/docs/src/fr/docs/languages/angular.md +31 -0
- package/docs/src/fr/docs/languages/django.md +31 -0
- package/docs/src/fr/docs/languages/golang.md +31 -0
- package/docs/src/fr/docs/languages/handlebars.md +31 -0
- package/docs/src/fr/docs/languages/jinja.md +31 -0
- package/docs/src/fr/docs/languages/languages.json +3 -0
- package/docs/src/fr/docs/languages/mustache.md +31 -0
- package/docs/src/fr/docs/languages/nunjucks.md +31 -0
- package/docs/src/fr/docs/languages/twig.md +31 -0
- package/docs/src/fr/docs/linter.md +207 -0
- package/docs/src/fr/fr.json +4 -0
- package/docs/src/fr/index.njk +4 -0
- package/docs/src/index.njk +4 -0
- package/docs/src/lib/generate-content-hash.js +13 -0
- package/docs/src/robots.txt +4 -0
- package/docs/src/ru/demo.njk +4 -0
- package/docs/src/ru/docs/best-practices.md +78 -0
- package/docs/src/ru/docs/changelog.md +453 -0
- package/docs/src/ru/docs/configuration.md +142 -0
- package/docs/src/ru/docs/docs.json +3 -0
- package/docs/src/ru/docs/formatter.md +82 -0
- package/docs/src/ru/docs/getting-started.md +127 -0
- package/docs/src/ru/docs/ignoring-code.md +75 -0
- package/docs/src/ru/docs/integrations.md +100 -0
- package/docs/src/ru/docs/languages/angular.md +31 -0
- package/docs/src/ru/docs/languages/django.md +31 -0
- package/docs/src/ru/docs/languages/golang.md +31 -0
- package/docs/src/ru/docs/languages/handlebars.md +31 -0
- package/docs/src/ru/docs/languages/jinja.md +31 -0
- package/docs/src/ru/docs/languages/languages.json +3 -0
- package/docs/src/ru/docs/languages/mustache.md +31 -0
- package/docs/src/ru/docs/languages/nunjucks.md +31 -0
- package/docs/src/ru/docs/languages/twig.md +31 -0
- package/docs/src/ru/docs/linter.md +126 -0
- package/docs/src/ru/index.njk +4 -0
- package/docs/src/ru/ru.json +4 -0
- package/docs/src/sitemap.njk +16 -0
- package/docs/src/static/css/site.scss +467 -0
- package/docs/src/static/font/fontawesome/stylesheet.scss +78 -0
- package/docs/src/static/img/apple-touch-icon.png +0 -0
- package/docs/src/static/img/demo-min.gif +0 -0
- package/docs/src/static/img/demo.gif +0 -0
- package/docs/src/static/img/demo.webm +0 -0
- package/docs/src/static/img/favicon-16x16.png +0 -0
- package/docs/src/static/img/favicon-32x32.png +0 -0
- package/docs/src/static/img/favicon.ico +0 -0
- package/docs/src/static/img/icon-square.indd +0 -0
- package/docs/src/static/img/icon-square.png +0 -0
- package/docs/src/static/img/icon.png +0 -0
- package/docs/src/static/img/logo-192x192.png +0 -0
- package/docs/src/static/img/logo-512x512.png +0 -0
- package/docs/src/static/img/logos/angular.png +0 -0
- package/docs/src/static/img/logos/django.png +0 -0
- package/docs/src/static/img/logos/golang.png +0 -0
- package/docs/src/static/img/logos/handlebars.png +0 -0
- package/docs/src/static/img/logos/jinja.png +0 -0
- package/docs/src/static/img/logos/mustache.png +0 -0
- package/docs/src/static/img/logos/nunjucks.png +0 -0
- package/docs/src/static/img/logos/twig.png +0 -0
- package/docs/src/static/img/old_demo.gif +0 -0
- package/docs/src/static/img/style.css +122 -0
- package/docs/src/static/js/animate.js +69 -0
- package/docs/src/static/js/editor.js +171 -0
- package/docs/src/static/js/hamburger.js +19 -0
- package/docs/src/static/js/modal.js +47 -0
- package/docs/src/static/js/worker.js +142 -0
- package/docs/src/static/py/EditorConfig-99-py3-none-any.whl +0 -0
- package/docs/src/static/py/PyYAML-99-py3-none-any.whl +0 -0
- package/docs/src/static/py/click-99-py3-none-any.whl +0 -0
- package/docs/src/static/py/colorama-99-py3-none-any.whl +0 -0
- package/docs/src/static/py/cssbeautifier-99-py3-none-any.whl +0 -0
- package/docs/src/static/py/djlint-99-py3-none-any.whl +0 -0
- package/docs/src/static/py/html_tag_names-99-py3-none-any.whl +0 -0
- package/docs/src/static/py/html_void_elements-99-py3-none-any.whl +0 -0
- package/docs/src/static/py/jsbeautifier-99-py3-none-any.whl +0 -0
- package/docs/src/static/py/json5-99-py3-none-any.whl +0 -0
- package/docs/src/static/py/pathspec-99-py3-none-any.whl +0 -0
- package/docs/src/static/py/regex-2023.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +0 -0
- package/docs/src/static/py/six-1.16.0-py2.py3-none-any.whl +0 -0
- package/docs/src/static/py/tomli-2.0.1-py3-none-any.whl +0 -0
- package/docs/src/static/py/tqdm-4.65.0-py3-none-any.whl +0 -0
- package/icon.xcf +0 -0
- package/package.json +4 -33
- package/poetry.lock +835 -0
- package/pyproject.toml +100 -0
- package/renovate.json +44 -0
- package/scripts/updateVersion.js +16 -0
- package/src/djlint/__init__.py +451 -0
- package/src/djlint/__main__.py +4 -0
- package/src/djlint/formatter/__init__.py +1 -0
- package/src/djlint/formatter/attributes.py +212 -0
- package/src/djlint/formatter/compress.py +64 -0
- package/src/djlint/formatter/condense.py +221 -0
- package/src/djlint/formatter/css.py +60 -0
- package/src/djlint/formatter/expand.py +111 -0
- package/src/djlint/formatter/indent.py +418 -0
- package/src/djlint/formatter/js.py +58 -0
- package/src/djlint/helpers.py +321 -0
- package/src/djlint/lint.py +128 -0
- package/src/djlint/output.py +220 -0
- package/src/djlint/reformat.py +63 -0
- package/src/djlint/rules/H025.py +65 -0
- package/src/djlint/rules.yaml +279 -0
- package/src/djlint/settings.py +969 -0
- package/src/djlint/src.py +91 -0
- package/tests/__init__.py +0 -0
- package/tests/conftest.py +239 -0
- package/tests/test_cli.py +71 -0
- package/tests/test_config/__init__.py +0 -0
- package/tests/test_config/test_blank_line_after_tag.py +135 -0
- package/tests/test_config/test_blank_line_before_tag.py +141 -0
- package/tests/test_config/test_close_void_tags.py +31 -0
- package/tests/test_config/test_custom_blocks.py +56 -0
- package/tests/test_config/test_custom_html.py +45 -0
- package/tests/test_config/test_djlintrc/.djlintrc +38 -0
- package/tests/test_config/test_djlintrc/__init__.py +0 -0
- package/tests/test_config/test_djlintrc/test_config.py +44 -0
- package/tests/test_config/test_djlintrc_custom/.djlint-cust +38 -0
- package/tests/test_config/test_djlintrc_custom/.djlintrc +2 -0
- package/tests/test_config/test_djlintrc_custom/__init__.py +0 -0
- package/tests/test_config/test_djlintrc_custom/test_config.py +48 -0
- package/tests/test_config/test_excludes/__init__.py +0 -0
- package/tests/test_config/test_excludes/excluded.html +1 -0
- package/tests/test_config/test_excludes/foo/excluded.html +1 -0
- package/tests/test_config/test_excludes/html.html +1 -0
- package/tests/test_config/test_excludes/pyproject.toml +3 -0
- package/tests/test_config/test_excludes/test_config.py +30 -0
- package/tests/test_config/test_extension/__init__.py +0 -0
- package/tests/test_config/test_extension/html.test +1 -0
- package/tests/test_config/test_extension/pyproject.toml +3 -0
- package/tests/test_config/test_extension/test_config.py +27 -0
- package/tests/test_config/test_files/.djlintrc_global +9 -0
- package/tests/test_config/test_files/test.html +3 -0
- package/tests/test_config/test_files/test_config.py +123 -0
- package/tests/test_config/test_files/test_two.html +1 -0
- package/tests/test_config/test_format_attribute_template_tags.py +280 -0
- package/tests/test_config/test_format_css.py +197 -0
- package/tests/test_config/test_format_js.py +220 -0
- package/tests/test_config/test_gitignore/__init__.py +0 -0
- package/tests/test_config/test_gitignore/html_one.html +1 -0
- package/tests/test_config/test_gitignore/html_two.html +1 -0
- package/tests/test_config/test_gitignore/test_config.py +142 -0
- package/tests/test_config/test_ignore/__init__.py +0 -0
- package/tests/test_config/test_ignore/html.html +1 -0
- package/tests/test_config/test_ignore/html_two.html +12 -0
- package/tests/test_config/test_ignore/pyproject.toml +3 -0
- package/tests/test_config/test_ignore/test_config.py +32 -0
- package/tests/test_config/test_ignore_blocks.py +45 -0
- package/tests/test_config/test_ignore_case.py +39 -0
- package/tests/test_config/test_indent.py +63 -0
- package/tests/test_config/test_linter_output_format/__init__.py +0 -0
- package/tests/test_config/test_linter_output_format/html-one.html +1 -0
- package/tests/test_config/test_linter_output_format/html-two.html +1 -0
- package/tests/test_config/test_linter_output_format/pyproject.toml +3 -0
- package/tests/test_config/test_linter_output_format/test_config.py +34 -0
- package/tests/test_config/test_max_attribute_length.py +100 -0
- package/tests/test_config/test_max_line_length.py +94 -0
- package/tests/test_config/test_per_file_ignores/__init__.py +0 -0
- package/tests/test_config/test_per_file_ignores/html.html +2 -0
- package/tests/test_config/test_per_file_ignores/pyproject.toml +2 -0
- package/tests/test_config/test_per_file_ignores/test_config.py +25 -0
- package/tests/test_config/test_pragmas/__init__.py +0 -0
- package/tests/test_config/test_pragmas/html_five.html +2 -0
- package/tests/test_config/test_pragmas/html_four.html +5 -0
- package/tests/test_config/test_pragmas/html_one.html +1 -0
- package/tests/test_config/test_pragmas/html_six.html +2 -0
- package/tests/test_config/test_pragmas/html_three.html +4 -0
- package/tests/test_config/test_pragmas/html_two.html +2 -0
- package/tests/test_config/test_pragmas/pyproject.toml +3 -0
- package/tests/test_config/test_pragmas/test_config.py +142 -0
- package/tests/test_config/test_preserve_blank_lines.py +109 -0
- package/tests/test_config/test_preserve_leading_space.py +159 -0
- package/tests/test_config/test_profile/__init__.py +0 -0
- package/tests/test_config/test_profile/html.html +2 -0
- package/tests/test_config/test_profile/pyproject.toml +3 -0
- package/tests/test_config/test_profile/test_config.py +64 -0
- package/tests/test_config/test_pyproject/__init__.py +0 -0
- package/tests/test_config/test_pyproject/blank.html +0 -0
- package/tests/test_config/test_pyproject/pyproject.toml +36 -0
- package/tests/test_config/test_pyproject/test_config.py +44 -0
- package/tests/test_django/__init__.py +0 -0
- package/tests/test_django/test_asset.py +32 -0
- package/tests/test_django/test_autoescape.py +25 -0
- package/tests/test_django/test_block.py +29 -0
- package/tests/test_django/test_blocktrans.py +236 -0
- package/tests/test_django/test_blocktrans_trimmed.py +283 -0
- package/tests/test_django/test_comments.py +164 -0
- package/tests/test_django/test_filter.py +30 -0
- package/tests/test_django/test_for.py +34 -0
- package/tests/test_django/test_if.py +34 -0
- package/tests/test_django/test_ifchanged.py +37 -0
- package/tests/test_django/test_include.py +24 -0
- package/tests/test_django/test_load.py +24 -0
- package/tests/test_django/test_quoted.py +34 -0
- package/tests/test_django/test_spaceless.py +30 -0
- package/tests/test_django/test_tag_spaces.py +35 -0
- package/tests/test_django/test_templatetag.py +40 -0
- package/tests/test_django/test_verbatim.py +24 -0
- package/tests/test_django/test_with.py +32 -0
- package/tests/test_djlint/-.html +1 -0
- package/tests/test_djlint/__init__.py +0 -0
- package/tests/test_djlint/bad.html +6 -0
- package/tests/test_djlint/bad.html.dj +23 -0
- package/tests/test_djlint/bad.html.dj2 +2 -0
- package/tests/test_djlint/multiple_files/a/a.html +1 -0
- package/tests/test_djlint/multiple_files/b/b1.html +1 -0
- package/tests/test_djlint/multiple_files/b/b2.html +1 -0
- package/tests/test_djlint/test_djlint.py +242 -0
- package/tests/test_golang/__init__.py +0 -0
- package/tests/test_golang/test_if.py +24 -0
- package/tests/test_golang/test_range.py +24 -0
- package/tests/test_handlebars/__init__.py +0 -0
- package/tests/test_handlebars/test_each.py +34 -0
- package/tests/test_handlebars/test_else.py +24 -0
- package/tests/test_handlebars/test_with.py +24 -0
- package/tests/test_html/__init__.py +0 -0
- package/tests/test_html/test_alpinejs.py +65 -0
- package/tests/test_html/test_attributes.py +935 -0
- package/tests/test_html/test_aurelia.py +24 -0
- package/tests/test_html/test_basics.py +905 -0
- package/tests/test_html/test_bracket_same_line.py +177 -0
- package/tests/test_html/test_case.py +81 -0
- package/tests/test_html/test_cdata.py +34 -0
- package/tests/test_html/test_comments.py +333 -0
- package/tests/test_html/test_css.py +193 -0
- package/tests/test_html/test_doctype_declarations.py +202 -0
- package/tests/test_html/test_ignored.py +193 -0
- package/tests/test_html/test_interpolation.py +56 -0
- package/tests/test_html/test_line_break_after_multiline_tag.py +95 -0
- package/tests/test_html/test_next_line_empty.py +53 -0
- package/tests/test_html/test_selfclosing.py +55 -0
- package/tests/test_html/test_single_attribute_per_line.py +87 -0
- package/tests/test_html/test_srcset.py +43 -0
- package/tests/test_html/test_svg.py +104 -0
- package/tests/test_html/test_symbol_entities.py +34 -0
- package/tests/test_html/test_tag_code.py +24 -0
- package/tests/test_html/test_tag_dd.py +24 -0
- package/tests/test_html/test_tag_details_summary.py +24 -0
- package/tests/test_html/test_tag_dt.py +24 -0
- package/tests/test_html/test_tag_fig_caption.py +29 -0
- package/tests/test_html/test_tag_hr.py +29 -0
- package/tests/test_html/test_tag_picture.py +32 -0
- package/tests/test_html/test_tag_pre.py +45 -0
- package/tests/test_html/test_tag_script.py +516 -0
- package/tests/test_html/test_tag_small.py +24 -0
- package/tests/test_html/test_tag_span.py +119 -0
- package/tests/test_html/test_tag_textarea.py +82 -0
- package/tests/test_html/test_tags.py +842 -0
- package/tests/test_html/test_text.py +34 -0
- package/tests/test_html/test_whitespace.py +477 -0
- package/tests/test_html/test_yaml.py +156 -0
- package/tests/test_jinja/__init__.py +0 -0
- package/tests/test_jinja/test_call.py +34 -0
- package/tests/test_jinja/test_parenthesis.py +24 -0
- package/tests/test_linter/__init__.py +0 -0
- package/tests/test_linter/test_custom_rules/.djlint_rules.yaml +6 -0
- package/tests/test_linter/test_custom_rules/__init__.py +0 -0
- package/tests/test_linter/test_custom_rules/html.html +1 -0
- package/tests/test_linter/test_custom_rules/pyproject.toml +1 -0
- package/tests/test_linter/test_custom_rules/test_linter.py +29 -0
- package/tests/test_linter/test_custom_rules_bad/.djlint_rules.yaml +24 -0
- package/tests/test_linter/test_custom_rules_bad/__init__.py +0 -0
- package/tests/test_linter/test_custom_rules_bad/html.html +1 -0
- package/tests/test_linter/test_custom_rules_bad/pyproject.toml +1 -0
- package/tests/test_linter/test_custom_rules_bad/test_linter.py +29 -0
- package/tests/test_linter/test_django_linter.py +476 -0
- package/tests/test_linter/test_h005.py +45 -0
- package/tests/test_linter/test_h006.py +81 -0
- package/tests/test_linter/test_h007.py +45 -0
- package/tests/test_linter/test_h008.py +60 -0
- package/tests/test_linter/test_h009.py +45 -0
- package/tests/test_linter/test_h010.py +44 -0
- package/tests/test_linter/test_h037.py +150 -0
- package/tests/test_linter/test_ignore_rules.py +45 -0
- package/tests/test_linter/test_jinja_linter.py +227 -0
- package/tests/test_linter/test_linter.py +691 -0
- package/tests/test_linter/test_nunjucks_linter.py +59 -0
- package/tests/test_linter/test_python_module_rules/.djlint_rules.yaml +4 -0
- package/tests/test_linter/test_python_module_rules/__init__.py +0 -0
- package/tests/test_linter/test_python_module_rules/html_bad.html +3 -0
- package/tests/test_linter/test_python_module_rules/html_ok.html +3 -0
- package/tests/test_linter/test_python_module_rules/my_module.py +32 -0
- package/tests/test_linter/test_python_module_rules/pyproject.toml +1 -0
- package/tests/test_linter/test_python_module_rules/test_linter.py +26 -0
- package/tests/test_nunjucks/__init__.py +0 -0
- package/tests/test_nunjucks/test_functions.py +94 -0
- package/tests/test_nunjucks/test_macros.py +41 -0
- package/tests/test_nunjucks/test_set.py +206 -0
- package/tests/test_nunjucks/test_spaceless.py +24 -0
- package/tests/test_twig/__init__.py +0 -0
- package/tests/test_twig/test_comments.py +51 -0
- package/tox.ini +48 -0
|
@@ -0,0 +1,935 @@
|
|
|
1
|
+
"""Tests for attributes.
|
|
2
|
+
|
|
3
|
+
poetry run pytest tests/test_html/test_attributes.py
|
|
4
|
+
"""
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from src.djlint.reformat import formatter
|
|
8
|
+
from tests.conftest import printer
|
|
9
|
+
|
|
10
|
+
test_data = [
|
|
11
|
+
pytest.param(
|
|
12
|
+
(
|
|
13
|
+
"<img\n"
|
|
14
|
+
" {% image value.image fill-640x360 as block_image_640 %}\n"
|
|
15
|
+
" {% image value.image fill-768x432 as block_image_768 %}\n"
|
|
16
|
+
" {% image value.image fill-1024x576 as block_image_1024 %}\n"
|
|
17
|
+
" {% image value.image fill-1600x900 as block_image_1600 %}\n"
|
|
18
|
+
' data-src="{{ block_image_640.url }}"\n'
|
|
19
|
+
' data-srcset="{{ block_image_640.url }} 640w,\n'
|
|
20
|
+
" {{ block_image_768.url }} 768w,\n"
|
|
21
|
+
" {{ block_image_1024.url }} 1024w,\n"
|
|
22
|
+
' {{ block_image_1600.url }} 1600w"\n'
|
|
23
|
+
' sizes="(min-width: 1200px) 458px,\n'
|
|
24
|
+
" (min-width: 992px) 374px,\n"
|
|
25
|
+
" (min-width: 768px) 720px,\n"
|
|
26
|
+
' calc(100vw - 30px)"\n'
|
|
27
|
+
' class="richtext-image imageblock overflow {{ value.image_position }} lazy"\n'
|
|
28
|
+
' title="{{ value.image.title }}"\n'
|
|
29
|
+
' alt="Block image"/>\n'
|
|
30
|
+
),
|
|
31
|
+
(
|
|
32
|
+
"<img {% image value.image fill-640x360 as block_image_640 %}\n"
|
|
33
|
+
" {% image value.image fill-768x432 as block_image_768 %}\n"
|
|
34
|
+
" {% image value.image fill-1024x576 as block_image_1024 %}\n"
|
|
35
|
+
" {% image value.image fill-1600x900 as block_image_1600 %}\n"
|
|
36
|
+
' data-src="{{ block_image_640.url }}"\n'
|
|
37
|
+
' data-srcset="{{ block_image_640.url }} 640w,\n'
|
|
38
|
+
" {{ block_image_768.url }} 768w,\n"
|
|
39
|
+
" {{ block_image_1024.url }} 1024w,\n"
|
|
40
|
+
' {{ block_image_1600.url }} 1600w"\n'
|
|
41
|
+
' sizes="(min-width: 1200px) 458px,\n'
|
|
42
|
+
" (min-width: 992px) 374px,\n"
|
|
43
|
+
" (min-width: 768px) 720px,\n"
|
|
44
|
+
' calc(100vw - 30px)"\n'
|
|
45
|
+
' class="richtext-image imageblock overflow {{ value.image_position }} lazy"\n'
|
|
46
|
+
' title="{{ value.image.title }}"\n'
|
|
47
|
+
' alt="Block image" />\n'
|
|
48
|
+
),
|
|
49
|
+
id="srcset",
|
|
50
|
+
),
|
|
51
|
+
pytest.param(
|
|
52
|
+
(
|
|
53
|
+
'<input type="text" class="class one class two" disabled="true" value="something pretty long goes here"\n'
|
|
54
|
+
' style="width:100px;cursor: text;border:1px solid pink"\n'
|
|
55
|
+
' required="true" />\n'
|
|
56
|
+
),
|
|
57
|
+
(
|
|
58
|
+
'<input type="text"\n'
|
|
59
|
+
' class="class one class two"\n'
|
|
60
|
+
' disabled="true"\n'
|
|
61
|
+
' value="something pretty long goes here"\n'
|
|
62
|
+
' style="width:100px;\n'
|
|
63
|
+
" cursor: text;\n"
|
|
64
|
+
' border:1px solid pink"\n'
|
|
65
|
+
' required="true" />\n'
|
|
66
|
+
),
|
|
67
|
+
id="long_attributes",
|
|
68
|
+
),
|
|
69
|
+
pytest.param(
|
|
70
|
+
(
|
|
71
|
+
"<div\n"
|
|
72
|
+
' class="my long classes"\n'
|
|
73
|
+
' required="true"\n'
|
|
74
|
+
' checked="checked"\n'
|
|
75
|
+
' data-attr="some long junk"\n'
|
|
76
|
+
' style="margin-left: 90px;\n'
|
|
77
|
+
" display: contents;\n"
|
|
78
|
+
" font-weight: bold;\n"
|
|
79
|
+
' font-size: 1.5rem">\n'
|
|
80
|
+
),
|
|
81
|
+
(
|
|
82
|
+
'<div class="my long classes"\n'
|
|
83
|
+
' required="true"\n'
|
|
84
|
+
' checked="checked"\n'
|
|
85
|
+
' data-attr="some long junk"\n'
|
|
86
|
+
' style="margin-left: 90px;\n'
|
|
87
|
+
" display: contents;\n"
|
|
88
|
+
" font-weight: bold;\n"
|
|
89
|
+
' font-size: 1.5rem">\n'
|
|
90
|
+
),
|
|
91
|
+
id="style_attributes",
|
|
92
|
+
),
|
|
93
|
+
pytest.param(
|
|
94
|
+
(
|
|
95
|
+
"<div>\n"
|
|
96
|
+
' <div style="margin-left: 90px;\n'
|
|
97
|
+
" display: contents;\n"
|
|
98
|
+
" font-weight: bold;\n"
|
|
99
|
+
' font-size: 1.5rem"\n'
|
|
100
|
+
' data-attr="stuff"\n'
|
|
101
|
+
' class="my long class goes here">\n'
|
|
102
|
+
" </div>\n"
|
|
103
|
+
"</div>\n"
|
|
104
|
+
),
|
|
105
|
+
(
|
|
106
|
+
"<div>\n"
|
|
107
|
+
' <div style="margin-left: 90px;\n'
|
|
108
|
+
" display: contents;\n"
|
|
109
|
+
" font-weight: bold;\n"
|
|
110
|
+
' font-size: 1.5rem"\n'
|
|
111
|
+
' data-attr="stuff"\n'
|
|
112
|
+
' class="my long class goes here"></div>\n'
|
|
113
|
+
"</div>\n"
|
|
114
|
+
),
|
|
115
|
+
id="style_before_others",
|
|
116
|
+
),
|
|
117
|
+
# attributes with space around = are not broken
|
|
118
|
+
# https://github.com/Riverside-Healthcare/djLint/issues/317
|
|
119
|
+
# https://github.com/Riverside-Healthcare/djLint/issues/330
|
|
120
|
+
pytest.param(
|
|
121
|
+
(
|
|
122
|
+
'<a href = "http://test.test:3000/testtesttesttesttesttesttesttesttesttest">Test</a>\n'
|
|
123
|
+
),
|
|
124
|
+
(
|
|
125
|
+
'<a href="http://test.test:3000/testtesttesttesttesttesttesttesttesttest">Test</a>\n'
|
|
126
|
+
),
|
|
127
|
+
id="space_around_equals",
|
|
128
|
+
),
|
|
129
|
+
pytest.param(
|
|
130
|
+
(
|
|
131
|
+
"<div\n"
|
|
132
|
+
' class="a long list of meaningless classes"\n'
|
|
133
|
+
' id="something_meaning_less_is_here"\n'
|
|
134
|
+
" required\n"
|
|
135
|
+
' checked="checked"\n'
|
|
136
|
+
' json-data=\'{"menu":{"header":"SVG Viewer","items":[{"id":"Open"}]}}\'>\n'
|
|
137
|
+
"</div>\n"
|
|
138
|
+
),
|
|
139
|
+
(
|
|
140
|
+
'<div class="a long list of meaningless classes"\n'
|
|
141
|
+
' id="something_meaning_less_is_here"\n'
|
|
142
|
+
" required\n"
|
|
143
|
+
' checked="checked"\n'
|
|
144
|
+
' json-data=\'{"menu":{"header":"SVG Viewer","items":[{"id":"Open"}]}}\'></div>\n'
|
|
145
|
+
),
|
|
146
|
+
id="ignored_attributes",
|
|
147
|
+
),
|
|
148
|
+
pytest.param(
|
|
149
|
+
(
|
|
150
|
+
"<select\n"
|
|
151
|
+
" multiple\n"
|
|
152
|
+
' class="selectpicker show-tick"\n'
|
|
153
|
+
' id="device-select"\n'
|
|
154
|
+
' title="">\n'
|
|
155
|
+
"</select>\n"
|
|
156
|
+
),
|
|
157
|
+
(
|
|
158
|
+
'<select multiple class="selectpicker show-tick" id="device-select" title=""></select>\n'
|
|
159
|
+
),
|
|
160
|
+
id="boolean_attribute",
|
|
161
|
+
),
|
|
162
|
+
pytest.param(
|
|
163
|
+
(
|
|
164
|
+
"<select\n"
|
|
165
|
+
" multiple\n"
|
|
166
|
+
' class="selectpicker show-tick"\n'
|
|
167
|
+
' id="device-select"\n'
|
|
168
|
+
' title=""\n'
|
|
169
|
+
' value="something pretty long goes here"\n'
|
|
170
|
+
' style="width:100px;cursor: text;border:1px solid pink">\n'
|
|
171
|
+
" </select>\n"
|
|
172
|
+
),
|
|
173
|
+
(
|
|
174
|
+
"<select multiple\n"
|
|
175
|
+
' class="selectpicker show-tick"\n'
|
|
176
|
+
' id="device-select"\n'
|
|
177
|
+
' title=""\n'
|
|
178
|
+
' value="something pretty long goes here"\n'
|
|
179
|
+
' style="width:100px;\n'
|
|
180
|
+
" cursor: text;\n"
|
|
181
|
+
' border:1px solid pink"></select>\n'
|
|
182
|
+
),
|
|
183
|
+
id="boolean_after_tag",
|
|
184
|
+
),
|
|
185
|
+
pytest.param(
|
|
186
|
+
(
|
|
187
|
+
"<input readonly\n"
|
|
188
|
+
' class="form-control"\n'
|
|
189
|
+
' type="text"\n'
|
|
190
|
+
' name="driver_id"\n'
|
|
191
|
+
" value=\"{{ id|default(' sample_text ') }}\"/>\n"
|
|
192
|
+
),
|
|
193
|
+
(
|
|
194
|
+
"<input readonly\n"
|
|
195
|
+
' class="form-control"\n'
|
|
196
|
+
' type="text"\n'
|
|
197
|
+
' name="driver_id"\n'
|
|
198
|
+
' value="{{ id|default(" sample_text ") }}" />\n'
|
|
199
|
+
),
|
|
200
|
+
id="another_boolean_after_tag",
|
|
201
|
+
),
|
|
202
|
+
pytest.param(
|
|
203
|
+
(
|
|
204
|
+
'<button id="test"\n'
|
|
205
|
+
' name="test"\n'
|
|
206
|
+
' type="submit"\n'
|
|
207
|
+
" one=\"isTrue ? 'True' : 'False'\"\n"
|
|
208
|
+
" two=\"'Test' .\"\n"
|
|
209
|
+
" three=\"'Test'\"></button>\n"
|
|
210
|
+
),
|
|
211
|
+
(
|
|
212
|
+
'<button id="test"\n'
|
|
213
|
+
' name="test"\n'
|
|
214
|
+
' type="submit"\n'
|
|
215
|
+
" one=\"isTrue ? 'True' : 'False'\"\n"
|
|
216
|
+
" two=\"'Test' .\"\n"
|
|
217
|
+
" three=\"'Test'\"></button>\n"
|
|
218
|
+
),
|
|
219
|
+
id="attributes_with_quoted_values",
|
|
220
|
+
),
|
|
221
|
+
pytest.param(
|
|
222
|
+
(
|
|
223
|
+
"<input name=address maxlength=200>\n"
|
|
224
|
+
"<input name='address' maxlength='200'>\n"
|
|
225
|
+
'<input name="address" maxlength="200">\n'
|
|
226
|
+
'<div class="foo"></div>\n'
|
|
227
|
+
'<div class="foo" ></div>\n'
|
|
228
|
+
'<div class="foo bar"></div>\n'
|
|
229
|
+
'<div class="foo bar" id="header"></div>\n'
|
|
230
|
+
'<div class="foo bar" id="header" ></div>\n'
|
|
231
|
+
"<div data-prettier></div>\n"
|
|
232
|
+
'<div data-prettier="true"></div>\n'
|
|
233
|
+
'<meta property="og:description" content="The Mozilla Developer Network (MDN) provides\n'
|
|
234
|
+
"information about Open Web technologies including HTML, CSS, and APIs for both Web sites\n"
|
|
235
|
+
'and HTML5 Apps. It also documents Mozilla products, like Firefox OS.">\n'
|
|
236
|
+
"<div attribute>String</div>\n"
|
|
237
|
+
'<div attribute="">String</div>\n'
|
|
238
|
+
"<div attribute=''>String</div>\n"
|
|
239
|
+
"<div attribute >String</div>\n"
|
|
240
|
+
'<div attribute = "" >String</div>\n'
|
|
241
|
+
"<div attribute = '' >String</div>\n"
|
|
242
|
+
"<div attribute >String</div>\n"
|
|
243
|
+
'<div attribute = "" >String</div>\n'
|
|
244
|
+
"<div attribute = '' >String</div>\n"
|
|
245
|
+
'<div attribute="attribute = attribute"></div>\n'
|
|
246
|
+
"<div ATTRIBUTE>String</div>\n"
|
|
247
|
+
'<div ATTRIBUTE="">String</div>\n'
|
|
248
|
+
"<div ATTRIBUTE=''>String</div>\n"
|
|
249
|
+
"<article\n"
|
|
250
|
+
' id="electriccars"\n'
|
|
251
|
+
' data-columns="3"\n'
|
|
252
|
+
' data-index-number="12314"\n'
|
|
253
|
+
' data-parent="cars">\n'
|
|
254
|
+
"</article>\n"
|
|
255
|
+
"<article\n"
|
|
256
|
+
' id="electriccars"\n'
|
|
257
|
+
' data-columns="3"\n'
|
|
258
|
+
' data-index-number="12314"\n'
|
|
259
|
+
' data-parent="cars">...</article>\n'
|
|
260
|
+
"<article\n"
|
|
261
|
+
' id="electriccars"\n'
|
|
262
|
+
' data-columns="3"\n'
|
|
263
|
+
' data-index-number="12314"\n'
|
|
264
|
+
' data-parent="cars">\n'
|
|
265
|
+
" ...\n"
|
|
266
|
+
"</article>\n"
|
|
267
|
+
"<article\n"
|
|
268
|
+
' id="electriccars"\n'
|
|
269
|
+
' data-columns="3"\n'
|
|
270
|
+
' data-index-number="12314"\n'
|
|
271
|
+
' data-parent="cars">\n'
|
|
272
|
+
"</article>\n"
|
|
273
|
+
"<article\n"
|
|
274
|
+
' id="electriccars"\n'
|
|
275
|
+
' data-columns="3"\n'
|
|
276
|
+
' data-index-number="12314"\n'
|
|
277
|
+
' data-parent="cars">\n'
|
|
278
|
+
"</article>\n"
|
|
279
|
+
"<X>\n"
|
|
280
|
+
"</X>\n"
|
|
281
|
+
'<X a="1">\n'
|
|
282
|
+
"</X>\n"
|
|
283
|
+
'<X a="1" b="2">\n'
|
|
284
|
+
"</X>\n"
|
|
285
|
+
'<X a="1" b="2" c="3">\n'
|
|
286
|
+
"</X>\n"
|
|
287
|
+
"<p\n"
|
|
288
|
+
' class="\n'
|
|
289
|
+
" foo\n"
|
|
290
|
+
" bar\n"
|
|
291
|
+
" baz\n"
|
|
292
|
+
' "\n'
|
|
293
|
+
">\n"
|
|
294
|
+
"</p>\n"
|
|
295
|
+
),
|
|
296
|
+
(
|
|
297
|
+
"<input name=address maxlength=200>\n"
|
|
298
|
+
"<input name='address' maxlength='200'>\n"
|
|
299
|
+
'<input name="address" maxlength="200">\n'
|
|
300
|
+
'<div class="foo"></div>\n'
|
|
301
|
+
'<div class="foo"></div>\n'
|
|
302
|
+
'<div class="foo bar"></div>\n'
|
|
303
|
+
'<div class="foo bar" id="header"></div>\n'
|
|
304
|
+
'<div class="foo bar" id="header"></div>\n'
|
|
305
|
+
"<div data-prettier></div>\n"
|
|
306
|
+
'<div data-prettier="true"></div>\n'
|
|
307
|
+
'<meta property="og:description"\n'
|
|
308
|
+
' content="The Mozilla Developer Network (MDN) provides information about Open Web technologies including HTML, CSS, and APIs for both Web sites and HTML5 Apps. It also documents Mozilla products, like Firefox OS.">\n'
|
|
309
|
+
"<div attribute>String</div>\n"
|
|
310
|
+
'<div attribute="">String</div>\n'
|
|
311
|
+
"<div attribute=''>String</div>\n"
|
|
312
|
+
"<div attribute>String</div>\n"
|
|
313
|
+
'<div attribute = "">String</div>\n'
|
|
314
|
+
"<div attribute = ''>String</div>\n"
|
|
315
|
+
"<div attribute>String</div>\n"
|
|
316
|
+
'<div attribute = "">String</div>\n'
|
|
317
|
+
"<div attribute = ''>String</div>\n"
|
|
318
|
+
'<div attribute="attribute = attribute"></div>\n'
|
|
319
|
+
"<div ATTRIBUTE>String</div>\n"
|
|
320
|
+
'<div ATTRIBUTE="">String</div>\n'
|
|
321
|
+
"<div ATTRIBUTE=''>String</div>\n"
|
|
322
|
+
'<article id="electriccars"\n'
|
|
323
|
+
' data-columns="3"\n'
|
|
324
|
+
' data-index-number="12314"\n'
|
|
325
|
+
' data-parent="cars"></article>\n'
|
|
326
|
+
'<article id="electriccars"\n'
|
|
327
|
+
' data-columns="3"\n'
|
|
328
|
+
' data-index-number="12314"\n'
|
|
329
|
+
' data-parent="cars">...</article>\n'
|
|
330
|
+
'<article id="electriccars"\n'
|
|
331
|
+
' data-columns="3"\n'
|
|
332
|
+
' data-index-number="12314"\n'
|
|
333
|
+
' data-parent="cars">...</article>\n'
|
|
334
|
+
'<article id="electriccars"\n'
|
|
335
|
+
' data-columns="3"\n'
|
|
336
|
+
' data-index-number="12314"\n'
|
|
337
|
+
' data-parent="cars"></article>\n'
|
|
338
|
+
'<article id="electriccars"\n'
|
|
339
|
+
' data-columns="3"\n'
|
|
340
|
+
' data-index-number="12314"\n'
|
|
341
|
+
' data-parent="cars"></article>\n'
|
|
342
|
+
"<X>\n"
|
|
343
|
+
"</X>\n"
|
|
344
|
+
'<X a="1">\n'
|
|
345
|
+
"</X>\n"
|
|
346
|
+
'<X a="1" b="2">\n'
|
|
347
|
+
"</X>\n"
|
|
348
|
+
'<X a="1" b="2" c="3">\n'
|
|
349
|
+
"</X>\n"
|
|
350
|
+
'<p class=" foo bar baz "></p>\n'
|
|
351
|
+
),
|
|
352
|
+
id="long_attributes",
|
|
353
|
+
),
|
|
354
|
+
pytest.param(
|
|
355
|
+
(
|
|
356
|
+
'<button type="submit">This is valid.</button>\n'
|
|
357
|
+
'<button type="submit" disabled>This is valid.</button>\n'
|
|
358
|
+
'<button type="submit" disabled="">This is valid.</button>\n'
|
|
359
|
+
'<button type="submit" disabled="disabled">This is valid.</button>\n'
|
|
360
|
+
'<button type="submit" disabled=true>This is valid. This will be disabled.</button>\n'
|
|
361
|
+
"<button type=\"submit\" disabled='true'>This is valid. This will be disabled.</button>\n"
|
|
362
|
+
'<button type="submit" disabled="true">This is valid. This will be disabled.</button>\n'
|
|
363
|
+
'<button type="submit" disabled=false>This is valid. This will be disabled.</button>\n'
|
|
364
|
+
'<button type="submit" disabled="false">This is valid. This will be disabled.</button>\n'
|
|
365
|
+
"<button type=\"submit\" disabled='false'>This is valid. This will be disabled.</button>\n"
|
|
366
|
+
'<button type="submit" disabled=hahah>This is valid. This will be disabled.</button>\n'
|
|
367
|
+
"<button type=\"submit\" disabled='hahah'>This is valid. This will be disabled.</button>\n"
|
|
368
|
+
'<button type="submit" disabled="hahah">This is valid. This will be disabled.</button>\n'
|
|
369
|
+
'<input type="checkbox" checked disabled name="cheese">\n'
|
|
370
|
+
'<input type="checkbox" checked="checked" disabled="disabled" name="cheese">\n'
|
|
371
|
+
'<input type=\'checkbox\' checked="" disabled="" name=cheese >\n'
|
|
372
|
+
'<div lang=""></div>\n'
|
|
373
|
+
),
|
|
374
|
+
(
|
|
375
|
+
'<button type="submit">This is valid.</button>\n'
|
|
376
|
+
'<button type="submit" disabled>This is valid.</button>\n'
|
|
377
|
+
'<button type="submit" disabled="">This is valid.</button>\n'
|
|
378
|
+
'<button type="submit" disabled="disabled">This is valid.</button>\n'
|
|
379
|
+
'<button type="submit" disabled=true>This is valid. This will be disabled.</button>\n'
|
|
380
|
+
"<button type=\"submit\" disabled='true'>This is valid. This will be disabled.</button>\n"
|
|
381
|
+
'<button type="submit" disabled="true">This is valid. This will be disabled.</button>\n'
|
|
382
|
+
'<button type="submit" disabled=false>This is valid. This will be disabled.</button>\n'
|
|
383
|
+
'<button type="submit" disabled="false">This is valid. This will be disabled.</button>\n'
|
|
384
|
+
"<button type=\"submit\" disabled='false'>This is valid. This will be disabled.</button>\n"
|
|
385
|
+
'<button type="submit" disabled=hahah>This is valid. This will be disabled.</button>\n'
|
|
386
|
+
"<button type=\"submit\" disabled='hahah'>This is valid. This will be disabled.</button>\n"
|
|
387
|
+
'<button type="submit" disabled="hahah">This is valid. This will be disabled.</button>\n'
|
|
388
|
+
'<input type="checkbox" checked disabled name="cheese">\n'
|
|
389
|
+
'<input type="checkbox" checked="checked" disabled="disabled" name="cheese">\n'
|
|
390
|
+
'<input type=\'checkbox\' checked="" disabled="" name=cheese>\n'
|
|
391
|
+
'<div lang=""></div>\n'
|
|
392
|
+
),
|
|
393
|
+
id="boolean",
|
|
394
|
+
),
|
|
395
|
+
pytest.param(
|
|
396
|
+
(
|
|
397
|
+
"<div CaseSensitive></div>\n"
|
|
398
|
+
' """\n'
|
|
399
|
+
" )\n"
|
|
400
|
+
"\n"
|
|
401
|
+
" html_out = (\n"
|
|
402
|
+
' """\n'
|
|
403
|
+
"<div CaseSensitive></div>\n"
|
|
404
|
+
' """\n'
|
|
405
|
+
),
|
|
406
|
+
(
|
|
407
|
+
"<div CaseSensitive></div>\n"
|
|
408
|
+
'"""\n'
|
|
409
|
+
")\n"
|
|
410
|
+
"html_out = (\n"
|
|
411
|
+
'"""\n'
|
|
412
|
+
"<div CaseSensitive></div>\n"
|
|
413
|
+
'"""\n'
|
|
414
|
+
),
|
|
415
|
+
id="CaseSensitive",
|
|
416
|
+
),
|
|
417
|
+
pytest.param(
|
|
418
|
+
(
|
|
419
|
+
'<div class="ProviderMeasuresContainer__heading-row\n'
|
|
420
|
+
" d-flex\n"
|
|
421
|
+
" flex-column flex-lg-row\n"
|
|
422
|
+
" justify-content-start justify-content-lg-between\n"
|
|
423
|
+
' align-items-start align-items-lg-center">Foo</div>\n'
|
|
424
|
+
'<div class="a-bem-block a-bem-block--with-modifer ">\n'
|
|
425
|
+
'<div class="a-bem-block__element a-bem-block__element--with-modifer also-another-block" >\n'
|
|
426
|
+
'<div class="a-bem-block__element a-bem-block__element--with-modifer also-another-block__element">\n'
|
|
427
|
+
"</div></div> </div>\n"
|
|
428
|
+
),
|
|
429
|
+
(
|
|
430
|
+
'<div class="ProviderMeasuresContainer__heading-row d-flex flex-column flex-lg-row justify-content-start justify-content-lg-between align-items-start align-items-lg-center">\n'
|
|
431
|
+
" Foo\n"
|
|
432
|
+
"</div>\n"
|
|
433
|
+
'<div class="a-bem-block a-bem-block--with-modifer ">\n'
|
|
434
|
+
' <div class="a-bem-block__element a-bem-block__element--with-modifer also-another-block">\n'
|
|
435
|
+
' <div class="a-bem-block__element a-bem-block__element--with-modifer also-another-block__element"></div>\n'
|
|
436
|
+
" </div>\n"
|
|
437
|
+
"</div>\n"
|
|
438
|
+
),
|
|
439
|
+
id="class_bem1",
|
|
440
|
+
),
|
|
441
|
+
pytest.param(
|
|
442
|
+
(
|
|
443
|
+
'<div class="news__header widget__content">\n'
|
|
444
|
+
' <div class="news__tabs">\n'
|
|
445
|
+
' <h1 class="news__tab-wrapper news__head-item">\n'
|
|
446
|
+
" <a\n"
|
|
447
|
+
' class="home-link home-link_blue_yes news__tab news__tab_selected_yes mix-tabber__tab mix-tabber__tab_selected_yes"\n'
|
|
448
|
+
' tabindex="0"\n'
|
|
449
|
+
' aria-selected="true"\n'
|
|
450
|
+
' aria-controls="news_panel_news"\n'
|
|
451
|
+
' data-key="news"\n'
|
|
452
|
+
' id="news_tab_news"\n'
|
|
453
|
+
' data-stat-link="news.tab.link.news"\n'
|
|
454
|
+
' data-stat-select="news.tab.select.news"\n'
|
|
455
|
+
' target="_blank"\n'
|
|
456
|
+
' role="tab"\n'
|
|
457
|
+
' href="https://yandex.ru/news?msid=1581089780.29024.161826.172442&mlid=1581088893.glob_225"\n'
|
|
458
|
+
' rel="noopener"\n'
|
|
459
|
+
" >...</a\n"
|
|
460
|
+
" >\n"
|
|
461
|
+
" </h1>\n"
|
|
462
|
+
" </div>\n"
|
|
463
|
+
"</div>\n"
|
|
464
|
+
),
|
|
465
|
+
(
|
|
466
|
+
'<div class="news__header widget__content">\n'
|
|
467
|
+
' <div class="news__tabs">\n'
|
|
468
|
+
' <h1 class="news__tab-wrapper news__head-item">\n'
|
|
469
|
+
' <a class="home-link home-link_blue_yes news__tab news__tab_selected_yes mix-tabber__tab mix-tabber__tab_selected_yes"\n'
|
|
470
|
+
' tabindex="0"\n'
|
|
471
|
+
' aria-selected="true"\n'
|
|
472
|
+
' aria-controls="news_panel_news"\n'
|
|
473
|
+
' data-key="news"\n'
|
|
474
|
+
' id="news_tab_news"\n'
|
|
475
|
+
' data-stat-link="news.tab.link.news"\n'
|
|
476
|
+
' data-stat-select="news.tab.select.news"\n'
|
|
477
|
+
' target="_blank"\n'
|
|
478
|
+
' role="tab"\n'
|
|
479
|
+
' href="https://yandex.ru/news?msid=1581089780.29024.161826.172442&mlid=1581088893.glob_225"\n'
|
|
480
|
+
' rel="noopener">...</a>\n'
|
|
481
|
+
" </h1>\n"
|
|
482
|
+
" </div>\n"
|
|
483
|
+
"</div>\n"
|
|
484
|
+
),
|
|
485
|
+
id="class_bem2",
|
|
486
|
+
),
|
|
487
|
+
pytest.param(
|
|
488
|
+
(
|
|
489
|
+
'<my-tag class="md:foo-bg md:foo-color md:foo--sub-bg md:foo--sub-color xl:foo xl:prefix2 --prefix2--something-else unrelated_class_to_fill_80_chars"></my-tag>'
|
|
490
|
+
),
|
|
491
|
+
(
|
|
492
|
+
'<my-tag class="md:foo-bg md:foo-color md:foo--sub-bg md:foo--sub-color xl:foo xl:prefix2 --prefix2--something-else unrelated_class_to_fill_80_chars"></my-tag>\n'
|
|
493
|
+
),
|
|
494
|
+
id="class_colon",
|
|
495
|
+
),
|
|
496
|
+
pytest.param(
|
|
497
|
+
(
|
|
498
|
+
'<my-tag class="__prefix1__foo __prefix1__bar __prefix2__foo prefix2 prefix2--something --prefix2--something-else"></my-tag>\n'
|
|
499
|
+
'<my-tag class="--prefix1--foo --prefix1--bar --prefix2--foo prefix2 prefix2__something __prefix2__something_else"></my-tag>'
|
|
500
|
+
),
|
|
501
|
+
(
|
|
502
|
+
'<my-tag class="__prefix1__foo __prefix1__bar __prefix2__foo prefix2 prefix2--something --prefix2--something-else"></my-tag>\n'
|
|
503
|
+
'<my-tag class="--prefix1--foo --prefix1--bar --prefix2--foo prefix2 prefix2__something __prefix2__something_else"></my-tag>\n'
|
|
504
|
+
),
|
|
505
|
+
id="class_leading_dashes",
|
|
506
|
+
),
|
|
507
|
+
pytest.param(
|
|
508
|
+
(
|
|
509
|
+
'<div aria-hidden="true" class="border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump">\n'
|
|
510
|
+
" Jump to\n"
|
|
511
|
+
' <span class="d-inline-block ml-1 v-align-middle">x</span>\n'
|
|
512
|
+
"</div>\n"
|
|
513
|
+
),
|
|
514
|
+
(
|
|
515
|
+
'<div aria-hidden="true"\n'
|
|
516
|
+
' class="border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump">\n'
|
|
517
|
+
" Jump to\n"
|
|
518
|
+
' <span class="d-inline-block ml-1 v-align-middle">x</span>\n'
|
|
519
|
+
"</div>\n"
|
|
520
|
+
),
|
|
521
|
+
id="class_many_short_names",
|
|
522
|
+
),
|
|
523
|
+
pytest.param(
|
|
524
|
+
(
|
|
525
|
+
'<img class="\n'
|
|
526
|
+
" foo\n"
|
|
527
|
+
"bar\n"
|
|
528
|
+
'">\n'
|
|
529
|
+
'<img class=" ">\n'
|
|
530
|
+
"<img class>\n"
|
|
531
|
+
'<img class="\n'
|
|
532
|
+
"looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\n"
|
|
533
|
+
"a-long-long-long-long-long-class-name\n"
|
|
534
|
+
"another-long-long-long-class-name\n"
|
|
535
|
+
" foo bar\n"
|
|
536
|
+
"foo bar\n"
|
|
537
|
+
" foo bar\n"
|
|
538
|
+
"foo bar\n"
|
|
539
|
+
" foo bar\n"
|
|
540
|
+
"foo bar\n"
|
|
541
|
+
" foo bar\n"
|
|
542
|
+
"foo bar\n"
|
|
543
|
+
" foo bar\n"
|
|
544
|
+
"foo bar\n"
|
|
545
|
+
" foo bar\n"
|
|
546
|
+
"foo bar\n"
|
|
547
|
+
" foo bar\n"
|
|
548
|
+
'">\n'
|
|
549
|
+
"<img\n"
|
|
550
|
+
'class="{{ ...classes }}">\n'
|
|
551
|
+
"<img\n"
|
|
552
|
+
'class="foo bar {{ otherClass }}">\n'
|
|
553
|
+
"<!-- escaped -->\n"
|
|
554
|
+
"<!-- from: https://developer.mozilla.org/en-US/docs/Web/API/CSS/escape#Basic_results -->\n"
|
|
555
|
+
'<img class="\n'
|
|
556
|
+
"\\.foo\\#bar\n"
|
|
557
|
+
"\\(\\)\\[\\]\\{\\}\n"
|
|
558
|
+
"--a\n"
|
|
559
|
+
"\\30\n"
|
|
560
|
+
"\\ufffd\n"
|
|
561
|
+
'">\n'
|
|
562
|
+
"<!-- from yahoo website -->\n"
|
|
563
|
+
'<div id="header-wrapper" class="Bgc(#fff) Bdbc(t) Bdbs(s) Bdbw(1px) D(tb) Pos(f) Tbl(f) W(100%) Z(4)\n'
|
|
564
|
+
"has-scrolled_Bdc($c-fuji-grey-d) Scrolling_Bdc($c-fuji-grey-d) has-scrolled_Bxsh($headerShadow)\n"
|
|
565
|
+
'Scrolling_Bxsh($headerShadow) ">\n'
|
|
566
|
+
'<div class="Bgc(#fff) M(a) Maw(1301px) Miw(1000px) Pb(12px) Pt(22px) Pos(r) TranslateZ(0) Z(6)"\n'
|
|
567
|
+
'><h1 class="Fz(0) Pstart(15px) Pos(a)"><a id="header-logo"\n'
|
|
568
|
+
'href="https://www.yahoo.com/" class="D(b) Pos(r)" data-ylk="elm:img;elmt:logo;sec:hd;slk:logo">\n'
|
|
569
|
+
'<img class="H(27px)!--sm1024 Mt(9px)!--sm1024 W(90px)!--sm1024"\n'
|
|
570
|
+
'src="https://s.yimg.com/rz/p/yahoo_frontpage_en-US_s_f_p_205x58_frontpage_2x.png" height="58px"\n'
|
|
571
|
+
'width="205px" alt="Yahoo"/></a></h1></div></div>\n'
|
|
572
|
+
),
|
|
573
|
+
(
|
|
574
|
+
'<img class=" foo bar ">\n'
|
|
575
|
+
'<img class=" ">\n'
|
|
576
|
+
"<img class>\n"
|
|
577
|
+
'<img class=" looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong a-long-long-long-long-long-class-name another-long-long-long-class-name foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar ">\n'
|
|
578
|
+
'<img class="{{ ...classes }}">\n'
|
|
579
|
+
'<img class="foo bar {{ otherClass }}">\n'
|
|
580
|
+
"<!-- escaped -->\n"
|
|
581
|
+
"<!-- from: https://developer.mozilla.org/en-US/docs/Web/API/CSS/escape#Basic_results -->\n"
|
|
582
|
+
'<img class=" \\.foo\\#bar \\(\\)\\[\\]\\{\\} --a \\30 \\ufffd ">\n'
|
|
583
|
+
"<!-- from yahoo website -->\n"
|
|
584
|
+
'<div id="header-wrapper"\n'
|
|
585
|
+
' class="Bgc(#fff) Bdbc(t) Bdbs(s) Bdbw(1px) D(tb) Pos(f) Tbl(f) W(100%) Z(4) has-scrolled_Bdc($c-fuji-grey-d) Scrolling_Bdc($c-fuji-grey-d) has-scrolled_Bxsh($headerShadow) Scrolling_Bxsh($headerShadow) ">\n'
|
|
586
|
+
' <div class="Bgc(#fff) M(a) Maw(1301px) Miw(1000px) Pb(12px) Pt(22px) Pos(r) TranslateZ(0) Z(6)">\n'
|
|
587
|
+
' <h1 class="Fz(0) Pstart(15px) Pos(a)">\n'
|
|
588
|
+
' <a id="header-logo"\n'
|
|
589
|
+
' href="https://www.yahoo.com/"\n'
|
|
590
|
+
' class="D(b) Pos(r)"\n'
|
|
591
|
+
' data-ylk="elm:img;elmt:logo;sec:hd;slk:logo">\n'
|
|
592
|
+
' <img class="H(27px)!--sm1024 Mt(9px)!--sm1024 W(90px)!--sm1024"\n'
|
|
593
|
+
' src="https://s.yimg.com/rz/p/yahoo_frontpage_en-US_s_f_p_205x58_frontpage_2x.png"\n'
|
|
594
|
+
' height="58px"\n'
|
|
595
|
+
' width="205px"\n'
|
|
596
|
+
' alt="Yahoo" />\n'
|
|
597
|
+
" </a>\n"
|
|
598
|
+
" </h1>\n"
|
|
599
|
+
" </div>\n"
|
|
600
|
+
"</div>\n"
|
|
601
|
+
),
|
|
602
|
+
id="class_names",
|
|
603
|
+
),
|
|
604
|
+
pytest.param(
|
|
605
|
+
(
|
|
606
|
+
'<div aria-hidden="true" class="border rounded-1 flex-shrink-0 bg-gray px-1 loooooooooooooooooooooooong">\n'
|
|
607
|
+
"</div>\n"
|
|
608
|
+
"\n"
|
|
609
|
+
" )\n"
|
|
610
|
+
"\n"
|
|
611
|
+
" html_out = (\n"
|
|
612
|
+
"\n"
|
|
613
|
+
'<div aria-hidden="true"\n'
|
|
614
|
+
' class="border rounded-1 flex-shrink-0 bg-gray px-1 loooooooooooooooooooooooong"\n'
|
|
615
|
+
"></div>\n"
|
|
616
|
+
),
|
|
617
|
+
(
|
|
618
|
+
'<div aria-hidden="true"\n'
|
|
619
|
+
' class="border rounded-1 flex-shrink-0 bg-gray px-1 loooooooooooooooooooooooong"></div>\n'
|
|
620
|
+
")\n"
|
|
621
|
+
"html_out = (\n"
|
|
622
|
+
'<div aria-hidden="true"\n'
|
|
623
|
+
' class="border rounded-1 flex-shrink-0 bg-gray px-1 loooooooooooooooooooooooong"></div>\n'
|
|
624
|
+
),
|
|
625
|
+
id="print_width_edge",
|
|
626
|
+
),
|
|
627
|
+
pytest.param(
|
|
628
|
+
('<img src="test.png" alt="John \'ShotGun\' Nelson">\n'),
|
|
629
|
+
('<img src="test.png" alt="John \'ShotGun\' Nelson">\n'),
|
|
630
|
+
id="double_quotes",
|
|
631
|
+
),
|
|
632
|
+
pytest.param(
|
|
633
|
+
('<a href="1" href="2">123</a>'),
|
|
634
|
+
('<a href="1" href="2">123</a>\n'),
|
|
635
|
+
id="duplicate",
|
|
636
|
+
),
|
|
637
|
+
pytest.param(
|
|
638
|
+
('<img src="test.png" alt=\'John "ShotGun" Nelson\'>'),
|
|
639
|
+
('<img src="test.png" alt=\'John "ShotGun" Nelson\'>\n'),
|
|
640
|
+
id="single_quotes",
|
|
641
|
+
),
|
|
642
|
+
pytest.param(
|
|
643
|
+
(
|
|
644
|
+
"<div\n"
|
|
645
|
+
" smart-quotes='123 \" 456'\n"
|
|
646
|
+
' smart-quotes="123 \' 456"\n'
|
|
647
|
+
" smart-quotes='123 '" 456'\n"
|
|
648
|
+
"></div>\n"
|
|
649
|
+
),
|
|
650
|
+
(
|
|
651
|
+
"<div smart-quotes='123 \" 456'\n"
|
|
652
|
+
' smart-quotes="123 \' 456"\n'
|
|
653
|
+
" smart-quotes='123 '" 456'></div>\n"
|
|
654
|
+
),
|
|
655
|
+
id="smart_quotes",
|
|
656
|
+
),
|
|
657
|
+
pytest.param(
|
|
658
|
+
(
|
|
659
|
+
'<img src="/assets/visual.png"\n'
|
|
660
|
+
'srcset="/assets/visual@0.5.png 400w, /assets/visual.png 805w"\n'
|
|
661
|
+
'sizes="(max-width: 66rem) 100vw, 66rem" alt=""/>\n'
|
|
662
|
+
'<img src="/assets/visual.png"\n'
|
|
663
|
+
'srcset="/assets/visual@0.5.png 400w, /assets/visual.png 805w, /assets/visual@2x.png 1610w, /assets/visual@3x.png 2415w"\n'
|
|
664
|
+
'sizes="(max-width: 66rem) 100vw, 66rem" alt=""/>\n'
|
|
665
|
+
'<img src="/assets/visual.png"\n'
|
|
666
|
+
'srcset="/assets/visual@0.5.png 0.5x, /assets/visual.png 1111x, /assets/visual@2x.png 2x, /assets/visual@3x.png 3.3333x"\n'
|
|
667
|
+
'sizes="(max-width: 66rem) 100vw, 66rem" alt=""/>\n'
|
|
668
|
+
"<img\n"
|
|
669
|
+
'srcset="\n'
|
|
670
|
+
" /media/examples/surfer-240-200.jpg\n"
|
|
671
|
+
'">\n'
|
|
672
|
+
"<!-- #8150 -->\n"
|
|
673
|
+
"<img\n"
|
|
674
|
+
'sizes="(max-width: 1400px) 100vw, 1400px"\n'
|
|
675
|
+
'srcset="\n'
|
|
676
|
+
"_20200401_145009_szrhju_c_scale,w_200.jpg 200w,\n"
|
|
677
|
+
"_20200401_145009_szrhju_c_scale,w_379.jpg 379w,\n"
|
|
678
|
+
"_20200401_145009_szrhju_c_scale,w_515.jpg 515w,\n"
|
|
679
|
+
"_20200401_145009_szrhju_c_scale,w_630.jpg 630w,\n"
|
|
680
|
+
"_20200401_145009_szrhju_c_scale,w_731.jpg 731w,\n"
|
|
681
|
+
"_20200401_145009_szrhju_c_scale,w_828.jpg 828w,\n"
|
|
682
|
+
"_20200401_145009_szrhju_c_scale,w_921.jpg 921w,\n"
|
|
683
|
+
"_20200401_145009_szrhju_c_scale,w_995.jpg 995w,\n"
|
|
684
|
+
"_20200401_145009_szrhju_c_scale,w_1072.jpg 1072w,\n"
|
|
685
|
+
"_20200401_145009_szrhju_c_scale,w_1145.jpg 1145w,\n"
|
|
686
|
+
"_20200401_145009_szrhju_c_scale,w_1216.jpg 1216w,\n"
|
|
687
|
+
"_20200401_145009_szrhju_c_scale,w_1284.jpg 1284w,\n"
|
|
688
|
+
"_20200401_145009_szrhju_c_scale,w_1350.jpg 1350w,\n"
|
|
689
|
+
"_20200401_145009_szrhju_c_scale,w_1398.jpg 1398w,\n"
|
|
690
|
+
'_20200401_145009_szrhju_c_scale,w_1400.jpg 1400w"\n'
|
|
691
|
+
'src="_20200401_145009_szrhju_c_scale,w_1400.jpg"\n'
|
|
692
|
+
'alt="">\n'
|
|
693
|
+
"\n"
|
|
694
|
+
" )\n"
|
|
695
|
+
"\n"
|
|
696
|
+
" html_out = (\n"
|
|
697
|
+
"\n"
|
|
698
|
+
"<img\n"
|
|
699
|
+
' src="/assets/visual.png"\n'
|
|
700
|
+
' srcset="/assets/visual@0.5.png 400w, /assets/visual.png 805w"\n'
|
|
701
|
+
' sizes="(max-width: 66rem) 100vw, 66rem"\n'
|
|
702
|
+
' alt=""\n'
|
|
703
|
+
"/>\n"
|
|
704
|
+
"<img\n"
|
|
705
|
+
' src="/assets/visual.png"\n'
|
|
706
|
+
' srcset="\n'
|
|
707
|
+
" /assets/visual@0.5.png 400w,\n"
|
|
708
|
+
" /assets/visual.png 805w,\n"
|
|
709
|
+
" /assets/visual@2x.png 1610w,\n"
|
|
710
|
+
" /assets/visual@3x.png 2415w\n"
|
|
711
|
+
' "\n'
|
|
712
|
+
' sizes="(max-width: 66rem) 100vw, 66rem"\n'
|
|
713
|
+
' alt=""\n'
|
|
714
|
+
"/>\n"
|
|
715
|
+
"<img\n"
|
|
716
|
+
' src="/assets/visual.png"\n'
|
|
717
|
+
' srcset="\n'
|
|
718
|
+
" /assets/visual@0.5.png 0.5x,\n"
|
|
719
|
+
" /assets/visual.png 1111x,\n"
|
|
720
|
+
" /assets/visual@2x.png 2x,\n"
|
|
721
|
+
" /assets/visual@3x.png 3.3333x\n"
|
|
722
|
+
' "\n'
|
|
723
|
+
' sizes="(max-width: 66rem) 100vw, 66rem"\n'
|
|
724
|
+
' alt=""\n'
|
|
725
|
+
"/>\n"
|
|
726
|
+
'<img srcset="/media/examples/surfer-240-200.jpg" />\n'
|
|
727
|
+
"<!-- #8150 -->\n"
|
|
728
|
+
"<img\n"
|
|
729
|
+
' sizes="(max-width: 1400px) 100vw, 1400px"\n'
|
|
730
|
+
' srcset="\n'
|
|
731
|
+
" _20200401_145009_szrhju_c_scale,w_200.jpg 200w,\n"
|
|
732
|
+
" _20200401_145009_szrhju_c_scale,w_379.jpg 379w,\n"
|
|
733
|
+
" _20200401_145009_szrhju_c_scale,w_515.jpg 515w,\n"
|
|
734
|
+
" _20200401_145009_szrhju_c_scale,w_630.jpg 630w,\n"
|
|
735
|
+
" _20200401_145009_szrhju_c_scale,w_731.jpg 731w,\n"
|
|
736
|
+
" _20200401_145009_szrhju_c_scale,w_828.jpg 828w,\n"
|
|
737
|
+
" _20200401_145009_szrhju_c_scale,w_921.jpg 921w,\n"
|
|
738
|
+
" _20200401_145009_szrhju_c_scale,w_995.jpg 995w,\n"
|
|
739
|
+
" _20200401_145009_szrhju_c_scale,w_1072.jpg 1072w,\n"
|
|
740
|
+
" _20200401_145009_szrhju_c_scale,w_1145.jpg 1145w,\n"
|
|
741
|
+
" _20200401_145009_szrhju_c_scale,w_1216.jpg 1216w,\n"
|
|
742
|
+
" _20200401_145009_szrhju_c_scale,w_1284.jpg 1284w,\n"
|
|
743
|
+
" _20200401_145009_szrhju_c_scale,w_1350.jpg 1350w,\n"
|
|
744
|
+
" _20200401_145009_szrhju_c_scale,w_1398.jpg 1398w,\n"
|
|
745
|
+
" _20200401_145009_szrhju_c_scale,w_1400.jpg 1400w\n"
|
|
746
|
+
' "\n'
|
|
747
|
+
' src="_20200401_145009_szrhju_c_scale,w_1400.jpg"\n'
|
|
748
|
+
' alt=""\n'
|
|
749
|
+
"/>\n"
|
|
750
|
+
),
|
|
751
|
+
(
|
|
752
|
+
'<img src="/assets/visual.png"\n'
|
|
753
|
+
' srcset="/assets/visual@0.5.png 400w,\n'
|
|
754
|
+
' /assets/visual.png 805w"\n'
|
|
755
|
+
' sizes="(max-width: 66rem) 100vw,\n'
|
|
756
|
+
' 66rem"\n'
|
|
757
|
+
' alt="" />\n'
|
|
758
|
+
'<img src="/assets/visual.png"\n'
|
|
759
|
+
' srcset="/assets/visual@0.5.png 400w,\n'
|
|
760
|
+
" /assets/visual.png 805w,\n"
|
|
761
|
+
" /assets/visual@2x.png 1610w,\n"
|
|
762
|
+
' /assets/visual@3x.png 2415w"\n'
|
|
763
|
+
' sizes="(max-width: 66rem) 100vw,\n'
|
|
764
|
+
' 66rem"\n'
|
|
765
|
+
' alt="" />\n'
|
|
766
|
+
'<img src="/assets/visual.png"\n'
|
|
767
|
+
' srcset="/assets/visual@0.5.png 0.5x,\n'
|
|
768
|
+
" /assets/visual.png 1111x,\n"
|
|
769
|
+
" /assets/visual@2x.png 2x,\n"
|
|
770
|
+
' /assets/visual@3x.png 3.3333x"\n'
|
|
771
|
+
' sizes="(max-width: 66rem) 100vw,\n'
|
|
772
|
+
' 66rem"\n'
|
|
773
|
+
' alt="" />\n'
|
|
774
|
+
'<img srcset=" /media/examples/surfer-240-200.jpg ">\n'
|
|
775
|
+
"<!-- #8150 -->\n"
|
|
776
|
+
'<img sizes="(max-width: 1400px) 100vw,\n'
|
|
777
|
+
' 1400px"\n'
|
|
778
|
+
' srcset="_20200401_145009_szrhju_c_scale,w_200.jpg 200w,\n'
|
|
779
|
+
" _20200401_145009_szrhju_c_scale,w_379.jpg 379w,\n"
|
|
780
|
+
" _20200401_145009_szrhju_c_scale,w_515.jpg 515w,\n"
|
|
781
|
+
" _20200401_145009_szrhju_c_scale,w_630.jpg 630w,\n"
|
|
782
|
+
" _20200401_145009_szrhju_c_scale,w_731.jpg 731w,\n"
|
|
783
|
+
" _20200401_145009_szrhju_c_scale,w_828.jpg 828w,\n"
|
|
784
|
+
" _20200401_145009_szrhju_c_scale,w_921.jpg 921w,\n"
|
|
785
|
+
" _20200401_145009_szrhju_c_scale,w_995.jpg 995w,\n"
|
|
786
|
+
" _20200401_145009_szrhju_c_scale,w_1072.jpg 1072w,\n"
|
|
787
|
+
" _20200401_145009_szrhju_c_scale,w_1145.jpg 1145w,\n"
|
|
788
|
+
" _20200401_145009_szrhju_c_scale,w_1216.jpg 1216w,\n"
|
|
789
|
+
" _20200401_145009_szrhju_c_scale,w_1284.jpg 1284w,\n"
|
|
790
|
+
" _20200401_145009_szrhju_c_scale,w_1350.jpg 1350w,\n"
|
|
791
|
+
" _20200401_145009_szrhju_c_scale,w_1398.jpg 1398w,\n"
|
|
792
|
+
' _20200401_145009_szrhju_c_scale,w_1400.jpg 1400w"\n'
|
|
793
|
+
' src="_20200401_145009_szrhju_c_scale,w_1400.jpg"\n'
|
|
794
|
+
' alt="">\n'
|
|
795
|
+
")\n"
|
|
796
|
+
"html_out = (\n"
|
|
797
|
+
'<img src="/assets/visual.png"\n'
|
|
798
|
+
' srcset="/assets/visual@0.5.png 400w,\n'
|
|
799
|
+
' /assets/visual.png 805w"\n'
|
|
800
|
+
' sizes="(max-width: 66rem) 100vw,\n'
|
|
801
|
+
' 66rem"\n'
|
|
802
|
+
' alt="" />\n'
|
|
803
|
+
'<img src="/assets/visual.png"\n'
|
|
804
|
+
' srcset="/assets/visual@0.5.png 400w,\n'
|
|
805
|
+
" /assets/visual.png 805w,\n"
|
|
806
|
+
" /assets/visual@2x.png 1610w,\n"
|
|
807
|
+
' /assets/visual@3x.png 2415w"\n'
|
|
808
|
+
' sizes="(max-width: 66rem) 100vw,\n'
|
|
809
|
+
' 66rem"\n'
|
|
810
|
+
' alt="" />\n'
|
|
811
|
+
'<img src="/assets/visual.png"\n'
|
|
812
|
+
' srcset="/assets/visual@0.5.png 0.5x,\n'
|
|
813
|
+
" /assets/visual.png 1111x,\n"
|
|
814
|
+
" /assets/visual@2x.png 2x,\n"
|
|
815
|
+
' /assets/visual@3x.png 3.3333x"\n'
|
|
816
|
+
' sizes="(max-width: 66rem) 100vw,\n'
|
|
817
|
+
' 66rem"\n'
|
|
818
|
+
' alt="" />\n'
|
|
819
|
+
'<img srcset="/media/examples/surfer-240-200.jpg" />\n'
|
|
820
|
+
"<!-- #8150 -->\n"
|
|
821
|
+
'<img sizes="(max-width: 1400px) 100vw,\n'
|
|
822
|
+
' 1400px"\n'
|
|
823
|
+
' srcset="_20200401_145009_szrhju_c_scale,w_200.jpg 200w,\n'
|
|
824
|
+
" _20200401_145009_szrhju_c_scale,w_379.jpg 379w,\n"
|
|
825
|
+
" _20200401_145009_szrhju_c_scale,w_515.jpg 515w,\n"
|
|
826
|
+
" _20200401_145009_szrhju_c_scale,w_630.jpg 630w,\n"
|
|
827
|
+
" _20200401_145009_szrhju_c_scale,w_731.jpg 731w,\n"
|
|
828
|
+
" _20200401_145009_szrhju_c_scale,w_828.jpg 828w,\n"
|
|
829
|
+
" _20200401_145009_szrhju_c_scale,w_921.jpg 921w,\n"
|
|
830
|
+
" _20200401_145009_szrhju_c_scale,w_995.jpg 995w,\n"
|
|
831
|
+
" _20200401_145009_szrhju_c_scale,w_1072.jpg 1072w,\n"
|
|
832
|
+
" _20200401_145009_szrhju_c_scale,w_1145.jpg 1145w,\n"
|
|
833
|
+
" _20200401_145009_szrhju_c_scale,w_1216.jpg 1216w,\n"
|
|
834
|
+
" _20200401_145009_szrhju_c_scale,w_1284.jpg 1284w,\n"
|
|
835
|
+
" _20200401_145009_szrhju_c_scale,w_1350.jpg 1350w,\n"
|
|
836
|
+
" _20200401_145009_szrhju_c_scale,w_1398.jpg 1398w,\n"
|
|
837
|
+
' _20200401_145009_szrhju_c_scale,w_1400.jpg 1400w"\n'
|
|
838
|
+
' src="_20200401_145009_szrhju_c_scale,w_1400.jpg"\n'
|
|
839
|
+
' alt="" />\n'
|
|
840
|
+
),
|
|
841
|
+
id="src_set",
|
|
842
|
+
),
|
|
843
|
+
pytest.param(
|
|
844
|
+
(
|
|
845
|
+
'<div style="\n'
|
|
846
|
+
"color:\n"
|
|
847
|
+
"#fFf\n"
|
|
848
|
+
'"></div>\n'
|
|
849
|
+
'<div style=" "></div>\n'
|
|
850
|
+
"<div style></div>\n"
|
|
851
|
+
'<div style="\n'
|
|
852
|
+
"all: initial;display: block;\n"
|
|
853
|
+
"contain: content;text-align: center;\n"
|
|
854
|
+
"background: linear-gradient(to left, hotpink, #FFF00F, #ccc, hsla(240, 100%, 50%, .05), transparent);\n"
|
|
855
|
+
"background: linear-gradient(to left, hsla(240, 100%, 50%, .05), red);\n"
|
|
856
|
+
"max-width: 500px;margin: 0 auto;\n"
|
|
857
|
+
"border-radius: 8px;transition: transform .2s ease-out;\n"
|
|
858
|
+
'"></div>\n'
|
|
859
|
+
'<div style="\n'
|
|
860
|
+
"background: linear-gradient(to left, hotpink, hsla(240, 100%, 50%, .05), transparent);\n"
|
|
861
|
+
'"></div>\n'
|
|
862
|
+
'<div style=" color : red;\n'
|
|
863
|
+
' display :inline ">\n'
|
|
864
|
+
" </div>\n"
|
|
865
|
+
'<div style="\n'
|
|
866
|
+
"color: green;\n"
|
|
867
|
+
"display: inline\n"
|
|
868
|
+
'">\n'
|
|
869
|
+
" </div>\n"
|
|
870
|
+
"<div attribute-1 attribute-2 attribute-3 attribute-4 attribute-5 attribute-6 attribute-7\n"
|
|
871
|
+
'style="css-prop-1: css-value;css-prop-2: css-value;css-prop-3: css-value;css-prop-4: css-value;"\n'
|
|
872
|
+
" attribute-1 attribute-2 attribute-3 attribute-4 attribute-5 attribute-6 attribute-7 >\n"
|
|
873
|
+
" </div>\n"
|
|
874
|
+
'<div style="{{ ...styles }}"\n'
|
|
875
|
+
"></div>\n"
|
|
876
|
+
'<div style="color: red; {{ otherStyles }}"\n'
|
|
877
|
+
"></div>\n"
|
|
878
|
+
),
|
|
879
|
+
(
|
|
880
|
+
'<div style=" color: #fFf "></div>\n'
|
|
881
|
+
'<div style=" "></div>\n'
|
|
882
|
+
"<div style></div>\n"
|
|
883
|
+
'<div style="all: initial;\n'
|
|
884
|
+
" display: block;\n"
|
|
885
|
+
" contain: content;\n"
|
|
886
|
+
" text-align: center;\n"
|
|
887
|
+
" background: linear-gradient(to left, hotpink, #FFF00F, #ccc, hsla(240, 100%, 50%, .05), transparent);\n"
|
|
888
|
+
" background: linear-gradient(to left, hsla(240, 100%, 50%, .05), red);\n"
|
|
889
|
+
" max-width: 500px;\n"
|
|
890
|
+
" margin: 0 auto;\n"
|
|
891
|
+
" border-radius: 8px;\n"
|
|
892
|
+
' transition: transform .2s ease-out"></div>\n'
|
|
893
|
+
'<div style="background: linear-gradient(to left, hotpink, hsla(240, 100%, 50%, .05), transparent)"></div>\n'
|
|
894
|
+
'<div style=" color : red; display :inline "></div>\n'
|
|
895
|
+
'<div style=" color: green; display: inline "></div>\n'
|
|
896
|
+
"<div attribute-1\n"
|
|
897
|
+
" attribute-2\n"
|
|
898
|
+
" attribute-3\n"
|
|
899
|
+
" attribute-4\n"
|
|
900
|
+
" attribute-5\n"
|
|
901
|
+
" attribute-6\n"
|
|
902
|
+
" attribute-7\n"
|
|
903
|
+
' style="css-prop-1: css-value;\n'
|
|
904
|
+
" css-prop-2: css-value;\n"
|
|
905
|
+
" css-prop-3: css-value;\n"
|
|
906
|
+
' css-prop-4: css-value"\n'
|
|
907
|
+
" attribute-1\n"
|
|
908
|
+
" attribute-2\n"
|
|
909
|
+
" attribute-3\n"
|
|
910
|
+
" attribute-4\n"
|
|
911
|
+
" attribute-5\n"
|
|
912
|
+
" attribute-6\n"
|
|
913
|
+
" attribute-7></div>\n"
|
|
914
|
+
'<div style="{{ ...styles }}"></div>\n'
|
|
915
|
+
'<div style="color: red; {{ otherStyles }}"></div>\n'
|
|
916
|
+
),
|
|
917
|
+
id="style",
|
|
918
|
+
),
|
|
919
|
+
pytest.param(
|
|
920
|
+
("<p title=Title>String</p>"),
|
|
921
|
+
("<p title=Title>String</p>\n"),
|
|
922
|
+
id="without_quotes",
|
|
923
|
+
),
|
|
924
|
+
]
|
|
925
|
+
|
|
926
|
+
|
|
927
|
+
@pytest.mark.parametrize(("source", "expected"), test_data)
|
|
928
|
+
def test_base(source, expected, basic_config):
|
|
929
|
+
output = formatter(basic_config, source)
|
|
930
|
+
|
|
931
|
+
printer(expected, source, output)
|
|
932
|
+
assert expected == output
|
|
933
|
+
|
|
934
|
+
|
|
935
|
+
# was disabled
|