Home

Awesome

Xtract

Extract data from DOM, easily. Useful for back-end generated contents and SEO-friendly rich apps.

Image

Installation

npm install xtract

Requirements

SEO is the main problem of modern web. And we have problems with passing the data from HTML to JavaScript. Your back-end generated data is need to be mapped to JavaScript and Xtract helps you to do that.

<p id="profile">
  My name is <span data-x="user.name">Fatih</span>,
  and I'm from <span data-x="user.location">Istanbul</span>.
</p>

You can simply extract data now just calling:

xtract($("#profile")).$model

This will generate following object:

{
  user: {
    name: "Fatih",
    location: "Istanbul"
  }
}

Extracting Nested Models

<p id="profile">
  My name is <span data-x="user.name.firstname">Fatih</span>
  <span data-x="user.name.lastname">Akın</span>,
  and I'm from <span data-x="user.location.city">Istanbul</span>,
  <span data-x="user.location.country.name">Turkey
  (<span data-x="user.location.country.code">TR</span>)</span>.
</p>
xtract($("#profile")).$model

This will generate following object:

{
  user: {
    name: {
      firstname: "Fatih",
      lastname: "Akın"
    },
    location: {
      city: "Istanbul",
      country: {
        name: "Turkey",
        code: "TR"
      }
    }
  }
}

Extracting with jQuery

You can use $this in data-x attribute to reach more values.

<p id="profile">
  <img src="my-profile-picture.jpg" data-x="user.image: $this.attr('src')">
  My name is <span data-x="user.name">Fatih</span>,
  and I'm from <span data-x="user.location">Istanbul</span>.
</p>
xtract($("#profile")).$model

This will map the src tag to the user.image:

{
  user: {
    name: "Fatih",
    location: "Istanbul",
    image: "my-profile-picture.jpg"
  }
}

Plug-ins

You can simply write plugins to use extract easier.

xtract.plug('date', function () {
  return $(this).text().replace(/(\d+)\s+(\w+)\s+(\d+)/, '$3, $1 $2');
});

The static HTML:

<div>
  Einstein: <span data-x="date.birth: $this.date()">14 March 1879</span> –
  <span data-x="date.death: $this.date()">18 April 1955</span>
</div>

Output:

date: {
  birth: "1879, 14 March",
  death: "1955, 18 April"
},

License

MIT.