2016-12-24

FluentDOM 6.0 - What's New

FluentDOM 6.0 is released.

So a major version jump means that here are backwards compatibility breaks and major new features. File loading has changed to improve security. FluentDOM\Query has got a major overhaul to improve the integration of alternative formats. This affected the interfaces and usage. I tried to keep the breaks to a minimum and easily fixable.

Loading Files

To load a file you will now have to explicitly allow it using the options argument. Here are two options. FluentDOM\Loader\Options::ALLOW_FILE basically restores the previous behaviour. The loader still checks if it is a file or string and will load both. FluentDOM\Loader\Options::IS_FILE means that only a file will be loaded. This has to be implemented into to respective loader. So if you notice that some loader behaves differently, please drop me a note.

All loading functions allow you to provide the option.

$fd = FluentDOM($file, 'xml', [ FluentDOM\Loader\Options::ALLOW_FILE => TRUE ]);
$document = FluentDOM::load(
  $file, 'xml', [ FluentDOM\Loader\Options::IS_FILE => TRUE ]
);

Fragment Loading / Query Content Types

Several loaders now support fragment loading. It is used by methods like FluentDOM\\Query::append(). It allows the Query API to keep the content type that you loaded. So if you load HTML, the fragment are expected to be html, if you load XML the fragments are expected to be XML, if you load JSON ... well you get the picture. :-)

$fd = FluentDOM('<form></form>', 'text/html')->find('//form');
$fd->append('<input type="text" name="example">');
echo $fd;

You can change the behaviour by setting the content type. It works with additional loaders, so if you install fluentdom/html5 you get transparent support for HTML5.

$fd = FluentDOM('<form></form>', 'text/html5')->find('//html:form');
$fd->append('<input type="text" name="example">');
echo $fd; 

The changes mean that all existing loaders need to be updated for FluentDOM 6.0.

Serializers

Serializers need to register itself on the FluentDOM class. It allows the FluentDOM\Query objects to output the same content type it loaded. Additionally you can use FluentDOM::getSerializerFactories()->createSerializer(); to get a serializer for a node by content type. I am thinking about adding something like a FluentDOM::save() function as a shortcut for that, but I am not sure about the name and implementation yet. If you have a suggestion please add it to the Issue.

Replace Whole Text

Character nodes (Text nodes and CDATA sections) have a property $wholeText. It returns the text content and the sibling character nodes. It even resolves entity references for that. The property is read only, but DOM Level 3 specifies a method replaceWholeText() as a write method for it. FluentDOM 6.0 implements that method in its extended DOM classes now.

$document = new FluentDOM\Document();
$document->loadXML(
  '<!DOCTYPE p ['."\n".
  '  <!ENTITY t "world">'."\n".
  ']>'."\n".
  '<p>Hello &t;<br/>, Hello &t;</p>'
);
/** @var \FluentDOM\Text $text */
$text = $document->documentElement->firstChild;
$text->replaceWholeText('Hi universe');
echo $document->saveXML();

Examples

The examples directory did grow a little confusing over the years. I restructured and refactored it. Some examples got removed, because the features are shown by newer examples.

What's Next?

I still have to updated some of the plugin repositories (loaders, serializers) and add some more documentation to the wiki. After that I plan to take a look into DOM Level 4. If you have suggestions please add a ticket to the issue tracker

2015-05-30

Surface Pro 3 - Versatility

The SP3 is the most useful laptop I ever had and the reason is not performance it is versatility.

One: Notes

The Surface replaces a legal pad in this case. The battery is strong enough to last even a long meeting (>8h). The stylus is precise.  Sensitivity was an issue at first, but the configuration app fixed it.

Two: Media Tablet

Movies, web browsing, reading - I do that mostly in tablet mode using the kickstand to prop it up. If you want better sound, connect a Bluetooth speaker/headphones.

Three: Presentations

PDF works as well as any Windows presentation program. MDP adapters allow to connect to VGA or HDMI. If you forgot your own, just ask another speaker with a Macbook.

You want to control the presentation wireless? The Kensington Presentair is a nice Bluetooth presenter with a Micro USB loading port.

Also, the stylus allows flip chart like presentations.

Four: Mobile Work

It is light enough to carry around and the display has a high resolution - large enough to use an IDE comfortably. The battery last long enough that I do not carry the power supply. It stays at home or in the hotel room. If I expect to need more time, I take a battery pack with me.

The Logitech T630 mouse does not take much space in the bag, has an Micro USB loading port ans support gestures.

A small UMTS stick provides connectivity at the moment, but I hope for LTE in the Surface Pro 4.

Five: Portable Workstation

Working in a customers office for some days allows for a larger setup. The USB port on the SP3 is not powerful enough for an external monitor, but the one in the power supply is. I use a MS168B+ connected to a small USB hub with a Micro USB port for power. The hub provides LAN and an SD-Card reader, too. Typically I set it up with the SP3 power supply, but it works with the battery pack. The wireless adapter converts the type cover into an Bluetooth keyboard.

Maybe Microsoft will fix the USB port power issue in the next Surface Pro.

Six: Desktop Workstation

I have two of the docking stations - at work and at home. At home it is connected to an LG ultra widescreen monitor (3440x1440px). At work it is connected to two monitors with the EVGA DisplayPort MST Hub. I could connect the monitors directly to the two MDP ports (docking station and SP3). But the whole point of a docking station is to not have to connect separate cables.

2015-02-02

FluentDOM 5.2 - New Features

FluentDOM 5.2 is released and here some new features:

FluentDOM::load()

The new static FluentDOM::load() function allows to use the loaders to get a FluentDOM\Document instance.
$json = FluentDOM::load($json, 'text/json');
echo $json(
  'string(//phoneNumbers/*[type="home"]/number)'
);

DOM Living Standard


A large part of the DOM Living Standard is implemented. It adds properties like $element->firstElementChild and methods like $element->remove().

Query selectors are not implemented yet. Still thinking about that. If you have an opinion please add a comment to the issue.

Two New Loaders

Loader Plugins

It was already possible to use the loaders directly or to set the loaders for a FluentDOM\Query object. It is now possible to register them on the FluentDOM class. This makes them available to the FluentDOM() and FluentDOM::load() functions.

Additional packages like FluentDOM/HTML5 can register their loaders with specific content types. Just require the package with Composer and you're ready to go:
$dom = FluentDOM::load($html, 'text/html5');

FluentDOM\Query::find()

The behavior of find() has been changed to allow two modes. FIND_MODE_MATCH executes the selector directly. It should be faster and work better with XPath. FIND_MODE_FILTER filters the descendant nodes of the current context - like the jQuery documentation describes it.
x