m18ru / postcss-text-remove-gap

Remove space before and after text strings, added by line-height and extra space in glyph itself.
MIT License
31 stars 0 forks source link

postcss-text-remove-gap

PostCSS plugin to remove space before and after text strings, added by line-height and extra space in glyph itself.

New CSS property:

text-remove-gap: outside? <type> <line-height>? <font-family>?;

Example

Illustration:

Before:
Block with red border and two paragraphs inside. There is some space before 
and after paragraph of text.

After:
Block with red border and two paragraphs inside. There is no space before 
and after paragraph of text.

Input:

p
{
    font: 16px/1.5 "Arial", sans-serif;
    text-remove-gap: both;
}

Output:

p
{
    font: 16px/1.5 "Arial", sans-serif;
}
p::before
{
    display: table;
    content: "";
    margin-bottom: -0.63em;
}
p::after
{
    display: table;
    content: "";
    margin-top: -0.67em;
}

Input:

p
{
    font-family: "Arial", sans-serif;
    line-height: 1.5;
    text-remove-gap: outside both;
}

Output:

p
{
    font-family: "Arial", sans-serif;
    line-height: 1.5;
    margin-top: -0.63em;
    margin-bottom: -0.67em;
}

You can find more examples in test.js.

Install

npm install --save-dev postcss-text-remove-gap

Usage

With Gulp:

var gulp = require( 'gulp' );
var postcss = require( 'gulp-postcss' );
var textRemoveGap = require( 'postcss-text-remove-gap' );

gulp.task(
    'styles',
    function ()
    {
        var textRemoveGapOptions = {
            prefix: 'm18',
            fonts: {
                'My Font': [0.1, 0.2],
                'My Other Font': [0.12, 0.14]
            },
            defaultFontFamily: 'My Font'
        };

        gulp.src( './styles/src/**/*.css' )
            .pipe( postcss( [textRemoveGap( textRemoveGapOptions )] ) )
            .pipe( gulp.dest( './styles/' ) );
    }
);

Input (file styles/src/test.css):

p
{
    font: 16px/1.5 "Arial", sans-serif;
    -m18-text-remove-gap: both;
}

div.other p
{
    font-family: "Arial", sans-serif;
    line-height: 1.5;
    -m18-text-remove-gap: outside both;
}

li
{
    line-height: 2;
    -m18-text-remove-gap: both;
}

blockquote
{
    font-family: "My Other Font", sans-serif;
    line-height: 2;
    -m18-text-remove-gap: both;
}

Output (file styles/test.css):

p
{
    font: 16px/1.5 "Arial", sans-serif;
}

p::before
{
    display: table;
    content: "";
    margin-bottom: -0.38em;
}

p::after
{
    display: table;
    content: "";
    margin-top: -0.42em;
}

div.other p
{
    font-family: "Arial", sans-serif;
    line-height: 1.5;
    margin-top: -0.38em;
    margin-bottom: -0.42em;
}

li
{
    line-height: 2;
}

li::before
{
    display: table;
    content: "";
    margin-bottom: -0.6em;
}

li::after
{
    display: table;
    content: "";
    margin-top: -0.7em;
}

blockquote
{
    font-family: "My Other Font", sans-serif;
    line-height: 2;
}

blockquote::before
{
    display: table;
    content: "";
    margin-bottom: -0.62em;
}

blockquote::after
{
    display: table;
    content: "";
    margin-top: -0.64em;
}

Options

prefix

Type: string
Default: '' (empty, no prefix)

Adds the prefix surrounded by dashes before the property name.

fonts

Type: object
Default: {}

Object with spaces for custom fonts.

{
    "Font Name": [spaceBefore, spaceAfter]
}

Values spaceBefore and spaceAfter are numbers 0..1 representing the ratio of the space before and after text to the font size (percentages/100%).

The best way to calculate this values is to create block with background color and required font. Set line-height to 1 and font-size to 100px. Write “E” character or other simular to easily find top and bottom boundary of it. Measure the distance from the block boundary to the character.

For example:

div
{
    font: 100px/1 "Open Sans", sans-serif;
    background: gray;
}
<div>E<div>

Space above “E” is 17px → spaceBefore = 0.17, space below “E” is 11px → 
spaceAfter = 0.11

Plugin has build-in database with fonts metrics in file fonts.json.
You can contribute new common fonts with pull request, or just use your own collection with this option.

defaultFontFamily

Type: string | string[]
Default: 'serif'

Font to use when no other font specified. Used when CSS block has no font-family, font, or font-family value of plugin property specified.

defaultLineHeight

Type: number
Default: 1

Line-height to use when no other line-height specified. Used when CSS block has no line-height, font with line-height, or line-height value of plugin property specified.