X-Git-Url: https://git.rapsys.eu/.gitweb.cgi/packbundle/blobdiff_plain/74728125f4c1dbae4c513d01bc83724c18c4108f..f414da492f983455e1db3f9e89f8cb12a8a1ed8b:/README.md?ds=inline diff --git a/README.md b/README.md index ee7b0bb..3998c89 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,14 @@ Add bundle custom repository to your project's `composer.json` file: "psr-4": { "Rapsys\\PackBundle\\": "" } + }, + "require": { + "symfony/asset": "^4.4", + "symfony/flex": "^1.5", + "symfony/framework-bundle": "^4.4", + "symfony/process": "^4.4", + "symfony/twig-bundle": "^4.4", + "twig/extensions": "^1.5" } } } @@ -79,3 +87,189 @@ class AppKernel extends Kernel // ... } ``` + +### Step 3: Configure the Bundle + +Setup configuration file `config/packages/rapsys_pack.yaml` with the following +content available in `Resources/config/packages/rapsys_pack.yaml`: + +```yaml +#Services configuration +services: + #Replace assets.packages definition + assets.packages: + class: 'Symfony\Component\Asset\Packages' + arguments: [ '@rapsys_pack.path_package' ] + #Replace assets.context definition + assets.context: + class: 'Rapsys\PackBundle\Context\RequestStackContext' + arguments: [ '@request_stack', '%asset.request_context.base_path%', '%asset.request_context.secure%' ] + #Register assets pack package + rapsys_pack.path_package: + class: 'Rapsys\PackBundle\Package\PathPackage' + arguments: [ '/', '@assets.empty_version_strategy', '@assets.context' ] + public: true + #Register twig pack extension + rapsys_pack.pack_extension: + class: 'Rapsys\PackBundle\Extension\PackExtension' + arguments: [ '@file_locator', '@service_container', '@rapsys_pack.path_package', '@rapsys_pack.slugger_util' ] + tags: [ 'twig.extension' ] + #Register slugger util service + rapsys_pack.slugger_util: + class: 'Rapsys\PackBundle\Util\SluggerUtil' + arguments: [ '%kernel.secret%' ] + public: true + #Register slugger util class alias + Rapsys\PackBundle\Util\SluggerUtil: + alias: 'rapsys_pack.slugger_util' +``` + +Open a command console, enter your project directory and execute the following +command to see default bundle configuration: + +```console +$ php bin/console config:dump-reference RapsysPackBundle +``` + +Open a command console, enter your project directory and execute the following +command to see current bundle configuration: + +```console +$ php bin/console debug:config RapsysPackBundle +``` + +### Step 4: Use the twig extension in your Template + +You can use a template like this to generate your first `rapsys_pack` enabled +template: + +```twig + + + + + {% block title %}Welcome!{% endblock %} + {% stylesheet '//fonts.googleapis.com/css?family=Irish+Grover|La+Belle+Aurore' '@NamedBundle/Resources/public/css/{reset,screen}.css' '@Short/css/example.css' %} + + {% endstylesheet %} + + + {% block body %}{% endblock %} + {% javascript '@Short/js/*.js' %} + + {% endjavascript %} + + +``` + +### Step 5: Make sure you have local binary installed + +You need to have cpack and jpack scripts from https://git.rapsys.eu/packer/ repository +set as executable and installed in /usr/local/bin. + +To install cpack and jpack required packages open a root console and execute the +following command: + +```console +# urpmi perl-base perl-CSS-Packer perl-JavaScript-Packer +``` + +or stone age distributions: + +```console +# apt-get install libcss-packer-perl libjavascript-packer-perl +``` + +or other distributions through cpan: + +```console +# cpan App::cpanminus +# cpanm CSS::Packer +# cpanm JavaScript::Packer +``` + +### Step 6: Create your own filter + +You can create you own mypackfilter class which call a mypack binary: + +```php +fileName = $fileName; + + //Set line + $this->line = $line; + + //Set bin + $this->bin = $bin; + + //Check argument presence + if (!empty($this->...)) { + //Append argument + if ($this->... == '...') { + $this->bin .= ' ...'; + } else { + //Throw an error on ... + throw new Error(sprintf('Got ... for %s: %s', $this->bin, $this->...), $this->line, $this->fileName); + } + } + } + + //Pass merge of all inputs in content + public function process(string $content): string { + //Create descriptors + $descriptorSpec = array( + 0 => array('pipe', 'r'), + 1 => array('pipe', 'w'), + 2 => array('pipe', 'w') + ); + + //Open process + if (is_resource($proc = proc_open($this->bin, $descriptorSpec, $pipes))) { + //Set stderr as non blocking + stream_set_blocking($pipes[2], false); + + //Send content to stdin + fwrite($pipes[0], $content); + + //Close stdin + fclose($pipes[0]); + + //Read content from stdout + if ($stdout = stream_get_contents($pipes[1])) { + $content = $stdout; + } + + //Close stdout + fclose($pipes[1]); + + //Read content from stderr + if (($stderr = stream_get_contents($pipes[2]))) { + throw new Error(sprintf('Got unexpected strerr for %s: %s', $this->bin, $stderr), $this->line, $this->fileName); + } + + //Close stderr + fclose($pipes[2]); + + //Close process + if (($ret = proc_close($proc))) { + throw new Error(sprintf('Got unexpected non zero return code %s: %d', $this->bin, $ret), $this->line, $this->fileName); + } + } + + //Return content + return $content; + } +} +``` + +The class must implements FilterInterface and get it's arguments through constructor.