Git Product home page Git Product logo

external-layout's Introduction

External Layout

This library loads html layouts from remote, modify them for local usage and stores the result into a new file.

Installation

composer require enm/external-layout

If you want to use the default (guzzle) loader:

composer require guzzlehttp/guzzle

Usage

Their are different ways to use this library, depending on your needs.

Simple

The simplest way of usage is to use the layout creator factory with the default guzzle loader (requires guzzlehttp/guzzle). For simplest usage you should build your layout definitions from a config array.

$factory = \Enm\ExternalLayout\LayoutCreatorFactory::withGuzzleLoader();
$factory->enableRelativeUrlReplacement(); // adds the "UrlManipulator"
$factory->enableTwigBlocks(); // adds the "TwigManipulator" and the "WorkingTagFinisher"

$layoutCreator = $factory->create(); // create a configured instance of the LayoutCreator

$layoutCreator->createFromConfig( // load the original layout, manipulate the content and stores the modified content to the configured file
  [
      'source' => 'http://example.com', // your source url, with username and password (Basic Auth) if needed
      'destination' => __DIR__ . '/test.html.twig', // your destination file
      'blocks' => [
          'prepend' => [
              'headline' => 'body' // add block "body" as first child of html element "headline"
          ],
          'append' => [
              'stylesheets' => 'head', // add block "stylesheets" as last child of html element "head"
              'javascripts' => 'body' // add block "javascripts" as last child of html element "body"
          ],
          'replace' => [
              'title' => '%title%', // replace string "%title%" with block "title"
              'content' => '$$content$$' // replace string "$$content$$" with block "content"
          ]
      ]
  ]
);

Customized

If you want to customize loading, manipulation or finishing for the layout, you can also use the factory and configure your custom requirements.

$factory = new \Enm\ExternalLayout\LayoutCreatorFactory(
    new YourLoader() // here you can set an instance of a different loader, if you don' want to use the guzzle loader
);
$factory->addManipulator(
    new YourManipulator() // it is possible to set any number of custom manipulators
);
$factory->addFinisher(
    new YourFinisher() // it is possible to set any number of custom finishers
);

$layoutCreator = $factory->create();

// ... usage the same as above

Fully Customized

If you want a fully customized implementation (for example for usage with a dependency injection service container), you could create all instances without factory by yourself.

$layoutCreator = new \Enm\ExternalLayout\LayoutCreator(
    new YourLoader(), // use your own loader or an instance of "Enm\ExternalLayout\Loader\GuzzleLoader"
    new YourManipulator(), // use your own manipulator or for example an instance of "Enm\ExternalLayout\Loader\ManipulatorChain"
    new YourFinisher() // use your own finisher or for example an instance of "Enm\ExternalLayout\Loader\FinisherChain"
);

// ... usage the same as above

Customization

The library works as follows:

  1. Load contents from source url into a \DomDocument ("loaders")
  2. Manipulate the \DomDocument for example with content replacements or block for your templating ("manipulators")
  3. Finish the layout with simple plain text processing ("finishers")
  4. Store the manipulated and finished html content into the configured file

Loaders

Loaders are responsible for loading the html content of the given uri into a \DomDocument.

You can use the default loader (Enm\ExternalLayout\Loader\GuzzleLoader) which requires an instance of (GuzzleHttp\ClientInterface; composer: guzzlehttp/guzzle) or you can implement the Enm\ExternalLayout\Loader\LoaderInterface by yourself.

Manipulators

Manipulators are responsible for manipulation of the loaded \DomDocument. Manipulators could change contents, remove or add new dom elements or insert blocks for different templating languages (default Twig).

If you want to use more than one manipulator you can add all your manipulators to an instance of Enm\ExternalLayout\Manipulator\ManipulatorChain. A manipulator must implement Enm\ExternalLayout\Manipulator\ManipulatorInterface.

Available manipulators are:

  • UrlManipulator: Replace relative urls with absolute urls (needed because assets normally are farther loaded from original source)
  • TwigManipulator: Replace strings with twig blocks; prepend or append twig blocks to html elements
  • BaseUrlManipulator: Removes the base tag to avoid invalid local relative paths

Finishers

Finishers are responsible for cleanup and string replacements which are not possible in a \DomDocument.

If you want to use more than one finisher you can add all your finishers to an instance of Enm\ExternalLayout\Finisher\FinisherChain. A finisher must implement Enm\ExternalLayout\Finisher\FinisherInterface.

Available finishers are:

  • WorkingTagFinisher: Remove "working tags", which are used to generate valid xml content for the \DomDocument where actually no tag in the finished content is needed

external-layout's People

Contributors

pmarien avatar stanislavseifert avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

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.