├── .github
└── workflows
│ └── Docker.yml
├── .gitignore
├── .htmlhintrc
├── .yamllint
├── Dockerfile
├── Makefile
├── README.md
├── description.en.yml
├── description.es.yml
├── description.ru.yml
├── docker-compose.override.yml
├── docker-compose.yml
├── modules
├── 10-html
│ ├── 10-html-markup
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 20-tags
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 30-text-in-html
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 40-nested-tag
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 50-attributes
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── description.en.yml
│ ├── description.es.yml
│ └── description.ru.yml
├── 20-hypertext
│ ├── 10-paragraph
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 20-text-style
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 25-hypertext-header
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 30-lists
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 40-nested-lists
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 50-table
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 60-colspan-rowspan
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 70-special-characters
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 80-links
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 90-pre
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 95-code
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── description.en.yml
│ ├── description.es.yml
│ └── description.ru.yml
├── 30-media
│ ├── 10-img
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 20-audio
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 30-video
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── description.en.yml
│ ├── description.es.yml
│ └── description.ru.yml
├── 40-structure
│ ├── 10-basics
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 30-meta
│ │ ├── Makefile
│ │ ├── assets
│ │ │ ├── google.png
│ │ │ └── search_en.png
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ ├── assets
│ │ │ │ └── search-result.png
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 40-link
│ │ ├── Makefile
│ │ ├── assets
│ │ │ ├── favicon.png
│ │ │ └── tabs_en.png
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 50-viewport
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 60-block
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── description.en.yml
│ ├── description.es.yml
│ └── description.ru.yml
├── 50-form
│ ├── 10-form-basics
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 20-input
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 30-checkbox
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 40-radio
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 50-textarea
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 60-select
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 70-button
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── description.en.yml
│ ├── description.es.yml
│ └── description.ru.yml
├── 60-semantics
│ ├── 10-semantic-elements
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 20-semantics-header
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 30-nav
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 40-main
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 50-section
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 60-article
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── 70-aside
│ │ ├── Makefile
│ │ ├── description.es.yml
│ │ ├── en
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── es
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ ├── index.html
│ │ ├── ru
│ │ │ ├── EXERCISE.md
│ │ │ ├── README.md
│ │ │ └── data.yml
│ │ └── test.js
│ ├── description.en.yml
│ ├── description.es.yml
│ └── description.ru.yml
└── 70-other
│ ├── 10-semantics
│ ├── Makefile
│ ├── assets
│ │ ├── mode_en.jpg
│ │ └── read-view.png
│ ├── description.es.yml
│ ├── en
│ │ ├── EXERCISE.md
│ │ ├── README.md
│ │ └── data.yml
│ ├── es
│ │ ├── EXERCISE.md
│ │ ├── README.md
│ │ └── data.yml
│ ├── index.html
│ ├── ru
│ │ ├── EXERCISE.md
│ │ ├── README.md
│ │ └── data.yml
│ └── test.js
│ ├── 20-microdata
│ ├── Makefile
│ ├── assets
│ │ ├── google-check-false.png
│ │ └── google-check.png
│ ├── description.es.yml
│ ├── en
│ │ ├── EXERCISE.md
│ │ ├── README.md
│ │ └── data.yml
│ ├── es
│ │ ├── EXERCISE.md
│ │ ├── README.md
│ │ └── data.yml
│ ├── index.html
│ ├── ru
│ │ ├── EXERCISE.md
│ │ ├── README.md
│ │ └── data.yml
│ └── test.js
│ ├── 30-validation
│ ├── Makefile
│ ├── assets
│ │ └── errorhtml.png
│ ├── description.es.yml
│ ├── en
│ │ ├── EXERCISE.md
│ │ ├── README.md
│ │ └── data.yml
│ ├── es
│ │ ├── EXERCISE.md
│ │ ├── README.md
│ │ └── data.yml
│ ├── index.html
│ ├── ru
│ │ ├── EXERCISE.md
│ │ ├── README.md
│ │ └── data.yml
│ └── test.js
│ ├── description.en.yml
│ ├── description.es.yml
│ └── description.ru.yml
├── package-lock.json
├── package.json
├── setup.js
├── spec.yml
└── src
└── tests.js
/.github/workflows/Docker.yml:
--------------------------------------------------------------------------------
1 | name: Docker
2 |
3 | on:
4 | push:
5 | branches:
6 | - main
7 | pull_request:
8 | branches:
9 | - main
10 |
11 | jobs:
12 | main:
13 | runs-on: ubuntu-latest
14 |
15 | steps:
16 | - uses: hexlet-basics/exercises-action@release
17 | with:
18 | DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
19 | DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
20 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 |
--------------------------------------------------------------------------------
/.htmlhintrc:
--------------------------------------------------------------------------------
1 | {
2 | "doctype-first": false
3 | }
4 |
--------------------------------------------------------------------------------
/.yamllint:
--------------------------------------------------------------------------------
1 | ---
2 |
3 | extends: default
4 |
5 | rules:
6 | line-length: disable
7 | empty-lines: disable
8 | trailing-spaces: disable
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM hexletbasics/base-image
2 |
3 | WORKDIR /exercises-html
4 |
5 | ENV PATH=$PATH:/exercises-html/node_modules/.bin
6 |
7 | COPY package.json package-lock.json .
8 |
9 | RUN npm ci
10 |
11 | COPY . .
12 |
13 | ENV NODE_PATH=/usr/lib/node_modules:/exercises-html/src
14 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | -include /opt/basics/common/common.mk
2 |
3 | compose-setup: compose-build compose-install
4 |
5 | compose:
6 | docker compose up
7 |
8 | compose-bash:
9 | docker compose run --rm exercises bash
10 |
11 | compose-test:
12 | docker compose run --rm exercises make test
13 |
14 | compose-install:
15 | docker compose run --rm exercises npm ci
16 |
17 | compose-build:
18 | docker compose build
19 |
20 | compose-down:
21 | docker compose down -v --remove-orphans
22 |
23 | code-lint:
24 | htmlhint modules/**/*.{htm,html}
25 |
26 | compose-description-lint:
27 | docker compose run --rm exercises make description-lint
28 |
29 | compose-schema-validate:
30 | docker compose run --rm exercises make schema-validate
31 |
32 | ci-check:
33 | docker compose --file docker-compose.yml build
34 | docker compose --file docker-compose.yml up --abort-on-container-exit
35 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # exercises-html
2 |
3 | [](../../actions)
4 |
5 | ## How to contribute
6 |
7 | * Discuss the project on Telegram: https://t.me/hexletcommunity/12
8 |
9 | ## Develop
10 |
11 | ```bash
12 | # setup
13 | make
14 | # run
15 | make compose
16 | # check
17 | make ci-check
18 |
19 | # run tests
20 | make compose-test
21 |
22 | # run linters and validators
23 | make compose-code-lint
24 | make compose-description-lint
25 | make compose-schema-validate
26 | ```
27 |
28 | ##
29 | [](https://hexlet.io/?utm_source=github&utm_medium=link&utm_campaign=exercises-html)
30 |
31 | This repository is created and maintained by the team and the community of Hexlet, an educational project. [Read more about Hexlet](https://hexlet.io/?utm_source=github&utm_medium=link&utm_campaign=exercises-html).
32 | ##
33 |
34 | See most active contributors on [hexlet-friends](https://friends.hexlet.io/).
35 |
--------------------------------------------------------------------------------
/description.en.yml:
--------------------------------------------------------------------------------
1 | ---
2 |
3 | title: |
4 | Learn the HTML: 100% Free Course of the Programming Basics
5 | header: HTML
6 | description: |
7 | To standardize the output of text within browser was created an HTML standard. It defines the rules for formatting text data for correct output. This course is devoted to the fundamentals of HTML markup, working with typography, media documents, and forms layout
8 | seo_description: |
9 | Learn Code Basics of HTML for Free: Programming Tutorials & an Interactive Coding Environment | Discuss Problems with Other Students Enroll Now and Learn HTML for Free!
10 |
11 | keywords:
12 | - html
13 | - code basics
14 | - online course
15 | - free course
16 | - programming
17 |
--------------------------------------------------------------------------------
/description.es.yml:
--------------------------------------------------------------------------------
1 | ---
2 |
3 | title: |
4 | Curso en línea gratuito de HTML
5 |
6 | header: HTML
7 | description: |
8 | Para estandarizar la presentación de texto dentro de un navegador se creó el estándar HTML, el cual describe las reglas de formato de datos de texto para una visualización correcta. Este curso se centra en los conceptos básicos de la estructura HTML, el trabajo con tipografía, la visualización de documentos multimedia y el manejo de formularios.
9 | seo_description: |
10 | Comienza el curso gratuito de HTML básico: aprende a crear sitios web | Mejora tus habilidades y haz preguntas | Aprende HTML en línea en CodeBasics
11 | keywords:
12 | - html
13 | - hipertexto
14 | - maquetación
15 | - lenguaje de marcado de hipertexto
16 | - curso en línea
17 | - curso gratuito
18 | - programación
19 | - code basics
20 | - curso en línea
21 | - curso gratuito
22 | - programación
23 |
--------------------------------------------------------------------------------
/description.ru.yml:
--------------------------------------------------------------------------------
1 | ---
2 |
3 | title: |
4 | Бесплатный курс по HTML: обучение html верстке для начинающих
5 | header: HTML
6 | description: |
7 | Для стандартизации вывода текста внутри браузера был придуман стандарт HTML, описывающий правила оформления текстовых данных для корректного вывода. Этот курс посвящён азам HTML разметки, работы с типографикой, вывода медиа документов и работы с формами
8 | seo_description: |
9 | Начните бесплатный курс по основам HTML: научитесь создавать сайты | Прокачивайтесь и задавайте вопросы | Изучите HTML онлайн на CodeBasics
10 | keywords:
11 | - html
12 | - хтмл
13 | - штмл
14 | - аштимэмэль
15 | - гипертекст
16 | - верстка
17 | - язык гипертекстовой разметки
18 | - онлайн курс
19 | - бесплатный курс
20 | - программирование
21 | - code basics
22 | - online course
23 | - free course
24 | - programming
25 |
--------------------------------------------------------------------------------
/docker-compose.override.yml:
--------------------------------------------------------------------------------
1 | ---
2 | services:
3 | exercises:
4 | volumes:
5 | - .:/exercises-html
6 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | ---
2 | services:
3 | exercises:
4 | build: .
5 | image: hexletbasics/exercises-html:cached
6 | command: make check
7 |
--------------------------------------------------------------------------------
/modules/10-html/10-html-markup/Makefile:
--------------------------------------------------------------------------------
1 | test:
2 | node test.js 2>&1
3 |
--------------------------------------------------------------------------------
/modules/10-html/10-html-markup/description.es.yml:
--------------------------------------------------------------------------------
1 | ---
2 |
3 | name: Marcado HTML
4 | theory: |
5 | Todos los días vemos docenas de páginas web, leemos textos que se muestran como si fueran de revistas. Estas páginas son hipertexto, un sistema de páginas web que se pueden navegar mediante enlaces. Para implementar este sistema, existe el lenguaje HTML.
6 |
7 | HTML (HyperText Markup Language) es un lenguaje para marcar hipertexto. En términos de funcionalidad, HTML es un conjunto de reglas que permiten al navegador distinguir entre encabezados y listas, tablas e imágenes, entre otros. El lenguaje fue creado en 1993 con el objetivo de estandarizar las reglas para mostrar texto dentro de las páginas web.
8 |
9 | Incluso esta página es un texto que está descrito con HTML y procesado por el navegador. La tecnología ha avanzado mucho, pero el concepto de usar HTML para marcar texto sigue siendo el mismo después de muchos años.
10 |
11 | Aquí tienes un ejemplo de marcado HTML:
12 |
13 | ```html
14 |
17 | Code Basics son lecciones prácticas gratuitas de programación para aquellos que comienzan desde cero.
18 |
20 | Si eres completamente nuevo y quieres aprender los fundamentos, como variables, cadenas, bucles, funciones, etc., entonces Code Basics es para ti.
21 | Code Basics
16 |
15 | Code Basics - free hands-on programming lessons for people 16 | starting from scratch. 17 |
18 |19 | If you are a complete beginner and want to learn the basics - variables, 20 | strings, loops, functions, etc., then Code Basics is for you. 21 |
22 |13 | Code Basics son lecciones prácticas gratuitas de programación para aquellos que comienzan desde cero. 14 |
15 |16 | Si eres completamente nuevo y quieres aprender los fundamentos, como variables, cadenas, bucles, funciones, etc., entonces Code Basics es para ti. 17 |
18 |13 | Code Basics — бесплатные практические уроки по программированию для тех, 14 | кто начинает с нуля. 15 |
16 |17 | Если вы совсем новичок и хотите научиться основам — переменным, 18 | строкам, циклам, функциям и т.д., то Code Basics вам подойдёт. 19 |
20 |` into the
tag and paste in the editor. 2 | -------------------------------------------------------------------------------- /modules/10-html/20-tags/en/data.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Tags 3 | -------------------------------------------------------------------------------- /modules/10-html/20-tags/es/EXERCISE.md: -------------------------------------------------------------------------------- 1 | Envuelva la frase _The quick brown fox jumps over the lazy dog_ en una etiqueta `
` y péguela en el editor. 2 | -------------------------------------------------------------------------------- /modules/10-html/20-tags/es/data.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Etiquetas 3 | -------------------------------------------------------------------------------- /modules/10-html/20-tags/index.html: -------------------------------------------------------------------------------- 1 |
The quick brown fox jumps over the lazy dog
2 | -------------------------------------------------------------------------------- /modules/10-html/20-tags/ru/EXERCISE.md: -------------------------------------------------------------------------------- 1 | Оберните в тег `` фразу _The quick brown fox jumps over the lazy dog_ и вставьте в редактор 2 | -------------------------------------------------------------------------------- /modules/10-html/20-tags/ru/data.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Теги 3 | -------------------------------------------------------------------------------- /modules/10-html/20-tags/test.js: -------------------------------------------------------------------------------- 1 | const { test } = require('tests'); 2 | 3 | test(({ query, expect }) => { 4 | const element = query(document, 'p', HTMLParagraphElement); 5 | expect(element).to.contain.text('lazy'); 6 | }); 7 | -------------------------------------------------------------------------------- /modules/10-html/30-text-in-html/Makefile: -------------------------------------------------------------------------------- 1 | test: 2 | node test.js 2>&1 3 | -------------------------------------------------------------------------------- /modules/10-html/30-text-in-html/en/EXERCISE.md: -------------------------------------------------------------------------------- 1 | Format this text 2 | 3 |
My Circle, a career portal, studied the IT education market and determined which online schools teach programming well. In the final ranking, Hexlet came in second place.
5 | 6 |"My Circle" surveyed 3,500 IT professionals and compiled a ranking table of online schools for programmers. "My Circle" and "Habr" users who attended online universities took part in the survey. In the final table, Hexlet came in second place.
7 |El portal de carreras "Mi Entorno" ha estudiado el mercado de la educación en TI y ha descubierto en qué escuelas en línea se enseña programación de manera efectiva. En la clasificación final, Hexlet ocupó el segundo lugar.
5 | 6 |"Mi Entorno" encuestó a 3500 profesionales de TI y elaboró una clasificación de escuelas en línea para programadores. La encuesta contó con la participación de usuarios de "Mi Entorno" y "Habr.com", que estudiaron en universidades en línea. En la tabla final, Hexlet ocupó el segundo lugar.
7 |My Circle, a career portal, studied the IT education market and determined which online schools teach programming well. In the final ranking, Hexlet came in second place.
2 | 3 |"My Circle" surveyed 3,500 IT professionals and compiled a ranking table of online schools for programmers. "My Circle" and "Habr" users who attended online universities took part in the survey. In the final table, Hexlet came in second place.
4 | -------------------------------------------------------------------------------- /modules/10-html/30-text-in-html/ru/EXERCISE.md: -------------------------------------------------------------------------------- 1 | Сверстайте текст 2 | 3 |Карьерный портал «Мой круг» изучил рынок IT-образования и выяснил, в каких онлайн-школах эффективно учат программированию. В итоговом рейтинге Хекслет занял второе место.
5 | 6 |«Мой круг» опросил 3500 IT-специалистов и составил рейтинг онлайн-школ для программистов. В опросе приняли участие пользователи «Моего круга» и «Хабра», которые учились в онлайн-университетах. В финальной таблице «Хекслет» занял второе место.
7 |Hover your cursor over this text
2 | -------------------------------------------------------------------------------- /modules/10-html/50-attributes/ru/EXERCISE.md: -------------------------------------------------------------------------------- 1 | Создайте параграф с произвольным текстом и всплывающей подсказкой. Добавьте к нему класс `hexlet` 2 | -------------------------------------------------------------------------------- /modules/10-html/50-attributes/ru/data.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Атрибуты HTML 3 | tips: 4 | - >- 5 | Все глобальные атрибуты можно посмотреть на [MDN Web 6 | Docs](https://developer.mozilla.org/ru/docs/Web/HTML/Global_attributes) 7 | -------------------------------------------------------------------------------- /modules/10-html/50-attributes/test.js: -------------------------------------------------------------------------------- 1 | const { test } = require('tests'); 2 | 3 | test(({ query, expect }) => { 4 | const elements = query(document, 'p', HTMLElement); 5 | expect(elements).to.have.attr('title').match(/,*/); 6 | expect(elements).to.have.attr('class', 'hexlet'); 7 | }); 8 | -------------------------------------------------------------------------------- /modules/10-html/description.en.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | name: HTML Basics 4 | description: | 5 | To normalize text rendering in a browser was developed HTML markup language that describes the rules for the layout of text data. Despite the long evolution of the language, its basic concepts haven't changed even after more than 20 years. In first module, we will review the fundamental concepts of HTML: tag, attribute, and nesting of tags, and will learn the core features of marking up text with paragraphs. 6 | -------------------------------------------------------------------------------- /modules/10-html/description.es.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | name: Fundamentos de la estructura HTML 4 | description: | 5 | Para estandarizar la presentación de texto en un navegador, se desarrolló el lenguaje de marcado HTML, el cual describe las reglas de formato de los datos de texto. A pesar de su largo desarrollo, los conceptos básicos no han cambiado incluso después de más de 20 años. En el primer módulo, analizaremos los conceptos fundamentales de HTML: etiqueta, atributo, anidamiento de etiquetas y aprenderemos las capacidades básicas para marcar texto utilizando párrafos. 6 | -------------------------------------------------------------------------------- /modules/10-html/description.ru.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | name: Основы разметки HTML 4 | description: | 5 | Для стандартизации вывода текста внутри браузера был разработан язык разметки HTML, описывающий правила оформления текстовых данных. Несмотря на долгое развитие языка, базовые концепции не поменялись даже спустя более 20 лет. В первом модуле разберём основные концепции HTML: тег, атрибут, вложенность тегов и научимся базовым возможностям по разметке текста с помощью параграфов 6 | -------------------------------------------------------------------------------- /modules/20-hypertext/10-paragraph/Makefile: -------------------------------------------------------------------------------- 1 | test: 2 | node test.js 2>&1 3 | -------------------------------------------------------------------------------- /modules/20-hypertext/10-paragraph/description.es.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | name: Párrafos 4 | theory: | 5 | Los párrafos son la forma principal de dividir un texto largo en bloques lógicos más pequeños. Estos bloques se separan automáticamente entre sí con sangrías. Este tipo de texto es mucho más fácil de leer y no asusta a los usuarios. 6 | 7 | Los párrafos se encuentran principalmente dentro de un texto largo. Por ejemplo, cualquier lección en Hexlet o Code Basics se divide en párrafos para facilitar la lectura, al igual que en esta lección. 8 | 9 | La división se realiza en bloques de significado pequeños. Esto no solo hace que sea más cómodo de leer, sino que también permite encontrar rápidamente la información necesaria en un texto largo. 10 | 11 | Los párrafos se crean utilizando la etiqueta de apertura y cierre ``, dentro de la cual se coloca una pequeña parte del texto. Por ejemplo: 12 | 13 | ```html 14 |
Primer párrafo
15 |Segundo párrafo
16 | ``` 17 | 18 | Así es como se ven en el navegador: 19 | 20 |Primer párrafo
22 |Segundo párrafo
23 |` tag with a small amount of text in the body. For example: 8 | 9 | ```html 10 |
First paragraph
11 |Second paragraph
12 | ``` 13 | 14 | This is what they look like in the browser: 15 | 16 |First paragraph
18 |Second paragraph
19 |`, dentro de la cual se coloca una pequeña parte del texto. Por ejemplo: 8 | 9 | ```html 10 |
Primer párrafo
11 |Segundo párrafo
12 | ``` 13 | 14 | Así es como se ven en el navegador: 15 | 16 |Primer párrafo
18 |Segundo párrafo
19 |Hello, World
-------------------------------------------------------------------------------- /modules/20-hypertext/10-paragraph/ru/EXERCISE.md: -------------------------------------------------------------------------------- 1 | Оберните фразу _Hello, World_ в тег параграфа 2 | -------------------------------------------------------------------------------- /modules/20-hypertext/10-paragraph/ru/README.md: -------------------------------------------------------------------------------- 1 | Параграфы – основной способ разделять большой текст на небольшие логические блоки. Эти блоки автоматически «отбиваются» друг от друга отступами. Такой текст намного проще читается и не пугает пользователей. 2 | 3 | Параграфы, в основном, встречаются внутри большого текста. Например, любой урок на Хекслете или Code Basics разбит на параграфы для удобства чтения, прямо как в этом уроке. 4 | 5 | Разбитие идёт по небольшим смысловым блокам. Так не только комфортнее читать, но и можно быстрее найти нужную информацию в большом тексте. 6 | 7 | Параграфы создаются с помощью парного тега ``, в тело которого помещается небольшая часть текста. Например: 8 | 9 | ```html 10 |
Первый параграф
11 |Второй параграф
12 | ``` 13 | 14 | Вот как они выглядят в браузере: 15 | 16 |Первый параграф
18 |Второй параграф
19 |`).
8 |
--------------------------------------------------------------------------------
/modules/20-hypertext/20-text-style/es/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Estilo del Texto
3 | definitions:
4 | - name: Semántica
5 | description: >-
6 | Significado. En el contexto de HTML, la elección semántica de la marca
7 | para un fragmento de información.
8 | tips:
9 | - >-
10 | Las etiquetas para resaltar visualmente son más cortas que las de resaltado
11 | semántico. Esto puede ayudar a recordar cuándo usar `` y `` versus
12 | `` y ``.
13 | - En la práctica, se prefiere usar estilos CSS en lugar de `` y ``.
14 |
--------------------------------------------------------------------------------
/modules/20-hypertext/20-text-style/index.html:
--------------------------------------------------------------------------------
1 | Hexlet — hands-on programming courses As the saying says, you are now far. Вы ушли, как говорится, в мир в иной. Este es un ejemplo de código `.
21 |
22 | Es importante tener en cuenta que todas las etiquetas dentro de ` You can see the markup here ` tag.
18 |
19 | It's important that all tags inside ` Este es un ejemplo de código `.
17 |
18 | Es importante tener en cuenta que todas las etiquetas dentro de ` Здесь видно разметку `.
18 |
19 | Важно, что все теги внутри `Code Basics
2 | Coding lessons
3 |
--------------------------------------------------------------------------------
/modules/20-hypertext/25-hypertext-header/ru/EXERCISE.md:
--------------------------------------------------------------------------------
1 | Добавьте в редакторе заголовок первого и второго уровня с произвольным текстом
2 |
--------------------------------------------------------------------------------
/modules/20-hypertext/25-hypertext-header/ru/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Заголовки
3 | tips:
4 | - Соблюдайте последовательность заголовков. Не перескакивайте уровни
5 | - На странице, обычно, находится только один заголовок первого уровня
6 |
--------------------------------------------------------------------------------
/modules/20-hypertext/25-hypertext-header/test.js:
--------------------------------------------------------------------------------
1 | const { test } = require('tests');
2 |
3 | test(({ query, expect }) => {
4 | const h1 = query(document, 'h1');
5 | expect(h1).to.be.visible;
6 |
7 | const h2 = query(document, 'h2');
8 | expect(h2).to.be.visible;
9 | });
10 |
--------------------------------------------------------------------------------
/modules/20-hypertext/30-lists/Makefile:
--------------------------------------------------------------------------------
1 | test:
2 | node test.js 2>&1
3 |
--------------------------------------------------------------------------------
/modules/20-hypertext/30-lists/en/EXERCISE.md:
--------------------------------------------------------------------------------
1 | Create a numbered list of 5 items
2 |
--------------------------------------------------------------------------------
/modules/20-hypertext/30-lists/en/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Lists
3 |
--------------------------------------------------------------------------------
/modules/20-hypertext/30-lists/es/EXERCISE.md:
--------------------------------------------------------------------------------
1 | Crea una lista numerada con 5 elementos.
2 |
--------------------------------------------------------------------------------
/modules/20-hypertext/30-lists/es/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Listas
3 |
--------------------------------------------------------------------------------
/modules/20-hypertext/30-lists/index.html:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/modules/20-hypertext/30-lists/ru/EXERCISE.md:
--------------------------------------------------------------------------------
1 | Создайте нумерованный список из 5 элементов
2 |
--------------------------------------------------------------------------------
/modules/20-hypertext/30-lists/ru/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Списки
3 |
--------------------------------------------------------------------------------
/modules/20-hypertext/30-lists/test.js:
--------------------------------------------------------------------------------
1 | const { test } = require('tests');
2 |
3 | test(({ query, querySelectorAll, expect }) => {
4 | query(document, 'ol', HTMLOListElement);
5 | const elements = querySelectorAll(document, 'ol > li', HTMLLIElement);
6 | expect(elements).to.have.length(5);
7 | });
8 |
--------------------------------------------------------------------------------
/modules/20-hypertext/40-nested-lists/Makefile:
--------------------------------------------------------------------------------
1 | test:
2 | node test.js 2>&1
3 |
--------------------------------------------------------------------------------
/modules/20-hypertext/40-nested-lists/en/EXERCISE.md:
--------------------------------------------------------------------------------
1 | Create the markup for the list:
2 |
3 |
5 |
13 |
7 |
10 |
8 |
16 |
10 |
13 |
22 |
30 | ```
31 |
32 | It is important to note that the nested list is part of the list item and is inside the `
24 |
27 |
37 |
40 |
5 |
13 |
7 |
10 |
8 |
16 |
10 |
13 |
22 |
30 | ```
31 |
32 | Es importante destacar que la lista anidada es parte del elemento de la lista y se encuentra dentro de la etiqueta `
24 |
27 |
37 |
40 |
2 |
10 |
--------------------------------------------------------------------------------
/modules/20-hypertext/40-nested-lists/ru/EXERCISE.md:
--------------------------------------------------------------------------------
1 | Создайте разметку для списка:
2 |
3 |
4 |
7 |
5 |
13 |
7 |
10 |
8 |
16 |
10 |
13 |
22 |
30 | ```
31 |
32 | Важно отметить, что вложенный список является частью пункта списка и находится внутри тега `
24 |
27 |
37 |
40 | `).
8 | - >-
9 | Los navegadores automáticamente agregan la etiqueta `` si está
10 | ausente. En tablas pequeñas, puedes omitir su uso.
11 |
--------------------------------------------------------------------------------
/modules/20-hypertext/50-table/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
--------------------------------------------------------------------------------
/modules/20-hypertext/50-table/ru/EXERCISE.md:
--------------------------------------------------------------------------------
1 | Создайте таблицу из 3 строк с 2 ячейками в каждой. Первая строка содержит в себе шапку таблицы
2 |
--------------------------------------------------------------------------------
/modules/20-hypertext/50-table/ru/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Таблицы
3 | tips:
4 | - Количество ячеек в каждой строке таблицы должно быть одинаковым
5 | - >-
6 | Заголовок таблицы `caption` _всегда_ располагается сразу после открытия
7 | таблицы
8 | - >-
9 | Браузеры автоматически добавляют тег ``, если он отсутствует. В
10 | небольших таблицах его можно не указывать
11 |
--------------------------------------------------------------------------------
/modules/20-hypertext/50-table/test.js:
--------------------------------------------------------------------------------
1 | const { test } = require('tests');
2 |
3 | test(({ querySelectorAll, query, expect }) => {
4 | query(document, 'table > thead', HTMLTableHeaderCellElement);
5 | const ths = querySelectorAll(document, 'table > thead > tr > th', HTMLElement);
6 | expect(ths).to.have.length(2);
7 |
8 | const trs = querySelectorAll(document, 'table > tbody > tr', HTMLElement);
9 | expect(trs).to.have.length(2);
10 |
11 | const tds = querySelectorAll(document, 'table > tbody > tr > td', HTMLElement);
12 | expect(tds).to.have.length(4);
13 | });
14 |
--------------------------------------------------------------------------------
/modules/20-hypertext/60-colspan-rowspan/Makefile:
--------------------------------------------------------------------------------
1 | test:
2 | node test.js 2>&1
3 |
--------------------------------------------------------------------------------
/modules/20-hypertext/60-colspan-rowspan/en/EXERCISE.md:
--------------------------------------------------------------------------------
1 |
2 | Create a table with two rows and three columns. In the second row, combine the first two cells using the attributes you learned about. The first row should be the header of the table
3 |
--------------------------------------------------------------------------------
/modules/20-hypertext/60-colspan-rowspan/en/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Combining cells inside rows and columns
3 | tips:
4 | - >-
5 | The number of cells in each row of the table must be the same after merging.
6 | It's important to distinguish between the number of `
4 |
7 |
8 |
9 | Items
5 | Price
6 |
10 |
13 | Apple
11 | 1 dollar
12 |
14 |
17 |
18 | Pears
15 | 1.3 dollars
16 | ` tags and the
7 | total number of cells. For example, using the `colspan="2"` attribute on a
8 | cell you will get two cells but visually combined in one. For this reason,
9 | it's necessary to remove one physical cell from the markup to compensate
10 | - >-
11 | If the `colspan` attribute is used, then the cells in the same line will be
12 | removed from the HTML code. If the `rowspan` attribute is used, the cells in
13 | the rows below are deleted
14 |
--------------------------------------------------------------------------------
/modules/20-hypertext/60-colspan-rowspan/es/EXERCISE.md:
--------------------------------------------------------------------------------
1 | Crea una tabla con dos filas y tres columnas. En la segunda fila, une las dos primeras celdas utilizando atributos. La primera fila debe ser el encabezado de la tabla.
2 |
--------------------------------------------------------------------------------
/modules/20-hypertext/60-colspan-rowspan/es/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Unir celdas dentro de filas y columnas
3 | tips:
4 | - >-
5 | El número de celdas en cada fila de la tabla debe ser el mismo después de la
6 | unión. Es importante distinguir entre el número de etiquetas ` ` y el
7 | número total de celdas. Por ejemplo, al usar el atributo `colspan="2"`,
8 | obtendrás dos celdas lógicas, pero estarán unidas. Por esta razón, es
9 | necesario eliminar una celda física de la marcación para compensar.
10 | - >-
11 | Si se utiliza el atributo `colspan`, se deben eliminar las celdas en la
12 | misma fila del HTML. Si se utiliza el atributo `rowspan`, se deben eliminar
13 | las celdas en las filas inferiores.
14 |
--------------------------------------------------------------------------------
/modules/20-hypertext/60-colspan-rowspan/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
16 |
--------------------------------------------------------------------------------
/modules/20-hypertext/60-colspan-rowspan/ru/EXERCISE.md:
--------------------------------------------------------------------------------
1 | Создайте таблицу, состоящую из двух строк и трёх столбцов. Во второй строке объедините первые две ячейки, используя атрибуты. Первая строка должна быть шапкой таблицы
2 |
--------------------------------------------------------------------------------
/modules/20-hypertext/60-colspan-rowspan/ru/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Объединение ячеек внутри строк и столбцов
3 | tips:
4 | - >-
5 | Количество ячеек в каждой строке таблицы должно быть одинаковым после
6 | объединения. Важно различать количество тегов `
4 |
8 |
9 |
10 | 2 rows added
5 | 3 columns added
6 | 2 columns in second row combined
7 |
11 |
14 |
15 | Result
12 | Exercise completed
13 | ` и общее количество
7 | ячеек. Например, использовав на ячейке атрибут `colspan="2"` вы получите две
8 | логические ячейки, только они будут объединены. По этой причине необходимо
9 | убрать одну физическую ячейку из разметки для компенсации
10 | - >-
11 | Если используется атрибут `colspan`, то из HTML нужно удалить ячейки в той
12 | же строке. Если используется атрибут `rowspan`, то удаляются ячейки в
13 | строках ниже
14 |
--------------------------------------------------------------------------------
/modules/20-hypertext/60-colspan-rowspan/test.js:
--------------------------------------------------------------------------------
1 | const { test } = require('tests');
2 |
3 | test(({ querySelectorAll, query, expect }) => {
4 | const trs = querySelectorAll(document, 'table > tbody > tr', HTMLElement);
5 | expect(trs).to.have.length(1);
6 |
7 | const trHead = querySelectorAll(document, 'table > thead > tr');
8 | expect(trHead).to.have.length(1);
9 |
10 | const tds = querySelectorAll(document, 'table > tbody > tr > td', HTMLElement);
11 | expect(tds).to.have.length(2);
12 |
13 | const tdWithColspan = query(document, 'table > tbody > tr > td:nth-child(1)', HTMLElement);
14 | expect(tdWithColspan).to.have.attribute('colspan', '2');
15 | });
16 |
--------------------------------------------------------------------------------
/modules/20-hypertext/70-special-characters/Makefile:
--------------------------------------------------------------------------------
1 | test:
2 | node test.js 2>&1
3 |
--------------------------------------------------------------------------------
/modules/20-hypertext/70-special-characters/en/EXERCISE.md:
--------------------------------------------------------------------------------
1 | Write the "one-fourth" fraction symbol. You can find the alias of this symbol on [Wikipedia](https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references)
2 |
--------------------------------------------------------------------------------
/modules/20-hypertext/70-special-characters/en/README.md:
--------------------------------------------------------------------------------
1 | There are special characters you can use in your text called mnemonic aliases. They allow you to use characters that are present in the symbol table but are not on the keyboard, such as math symbols or Greek:
2 |
3 | ` tag and paste it into the editor. Try different versions of the texts.
2 |
--------------------------------------------------------------------------------
/modules/20-hypertext/90-pre/en/README.md:
--------------------------------------------------------------------------------
1 |
2 | Sometimes you need to insert text while retaining its original formatting. Let's take a look at Mayakovsky's famous "ladder" from the poem "To Sergei Yesenin.
3 |
4 |
6 | As the saying says,
7 | you are
8 | now far.
9 | Void and stars,
10 | a stodgy kind
11 | passover.
12 | Not a payday,
13 | not a whiskey bar.
14 | Sober.
15 |
16 | `, whose task is to display the text within itself while saving all the space characters. By default, the `
` tag outputs text in a monospaced font in which all characters have the same width, unlike regular fonts.
29 |
30 | ```html
31 |
32 | As the saying says,
33 | you are
34 | now far.
35 | Void and stars,
36 | a stodgy kind
37 | passover.
38 | Not a payday,
39 | not a whiskey bar.
40 | Sober.
41 |
42 | ```
43 |
44 | Inside the `pre` tag, you can use tags to format the text: ``, ``, ``, ``.
45 |
--------------------------------------------------------------------------------
/modules/20-hypertext/90-pre/en/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Formatted text
3 |
--------------------------------------------------------------------------------
/modules/20-hypertext/90-pre/es/EXERCISE.md:
--------------------------------------------------------------------------------
1 | Agrega cualquier texto dentro de la etiqueta `` y colócalo en el editor. Prueba diferentes variantes de texto.
2 |
--------------------------------------------------------------------------------
/modules/20-hypertext/90-pre/es/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Texto con formato
3 |
--------------------------------------------------------------------------------
/modules/20-hypertext/90-pre/index.html:
--------------------------------------------------------------------------------
1 |
2 | As the saying says,
3 | you are
4 | now far.
5 | Void and stars,
6 | a stodgy kind
7 | passover.
8 | Not a payday,
9 | not a whiskey bar.
10 | Sober.
11 |
12 |
--------------------------------------------------------------------------------
/modules/20-hypertext/90-pre/ru/EXERCISE.md:
--------------------------------------------------------------------------------
1 | Добавьте любой текст в тег `` и вставьте его в редактор. Попробуйте различные варианты текстов.
2 |
--------------------------------------------------------------------------------
/modules/20-hypertext/90-pre/ru/README.md:
--------------------------------------------------------------------------------
1 |
2 | Иногда возникает потребность вставить текст, сохраняя его оригинальное форматирование. Взглянем на знаменитую «лесенку Маяковского» из стихотворения «Сергею Есенину».
3 |
4 |
6 | Вы ушли,
7 | как говорится,
8 | в мир в иной.
9 | Пустота...
10 | Летите,
11 | в звезды врезываясь.
12 | Ни тебе аванса,
13 | ни пивной.
14 | Трезвость.
15 |
16 | `, задача которого — вывести текст внутри себя с сохранением всех пробельных символов. По умолчанию тег `
` выводит текст моноширинным шрифтом, в котором все символы имеют одинаковую ширину, в отличие от обычных шрифтов.
30 |
31 | ```html
32 |
33 | Вы ушли,
34 | как говорится,
35 | в мир в иной.
36 | Пустота...
37 | Летите,
38 | в звезды врезываясь.
39 | Ни тебе аванса,
40 | ни пивной.
41 | Трезвость.
42 |
43 | ```
44 |
45 | Внутри тега `pre` можно использовать теги для оформления текста: ``, ``, ``, ``.
46 |
--------------------------------------------------------------------------------
/modules/20-hypertext/90-pre/ru/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Форматированный текст
3 |
--------------------------------------------------------------------------------
/modules/20-hypertext/90-pre/test.js:
--------------------------------------------------------------------------------
1 | const { test } = require('tests');
2 |
3 | test(({ query, expect }) => {
4 |
5 | const pre = query(document, 'pre');
6 | expect(pre).to.be.visible;
7 |
8 | });
9 |
--------------------------------------------------------------------------------
/modules/20-hypertext/95-code/Makefile:
--------------------------------------------------------------------------------
1 | test:
2 | node test.js 2>&1
3 |
--------------------------------------------------------------------------------
/modules/20-hypertext/95-code/description.es.yml:
--------------------------------------------------------------------------------
1 | ---
2 |
3 | name: Inserción de Código de Computadora en HTML
4 | theory: |
5 | Al escribir blogs educativos sobre programación o artículos, a menudo es necesario mostrar fragmentos de código. En cada lección de Code Basics, hay bloques de código similares a este:
6 |
7 | ```html
8 | `, dentro de la cual se coloca el código en cualquier lenguaje de programación.
12 |
13 | ```javascript
14 | // Ejemplo de código en JavaScript
15 | const square = (num) => {
16 | return num * num;
17 | };
18 | ```
19 |
20 | A menudo se utiliza la etiqueta `
` junto con la etiqueta `
` para preservar el formato. Si no se utiliza la etiqueta `
`, es necesario controlar los saltos de línea manualmente, por ejemplo, envolviendo cada línea con la etiqueta `
` serán interpretadas por el navegador, por lo que se utilizan caracteres especiales dentro de él. Otra solución común es envolver el nombre de la etiqueta con una etiqueta adicional, como ``:
23 |
24 | ```html
25 |
26 | <p>Insertamos la etiqueta p como texto plano </p>
27 |
28 | ```
29 |
30 | instructions: |
31 | Agrega cualquier texto dentro de la etiqueta `` y colócalo en el editor. Prueba diferentes variantes de texto.
32 |
--------------------------------------------------------------------------------
/modules/20-hypertext/95-code/en/EXERCISE.md:
--------------------------------------------------------------------------------
1 | Add any text to the `
` tag and paste it into the editor. Try different versions of the texts
2 |
--------------------------------------------------------------------------------
/modules/20-hypertext/95-code/en/README.md:
--------------------------------------------------------------------------------
1 |
2 | If you have a programming tutorial blog or write articles, then you'll need to demonstrate your code. Every lesson on Code Basics has these blocks:
3 |
4 | ```html
5 |
`, and you can write code in any language there.
9 |
10 | ```javascript
11 | // Example code in JavaScript
12 | const square = (num) => {
13 | return num * num;
14 | };
15 | ```
16 |
17 | The `
` tag is often used with the `
` tag to preserve formatting. If the `
` tag is not used, you have to control line breaks yourself, for example by wrapping each line with a `
` are be processed by the browser, which is why special characters are used inside. Also, a common solution is to wrap the name of the tag in a separate tag, such as ``:
20 |
21 | ```html
22 |
23 | <p>Insert the p tag as plain text </p>
24 |
25 | ```
26 |
--------------------------------------------------------------------------------
/modules/20-hypertext/95-code/en/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Inserting computer code into HTML
3 |
--------------------------------------------------------------------------------
/modules/20-hypertext/95-code/es/EXERCISE.md:
--------------------------------------------------------------------------------
1 | Agrega cualquier texto dentro de la etiqueta `` y colócalo en el editor. Prueba diferentes variantes de texto.
2 |
--------------------------------------------------------------------------------
/modules/20-hypertext/95-code/es/README.md:
--------------------------------------------------------------------------------
1 | Al escribir blogs educativos sobre programación o artículos, a menudo es necesario mostrar fragmentos de código. En cada lección de Code Basics, hay bloques de código similares a este:
2 |
3 | ```html
4 |
`, dentro de la cual se coloca el código en cualquier lenguaje de programación.
8 |
9 | ```javascript
10 | // Ejemplo de código en JavaScript
11 | const square = (num) => {
12 | return num * num;
13 | };
14 | ```
15 |
16 | A menudo se utiliza la etiqueta `
` junto con la etiqueta `
` para preservar el formato. Si no se utiliza la etiqueta `
`, es necesario controlar los saltos de línea manualmente, por ejemplo, envolviendo cada línea con la etiqueta `
` serán interpretadas por el navegador, por lo que se utilizan caracteres especiales dentro de él. Otra solución común es envolver el nombre de la etiqueta con una etiqueta adicional, como ``:
19 |
20 | ```html
21 |
22 | <p>Insertamos la etiqueta p como texto plano </p>
23 |
24 | ```
25 |
--------------------------------------------------------------------------------
/modules/20-hypertext/95-code/es/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Inserción de Código de Computadora en HTML
3 |
--------------------------------------------------------------------------------
/modules/20-hypertext/95-code/index.html:
--------------------------------------------------------------------------------
1 |
2 | const a = 5;
3 |
4 |
--------------------------------------------------------------------------------
/modules/20-hypertext/95-code/ru/EXERCISE.md:
--------------------------------------------------------------------------------
1 | Добавьте любой текст в тег `` и вставьте его в редактор. Попробуйте различные варианты текстов
2 |
--------------------------------------------------------------------------------
/modules/20-hypertext/95-code/ru/README.md:
--------------------------------------------------------------------------------
1 |
2 | При ведении учебных блогов по программированию, либо при написании статей, возникает необходимость продемонстрировать код. В каждом уроке на Code Basics есть такие блоки:
3 |
4 | ```html
5 |
`, внутри которого записывается код на любом языке программирования.
9 |
10 | ```javascript
11 | // Пример кода на JavaScript
12 | const square = (num) => {
13 | return num * num;
14 | };
15 | ```
16 |
17 | Тег `
` часто используют вместе с тегом `
`, что позволяет сохранить форматирование. Если тег `
` не используется, то переносы строк нужно контролировать самостоятельно, например, оборачивая каждую строку в тег `
` будут обработаны браузером, по этой причине внутри используются специальные символы. Также частое решение — оборачивание названия тега в отдельный тег, например ``:
20 |
21 | ```html
22 |
23 | <p>Вставляем тег p в виде простого текста </p>
24 |
25 | ```
26 |
--------------------------------------------------------------------------------
/modules/20-hypertext/95-code/ru/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Вставка компьютерного кода в HTML
3 |
--------------------------------------------------------------------------------
/modules/20-hypertext/95-code/test.js:
--------------------------------------------------------------------------------
1 | const { test } = require('tests');
2 |
3 | test(({ query, expect }) => {
4 |
5 | const code = query(document, 'code');
6 | expect(code).to.be.visible;
7 |
8 | });
9 |
--------------------------------------------------------------------------------
/modules/20-hypertext/description.en.yml:
--------------------------------------------------------------------------------
1 | ---
2 |
3 | name: Text in HTML
4 | description: |
5 | HTML provides dozens of rules for working with text, from creating blocks of text, to complex tables and nested lists. Marking up text properly is a core skill when building a web site.
6 |
--------------------------------------------------------------------------------
/modules/20-hypertext/description.es.yml:
--------------------------------------------------------------------------------
1 | ---
2 |
3 | name: Texto en HTML
4 | description: |
5 | HTML proporciona docenas de reglas para trabajar con texto: desde la creación de bloques de texto hasta tablas complejas y listas anidadas. El marcado correcto del texto es una de las habilidades clave al trabajar con un sitio web.
6 |
--------------------------------------------------------------------------------
/modules/20-hypertext/description.ru.yml:
--------------------------------------------------------------------------------
1 | ---
2 |
3 | name: Текст в HTML
4 | description: |
5 | HTML предоставляет десятки правил для работы с текстом: от создания блока текста, до сложных таблиц и вложенных списков. Корректная разметка текста — один из ключевых навыков при работе с сайтом.
6 |
--------------------------------------------------------------------------------
/modules/30-media/10-img/Makefile:
--------------------------------------------------------------------------------
1 | test:
2 | node test.js 2>&1
3 |
--------------------------------------------------------------------------------
/modules/30-media/10-img/en/EXERCISE.md:
--------------------------------------------------------------------------------
1 |
2 | Paste the image from https://www.w3.org/2008/site/images/logo-w3c-screen-lg.png into the editor with alt text "W3C" for when the image is not available
3 |
--------------------------------------------------------------------------------
/modules/30-media/10-img/en/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Images
3 |
--------------------------------------------------------------------------------
/modules/30-media/10-img/es/EXERCISE.md:
--------------------------------------------------------------------------------
1 | Inserta la imagen en el editor desde la dirección https://www.w3.org/2008/site/images/logo-w3c-screen-lg.png y el texto **W3C** para los casos en que la imagen no esté disponible.
2 |
--------------------------------------------------------------------------------
/modules/30-media/10-img/es/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Imágenes
3 |
--------------------------------------------------------------------------------
/modules/30-media/10-img/index.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/modules/30-media/10-img/ru/EXERCISE.md:
--------------------------------------------------------------------------------
1 | Вставьте в редактор картинку по адресу https://www.w3.org/2008/site/images/logo-w3c-screen-lg.png и текстом **W3C** для случаев, если картинка недоступна
2 |
--------------------------------------------------------------------------------
/modules/30-media/10-img/ru/data.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Изображения
3 |
--------------------------------------------------------------------------------
/modules/30-media/10-img/test.js:
--------------------------------------------------------------------------------
1 | const { test } = require('tests');
2 |
3 | test(({ query, expect }) => {
4 | const element = query(document, 'img');
5 | expect(element).to.have.attr('src', 'https://www.w3.org/2008/site/images/logo-w3c-screen-lg.png');
6 | expect(element).to.have.attr('alt', 'W3C');
7 | });
8 |
--------------------------------------------------------------------------------
/modules/30-media/20-audio/Makefile:
--------------------------------------------------------------------------------
1 | test:
2 | node test.js 2>&1
3 |
--------------------------------------------------------------------------------
/modules/30-media/20-audio/description.es.yml:
--------------------------------------------------------------------------------
1 | ---
2 |
3 | name: Audio
4 | theory: |
5 |
6 | Anteriormente, para agregar audio a una página HTML, era necesario utilizar "extensiones" especiales que permitían incrustar un reproductor de audio en la página. A partir del estándar HTML5, esta funcionalidad está disponible de forma predeterminada. Se implementa mediante la etiqueta `