Skip to content

Support for some tags not to be minified #376

Description

@SplendidDream

NUglify version 1.21.0

Enhancement
Is it possible to keep tag elements in their raw format output without minify them, e.g. template, pre, textarea ?
The reason, maybe some tags have template variables or are used to display source code or do not allow changes to the content.

To Reproduce

var settings = new NUglify.Html.HtmlSettings();
var result = NUglify.Uglify.Html(@"
<template>
    <div style=""{{if !show}}display:none;{{/if}}"">
    name: {{data.name}}
    </div>
    <script> alert(0) </script>
</template>
<pre>
    <span> name: Tom </span>
</pre>
<div>
    <span> name: Tom </span>
</div>
", settings);

Minified output
result.Code:

<template><div style="{{if !show}}display:none;{{/if}}">name: {{data.name}}</div><script>alert(0)</script></template><pre>
    <span> name: Tom </span>
</pre><div><span>name: Tom</span></div>

result .Errors:

{inner_css(1,1): run-time error CSS1062: Expected semicolon or closing curly-brace, found '{'}
{inner_css(1,26): run-time error CSS1062: Expected semicolon or closing curly-brace, found '{'}

Excepted code
The following settings are supported:

var settings = new NUglify.Html.HtmlSettings();
//Sets a list of tags that kept the raw output format.
settings.RawTags.Add("template");
settings.RawTags.Add("pre");
settings.RawTags.Add("textarea");

var result = NUglify.Uglify.Html(@"
<template>
    <div style=""{{if !show}}display:none;{{/if}}"">
    name: {{data.name}}
    </div>
    <script> alert(0) </script>
</template>
<pre>
    <span> name: Tom </span>
</pre>
<div>
    <span> name: Tom </span>
</div>
", settings);

result.Code:

<template>
    <div style=""{{if !show}}display:none;{{/if}}"">
    name: {{data.name}}
    </div>
    <script> alert(0) </script>
</template><pre>
    <span> name: Tom </span>
</pre><div><span>name: Tom</span></div>

Code implementation
Maybe the code needs to be changed like this:

//HtmlMinifier.cs 
void ProcessNode(HtmlNode node)
{
    var element = node as HtmlElement;
    //New code start
    if (element != null && settings.RawTags.Count > 0 && settings.RawTags.Contains(element.Name))
    {
        return;
    }
    //New code end

    bool isInXml = element?.Descriptor != null && (element.Descriptor.Category & ContentKind.Xml) != 0;
    if (isInXml)
        xmlNamespaceCount++;
    //.....
}

//HtmlSettings.cs
public HtmlSettings()
{
    KeepTags = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
    //New code: initialize
    RawTags = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
    //.....
}
//New code: property
public HashSet<string> RawTags { get; }

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions