Giter Site home page Giter Site logo

Comments (6)

elgonzo avatar elgonzo commented on May 27, 2024 1

It is possible to set a value-less attribute, however it is a bit awkward and unintuitive as HtmlAgilityPack is not providing a simple convenient API for that.

Basically, currently you gotta do something like this:

static HtmlAttribute SetNoValueAttribute(HtmlNode element, string attributeName)
{
    var attr = element.Attributes[attributeName]
        ?? element.Attributes.Append(attributeName);

    attr.Value = null;
    attr.QuoteType = AttributeValueQuote.WithoutValue;
    return attr;
}


SetNoValueAttribute(iframeNode, "allowfullscreen");

from html-agility-pack.

jekru avatar jekru commented on May 27, 2024

It is possible to set a value-less attribute, however it is a bit awkward and unintuitive as HtmlAgilityPack is not providing a simple convenient API for that.

Thanks for your response and code example.

@JonathanMagnan Even if it is possible to create such value-less attributes, can we discuss about my suggestion to allow attributes to have a boolean value?

from html-agility-pack.

JonathanMagnan avatar JonathanMagnan commented on May 27, 2024

Hello @jekru ,

What exactly are you expecting from your proposed method Attributes.Add(string name, bool value) to do?

  1. <div checked></div>
  2. <div checked="true"></div>
  3. <div checked="false"></div>

One solution, meanwhile, is surely creating an extension method on your side using @elgonzo .

From what I understand, you would like it to do this answer <div checked></div> but having a method with a bool parameter that do nothing will add more confusion than anything else as someone not knowing this issue would expect that it will generate the solution 2 or 3 depending of the value.

Best Regards,

Jon

from html-agility-pack.

jekru avatar jekru commented on May 27, 2024

I would expect that Attributes.Add(string, name, bool value) respectively SetAttributeValue(string name, bool value) would result in <div checked></div> (when using "checked" as name and true as value). But you are right, this could let to confusion because someone could interpret a boolean value to result in <div checked="true"><div>.

The only problem I see is that there is no way to identify value-less attributes. Here is an example where I would expect null as Value and AttributeValueQuote.WithoutValue as QuoteType:

using System;
using System.Linq;
using HtmlAgilityPack;
	
public class Program
{
	public static void Main()
	{
		var input = HtmlNode.CreateNode("<input checked></input>");
		var checkedAttribute = input.Attributes.First();
		
		// Result is: Value: '' (empty string)
		Console.WriteLine($"Value: '{checkedAttribute.Value}'");

		// Result is: QuoteType: DoubleQuote
		Console.WriteLine($"QuoteType: {checkedAttribute.QuoteType}");
	}
}

from html-agility-pack.

JonathanMagnan avatar JonathanMagnan commented on May 27, 2024

Hello @jekru ,

Something for sure is that by default, we prefer to keep the current empty with the double quote behavior for backward compatibility. Browsers have different behavior on value-less attributes (firefox in developer mode will do the "empty string" like us while Chrome will keep it without value). Which browser is right? I'm not sure of the answer but keeping being backward compatible in this case is probably the best.

from html-agility-pack.

jekru avatar jekru commented on May 27, 2024

@JonathanMagnan

You made a good point with backward compatibility and I also was not aware that the behavior differs from browser to browser. What about creating a function IsBooleanAttribute() or IsValueLessBooleanAttribute() that only returns true if the attribute is a standard html attribute and defined as boolean attribute f.e. "checked" or it is a non standard html atttribute and is without a value (also not an empty string)?

from html-agility-pack.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.