Less.js: рдХрдо.рд░реЗрдВрдбрд░ @import рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдиреЛрдбрдЬ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╣реИрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 17 рджрд┐рд╕ре░ 2014  ┬╖  2рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: less/less.js

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдереАрдорд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╕реАрдПрд╕рдПрд╕ рдореЗрдВ рдХрдо рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЛрдбрдЬ рдХрдо рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореИрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрдо рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рдХреЗрд╡рд▓ рдЙрд╕ рд╕реАрдПрд╕рдПрд╕ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдореИрдВ рдЕрдкрдиреЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╖рдпреЛрдВ рдореЗрдВ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдЪрд░ рдФрд░ рдорд┐рд╢реНрд░рдгреЛрдВ рдХреЛ рднреА рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП, рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рдереАрдо рдЪрд░ рдФрд░ рдорд┐рд╢реНрд░рдгреЛрдВ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рддреЛ, рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдЪрд░/рдорд┐рд╢реНрд░рдг рдФрд░ рд╕реАрдПрд╕рдПрд╕ рдирд┐рдпрдореЛрдВ рдореЗрдВ рдЕрдВрддрд░ рдХрд░реЗрдВ рдореИрдВрдиреЗ 2 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдИ рд╣реИрдВ,

  • application_variables.less - рдЗрд╕рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдЪрд░ рдФрд░ рдорд┐рд╢реНрд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВ
  • application.less - рдЗрд╕рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╕реАрдПрд╕рдПрд╕ рдирд┐рдпрдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВ

рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП

|--sample_application
    |--resources
    |   |--libraries
    |      |--bootstrap
    |           |--css
    |           |   |--application.less
    |           |--less
    |           |   |--application_variables.less    
    |--themes
        |--red
        |   |--mixins
        |   |   |--mixins.less
        |   |--variables
        |   |   |--variables.less    
        |   |--red.less    
        |--blue
        |   |--mixins
        |   |   |--mixins.less
        |   |--variables
        |   |   |--variables.less    
        |   |--blue.less    
        |--themes.less

рдХрд┐рд╕ рдлрд╛рдЗрд▓ рдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдореЗрдВ рдХреНрдпрд╛ рд╣реИ?

1. /sample_application/themes/<-theme_name->/mixins/mixins.less
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд┐рдХреНрд╕рд┐рди рдФрд░ рдУрд╡рд░рд░рд╛рдЗрдб рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдорд┐рдХреНрд╕рд┐рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

.my-hover-mixin(@color) {
   &:hover {
       border: 2px solid @color;
    }
}
/*Other theme specific mixins*/

2. /sample_application/themes/<-theme_name->/variables/variables.less
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд░ рдФрд░ рдУрд╡рд░рд░рд╛рдЗрдб рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдЪрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

@text-color:#333333;
@border-color:#999999;
@body-bg-color:red;
/*Other theme specific variables*/

3. /sample_application/themes/<-theme_name->/<-theme_name->.less
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рдорд┐рд╢реНрд░рдг рдФрд░ рдЪрд░ рдХреЗ рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

<strong i="10">@import</strong> "./variables/variables.less";
<strong i="11">@import</strong> "./mixins/mixins.less";

4. /sample_application/themes/theme.less
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджреЛ рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рд╣реИрдВред рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдЬреЛ application_variables.less рд╣реИ рдФрд░ рджреВрд╕рд░рд╛ рд╡рд┐рд╢реЗрд╖ рдереАрдо рдХреЗ рдЖрдзрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред рд▓рд╛рд▓.рд░рд╣рд┐рдд/рдиреАрд▓рд╛.рд╡рд┐рд╣реАрди

<strong i="17">@import</strong> "application_variables.less";
<strong i="18">@import</strong> "red/red.less";

5. /sample_application/resources/рдкреБрд╕реНрддрдХрд╛рд▓рдп/рдмреВрдЯрд╕реНрдЯреНрд░реИрдк/рд╕реАрдПрд╕рдПрд╕/application.less
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рд╣реИ рдЬреЛ /themes/themes.less рд╣реИ рдФрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк CSS рдирд┐рдпрдо рд╣реИрдВред

<strong i="24">@import</strong> "theme.less";
/*Bootstrap CSS rules*/

6. /sample_application/resources/рдкреБрд╕реНрддрдХрд╛рд▓рдп/рдмреВрдЯрд╕реНрдЯреНрд░реИрдк/рдХрдо/application_variables.less
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдЪрд░ рдФрд░ рдорд┐рд╢реНрд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

/*Bootstrap variables and mixins*/

рдЕрдм рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдиреЛрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬреЛ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрдо рд╕рдВрдХрд▓рди рдХреЛ рдЦреБрд░рд╛рдХ рджреЗрддреА рд╣реИ рдЬреЛ рдХрд┐ рд╕рдВрдХрд▓рди-рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╣реИредjs

var fs = require("fs");
var less = require('less');

(function() {
    var bsLessContent = fs.readFileSync("sample_application/resources/libraries/bootstrap/css/application.less");
    less.render(bsLessContent.toString(), {
        paths : [ "sample_application/themes/", "sample_application/resources/libraries/bootstrap/less/"],
        compress : true
    }, function(e, output) {
        fs.writeFileSync("sample_application/resources/libraries/bootstrap/css/application.css", output);
    });
})();

рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ:

{ [Error: 'application_variables.less' wasn't found]
   type: 'File',
   message: '\'application_variables.less\' wasn\'t found',
   filename: 'sample_application\\themes\\theme.less',
   index: 18,
   line: 2,
   callLine: NaN,
   callExtract: undefined,
   column: 0,
   extract:
    [ '<strong i="6">@import</strong> "application_variables.less";',
      '<strong i="7">@import</strong> "red/red.less";' ] }

рддрдм рдореИрдВрдиреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрдереЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдпрд╣ рд╡рд╣реА рддреНрд░реБрдЯрд┐ рджреЗ рд░рд╣рд╛ рд╣реИ

{ [Error: './../resources/libraries/bootstrap/less/application_variables.less' wasn't found]
   type: 'File',
   message: '\'./../resources/libraries/bootstrap/less/application_variables.less\' wasn\'t found',
   filename: 'sample_application\\themes\\theme.less',
   index: 18,
   line: 2,
   callLine: NaN,
   callExtract: undefined,
   column: 0,
   extract:
    [ '<strong i="11">@import</strong> "./../resources/libraries/bootstrap/less/application_variables.less";',
      '<strong i="12">@import</strong> "red/red.less";' ] }

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЪреВрдВрдХрд┐ рд╕реНрд░реЛрдд рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рдХ рдХреЛ рдЖрдкреВрд░реНрддрд┐ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдкрде рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рдЖрдпрд╛рдд рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддрд╛ рдХрд┐ рдЖрдк рд╕рднреА рдкрде рдХреНрдпрд╛ рд╣реИрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИрдВ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ cwd рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдпрд╛рдд рдХреЗ рд╕рдордп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдпрд╛рджреГрдЪреНрдЫрд┐рдХ" рд╣реИ рдФрд░ рдпрд╣ рдЕрдм рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рдмрд┐рдВрджреБ рдирд╣реАрдВ рд╣реИ ...) рдЬреИрд╕реЗ:

var fs   = require('fs'),
    path = require('path'),
    less = require('less');

(function() {
    var src = "foo/bar/baz.less";
    less.render(fs.readFileSync(src).toString(), {
        filename: path.resolve(src), // <- here we go
    }, function(e, output) {
        console.log(output.css);
    });
})();

рд╡рд╣реА paths рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдВ рддреЛ рдЙрдиреНрд╣реЗрдВ filename рд╕рд╛рдкреЗрдХреНрд╖ рдпрд╛ рддреЛ рдкреВрд░реНрдг рдпрд╛ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдпрд╣ рд╕реАрдЦрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдХреИрд╕реЗ lessc рд╕реНрд╡рдпрдВ рдЗрди рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред

рд╕рднреА 2 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЪреВрдВрдХрд┐ рд╕реНрд░реЛрдд рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рдХ рдХреЛ рдЖрдкреВрд░реНрддрд┐ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдкрде рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рдЖрдпрд╛рдд рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддрд╛ рдХрд┐ рдЖрдк рд╕рднреА рдкрде рдХреНрдпрд╛ рд╣реИрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИрдВ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ cwd рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдпрд╛рдд рдХреЗ рд╕рдордп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдпрд╛рджреГрдЪреНрдЫрд┐рдХ" рд╣реИ рдФрд░ рдпрд╣ рдЕрдм рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рдмрд┐рдВрджреБ рдирд╣реАрдВ рд╣реИ ...) рдЬреИрд╕реЗ:

var fs   = require('fs'),
    path = require('path'),
    less = require('less');

(function() {
    var src = "foo/bar/baz.less";
    less.render(fs.readFileSync(src).toString(), {
        filename: path.resolve(src), // <- here we go
    }, function(e, output) {
        console.log(output.css);
    });
})();

рд╡рд╣реА paths рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдВ рддреЛ рдЙрдиреНрд╣реЗрдВ filename рд╕рд╛рдкреЗрдХреНрд╖ рдпрд╛ рддреЛ рдкреВрд░реНрдг рдпрд╛ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдпрд╣ рд╕реАрдЦрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдХреИрд╕реЗ lessc рд╕реНрд╡рдпрдВ рдЗрди рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред

рдзрдиреНрдпрд╡рд╛рдж рд╕рд╛рдд-рдЪрд░рдг-рдЕрдзрд┐рдХрддрдоред рдпрд╣ рд╕рдорд╛рдзрд╛рди рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░ рд░рд╣рд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

seven-phases-max picture seven-phases-max  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

joe223 picture joe223  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

xblakestone picture xblakestone  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dotnetwise picture dotnetwise  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

BrianMulhall picture BrianMulhall  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ