Skip to content
This repository has been archived by the owner on Jul 21, 2023. It is now read-only.

Commit

Permalink
Small fixes for css font urls (#90)
Browse files Browse the repository at this point in the history
* Added support for query and hash values in font urls

* Added two missing font file formats
  • Loading branch information
yannickl88 authored and nicoschoenmaker committed Jul 30, 2018
1 parent 3cd6869 commit 0056d3e
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 3 deletions.
78 changes: 78 additions & 0 deletions spec/steps/css_rewrite.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,4 +93,82 @@ describe("css_rewrite.js", function () {
expect(result.additionalFiles.length).toBe(0);
expect(result.content.toString()).toBe(content.toString());
});

it('execute with hash', function () {
let content = Buffer.from(
"@font-face {font-family: myFirstFont; src: url('sansation_light.svg#iconpicker');}"
);
let result = step(
new builder.File('foo.css', 'foo.css', content, 'foo.css'),
{paths: {out: '/foo/bar/', root: '/foo/'}}
);

expect(result.name).toBe('foo.css');
expect(result.module).toBe('foo.css');

expect(result.additionalFiles.length).toBe(1);
expect(result.additionalFiles[0].outputFile).toBe('/foo/bar/fonts/sansation_light.svg'.replace(/\//g, path.sep));
expect(result.additionalFiles[0].inputFiles.length).toBe(1);

expect(result.additionalFiles[0].inputFiles[0].path).toBe('/foo/sansation_light.svg'.replace(/\//g, path.sep));
expect(result.additionalFiles[0].inputFiles[0].extension).toBe('.svg');
expect(result.additionalFiles[0].inputFiles[0].needsRebuild).toBe(true);
expect(result.additionalFiles[0].inputFiles[0].skipFileSteps).toBe(false);

expect(result.content.toString()).toBe(
'@font-face {font-family: myFirstFont; src: url("fonts/sansation_light.svg#iconpicker");}'
);
});

it('execute with query', function () {
let content = Buffer.from(
"@font-face {font-family: myFirstFont; src: url('sansation_light.svg?90190138');}"
);
let result = step(
new builder.File('foo.css', 'foo.css', content, 'foo.css'),
{paths: {out: '/foo/bar/', root: '/foo/'}}
);

expect(result.name).toBe('foo.css');
expect(result.module).toBe('foo.css');

expect(result.additionalFiles.length).toBe(1);
expect(result.additionalFiles[0].outputFile).toBe('/foo/bar/fonts/sansation_light.svg'.replace(/\//g, path.sep));
expect(result.additionalFiles[0].inputFiles.length).toBe(1);

expect(result.additionalFiles[0].inputFiles[0].path).toBe('/foo/sansation_light.svg'.replace(/\//g, path.sep));
expect(result.additionalFiles[0].inputFiles[0].extension).toBe('.svg');
expect(result.additionalFiles[0].inputFiles[0].needsRebuild).toBe(true);
expect(result.additionalFiles[0].inputFiles[0].skipFileSteps).toBe(false);

expect(result.content.toString()).toBe(
'@font-face {font-family: myFirstFont; src: url("fonts/sansation_light.svg?90190138");}'
);
});

it('execute with hash and query', function () {
let content = Buffer.from(
"@font-face {font-family: myFirstFont; src: url('sansation_light.svg?90190138#iconpicker');}"
);
let result = step(
new builder.File('foo.css', 'foo.css', content, 'foo.css'),
{paths: {out: '/foo/bar/', root: '/foo/'}}
);

expect(result.name).toBe('foo.css');
expect(result.module).toBe('foo.css');

expect(result.additionalFiles.length).toBe(1);
expect(result.additionalFiles[0].outputFile).toBe('/foo/bar/fonts/sansation_light.svg'.replace(/\//g, path.sep));
expect(result.additionalFiles[0].inputFiles.length).toBe(1);

expect(result.additionalFiles[0].inputFiles[0].path).toBe('/foo/sansation_light.svg'.replace(/\//g, path.sep));
expect(result.additionalFiles[0].inputFiles[0].extension).toBe('.svg');
expect(result.additionalFiles[0].inputFiles[0].needsRebuild).toBe(true);
expect(result.additionalFiles[0].inputFiles[0].skipFileSteps).toBe(false);

expect(result.content.toString()).toBe(
'@font-face {font-family: myFirstFont; src: url("fonts/sansation_light.svg?90190138#iconpicker");}'
);
});
});
11 changes: 9 additions & 2 deletions src/Builder/js/steps/css_rewrite.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
let path = require('path');
let url = require('url');

module.exports = function (file, config) {
let content = file.content.toString().replace(/@font-face\s*{([^}]+)}/g, function (match, content) {
Expand All @@ -10,8 +11,11 @@ module.exports = function (file, config) {
return match;
}

let cssPath = path.join(config.paths.out, 'fonts', path.basename(originalFile));
let fontFile = path.normalize(path.join(config.paths.root, path.dirname(file.name), originalFile));
// strip away and store any query or hash stuff
let parsed = url.parse(originalFile);

let cssPath = path.join(config.paths.out, 'fonts', path.basename(parsed.pathname));
let fontFile = path.normalize(path.join(config.paths.root, path.dirname(file.name), parsed.pathname));

file.addAdditionalFile(cssPath, [fontFile]);

Expand All @@ -20,6 +24,9 @@ module.exports = function (file, config) {
// make sure to always use the '/' separator, since that is what CSS expects
relativePath = relativePath.replace(new RegExp('\\' + path.sep, 'g'), '/');

// Add back any query and hash stuff
relativePath += (parsed.search || '') + (parsed.hash || '');

return 'url(' + JSON.stringify(relativePath) + ')';
});
return '@font-face {' + rewrittenContent + '}';
Expand Down
2 changes: 2 additions & 0 deletions src/Plugin/CssFontRewitePlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@ public function activate(PluginApi $plugin_api): void
{
$plugin_api->addBuildStep(new CssFontRewriteStep());

$plugin_api->addBuildStep(new IdentityBuildStep('.eot'));
$plugin_api->addBuildStep(new IdentityBuildStep('.otf'));
$plugin_api->addBuildStep(new IdentityBuildStep('.ttf'));
$plugin_api->addBuildStep(new IdentityBuildStep('.woff'));
$plugin_api->addBuildStep(new IdentityBuildStep('.woff2'));
$plugin_api->addBuildStep(new IdentityBuildStep('.svg'));
}
}
2 changes: 1 addition & 1 deletion test/Plugin/CssFontRewitePluginTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public function testActivate()
$plugin_api->addBuildStep(Argument::type(CssFontRewriteStep::class))->shouldBeCalled();
$plugin_api->addBuildStep(Argument::that(function (AbstractBuildStep $step) {
return $step instanceof IdentityBuildStep
&& \in_array($step->acceptedExtension(), ['.otf', '.ttf', '.woff', '.woff2'], true);
&& \in_array($step->acceptedExtension(), ['.otf', '.ttf', '.woff', '.woff2', '.eot', '.svg'], true);
}))->shouldBeCalled();

$css_font_rewite_plugin->activate($plugin_api->reveal());
Expand Down

0 comments on commit 0056d3e

Please sign in to comment.