Browse Source

domain_site_settngs + patch
home_mobile with entries

Bachir Soussi Chiadmi 7 years ago
parent
commit
9e1c24478b
41 changed files with 2362 additions and 127 deletions
  1. 4 0
      PATCHES.md
  2. 339 0
      sites/all/modules/contrib/admin/path_alias_xt/LICENSE.txt
  3. 2 0
      sites/all/modules/contrib/admin/path_alias_xt/config/install/path_alias_xt.settings.yml
  4. 9 0
      sites/all/modules/contrib/admin/path_alias_xt/config/schema/path_alias_xt.schema.yml
  5. 13 0
      sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.info.yml
  6. 5 0
      sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.links.menu.yml
  7. 24 0
      sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.module
  8. 2 0
      sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.permissions.yml
  9. 9 0
      sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.routing.yml
  10. 7 0
      sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.services.yml
  11. 69 0
      sites/all/modules/contrib/admin/path_alias_xt/src/Form/PathAliasXtSettingsForm.php
  12. 89 0
      sites/all/modules/contrib/admin/path_alias_xt/src/PathAliasXtProcessorAlias.php
  13. 9 0
      sites/all/modules/figli/edlp_corpus/assets/dist/scripts/corpus.min.js
  14. 1152 37
      sites/all/modules/figli/edlp_corpus/assets/dist/scripts/physics.min.js
  15. 71 1
      sites/all/modules/figli/edlp_corpus/assets/dist/styles/corpus.min.css
  16. 1 1
      sites/all/modules/figli/edlp_corpus/assets/scripts/corpus.js
  17. 1 0
      sites/all/modules/figli/edlp_corpus/src/Controller/CorpusController.php
  18. 2 1
      sites/all/modules/figli/edlp_home/edlp_home.module
  19. 8 0
      sites/all/modules/figli/edlp_home/edlp_home.routing.yml
  20. 24 6
      sites/all/modules/figli/edlp_home/includes/edlp_home.inc
  21. 150 1
      sites/all/modules/figli/edlp_home/src/Controller/HomeController.php
  22. 4 0
      sites/all/modules/figli/edlp_home/templates/edlp-home.html.twig
  23. 124 3
      sites/all/modules/figli/edlp_search/assets/dist/scripts/edlp_search.min.js
  24. 1 1
      sites/all/modules/figli/edlp_studio/assets/dist/scripts/edlp_studio.min.js
  25. 1 33
      sites/all/themes/custom/edlptheme/assets/dist/scripts/main.min.js
  26. 1 0
      sites/all/themes/custom/edlptheme/assets/dist/scripts/redirect.min.js
  27. 0 0
      sites/all/themes/custom/edlptheme/assets/dist/styles/app.min.css
  28. 23 2
      sites/all/themes/custom/edlptheme/assets/styles/app.scss
  29. 20 0
      sites/all/themes/custom/edlptheme/edlptheme.theme
  30. 8 0
      sites/all/themes/custom/edlptheme/templates/content/edlp-home.html.twig
  31. 42 0
      sites/all/themes/custom/edlptheme/templates/content/taxonomy-term--entrees--home-mobile.html.twig
  32. 22 7
      sites/default/config/sync/core.entity_view_display.node.enregistrement.default.yml
  33. 8 28
      sites/default/config/sync/core.entity_view_display.taxonomy_term.entrees.default.yml
  34. 40 0
      sites/default/config/sync/core.entity_view_display.taxonomy_term.entrees.home_mobile.yml
  35. 2 2
      sites/default/config/sync/core.entity_view_display.taxonomy_term.entrees.notice.yml
  36. 10 0
      sites/default/config/sync/core.entity_view_mode.taxonomy_term.home_mobile.yml
  37. 3 0
      sites/default/config/sync/core.extension.yml
  38. 11 0
      sites/default/config/sync/domain_site_settings.domainconfigsettings.yml
  39. 5 0
      sites/default/config/sync/path_alias_xt.settings.yml
  40. 15 3
      sites/default/config/sync/pathauto.pattern.documents.yml
  41. 32 1
      sites/default/config/sync/pathauto.settings.yml

+ 4 - 0
PATCHES.md

@@ -1 +1,5 @@
+color_field
 https://www.drupal.org/project/color_field/issues/2854199#comment-12316266
+
+domain_site_settings
+https://www.drupal.org/project/domain_site_settings/issues/2930391

+ 339 - 0
sites/all/modules/contrib/admin/path_alias_xt/LICENSE.txt

@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.

+ 2 - 0
sites/all/modules/contrib/admin/path_alias_xt/config/install/path_alias_xt.settings.yml

@@ -0,0 +1,2 @@
+user_special: true
+regex_pattern: '{(^node|^user|^taxonomy/term)/([0-9]+)/(.+)}'

+ 9 - 0
sites/all/modules/contrib/admin/path_alias_xt/config/schema/path_alias_xt.schema.yml

@@ -0,0 +1,9 @@
+path_alias_xt.settings:
+  type: config_object
+  mapping:
+    user_special:
+      type: boolean
+      label: 'User special'
+    regex_pattern:
+      type: string
+      label: 'RegEx pattern'

+ 13 - 0
sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.info.yml

@@ -0,0 +1,13 @@
+name: Extended Path Aliases
+type: module
+description: 'Automatically extend path aliases to include tabs, like <em>about-us/edit</em> for <em>node/123/edit</em>.<br> Allow these aliases to be entered in page specification wild-cards, <em>about-us*</em>, e.g for block visibility.'
+# core: 8.x
+configure: path_alias_xt.settings_form
+dependencies:
+  - path
+
+# Information added by Drupal.org packaging script on 2017-07-14
+version: '8.x-1.x-dev'
+core: '8.x'
+project: 'path_alias_xt'
+datestamp: 1500044946

+ 5 - 0
sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.links.menu.yml

@@ -0,0 +1,5 @@
+path_alias_xt.settings_form:
+  title: 'Extended path aliases'
+  route_name: path_alias_xt.settings_form
+  description: 'Advanced settings.'
+  parent: system.admin_config_system

+ 24 - 0
sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.module

@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @file
+ * Extended Path Aliases.
+ */
+
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Url;
+
+/**
+ * Implements hook_help().
+ */
+function path_alias_xt_help($route_name, RouteMatchInterface $route_match) {
+  switch ($route_name) {
+    case 'help.page.path_alias_xt':
+      $output = '<p>';
+      $output .= t('Installation instructions are in the README.txt file. Further documentation is on the <a href="@path_alias_xt">Extended Path Aliases</a> project page.',
+        ['@path_alias_xt' => Url::fromUri('http://drupal.org/project/path_alias_xt')->toString()]);
+      $output .= '</p>';
+
+      return ['#markup' => $output];
+  }
+}

+ 2 - 0
sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.permissions.yml

@@ -0,0 +1,2 @@
+administer extended path aliases:
+  title: 'Administer Extended Path Aliases'

+ 9 - 0
sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.routing.yml

@@ -0,0 +1,9 @@
+path_alias_xt.settings_form:
+  path: '/admin/config/system/path_alias_xt'
+  defaults:
+    _form: '\Drupal\path_alias_xt\Form\PathAliasXtSettingsForm'
+    _title: 'Extended path aliases'
+  requirements:
+    _permission: 'administer extended path aliases'
+  options:
+    _admin_route: TRUE

+ 7 - 0
sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.services.yml

@@ -0,0 +1,7 @@
+services:
+  path_alias_xt.path_processor_alias:
+    class: Drupal\path_alias_xt\PathAliasXtProcessorAlias
+    tags:
+      - { name: path_processor_inbound, priority: 100 }
+      - { name: path_processor_outbound, priority: 100 }
+    arguments: ['@path.alias_manager', '@config.factory']

+ 69 - 0
sites/all/modules/contrib/admin/path_alias_xt/src/Form/PathAliasXtSettingsForm.php

@@ -0,0 +1,69 @@
+<?php
+
+namespace Drupal\path_alias_xt\Form;
+
+use Drupal\Core\Form\ConfigFormBase;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Url;
+
+/**
+ * Extended path aliases configuration form.
+ */
+class PathAliasXtSettingsForm extends ConfigFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEditableConfigNames() {
+    return ['path_alias_xt.settings'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'path_alias_xt_settings_form';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $config = $this->config('path_alias_xt.settings');
+
+    $form['user_special'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('For the current user: instead of <em>/user/uid</em> or its alias, apply the alias for <em>/user</em>.'),
+      '#default_value' => $config->get('user_special'),
+      '#description' => $this->t('If ticked and the system path <em>/user</em> has an <a target="alias" href="@alias">alias</a>, such as <em>/MyAccount</em>, then <em>/MyAccount</em> will also be applied when a user visits their <em>/user/uid/...</em> pages.<br/>For this feature to work you must complete the full installation procedure outlined in the <a href="@README">README</a>.', [
+        '@alias' => Url::fromRoute('path.admin_overview')->toString(),
+        '@README' => Url::fromUserInput('/' . drupal_get_path('module', 'path_alias_xt') . '/README.txt')->toString(),
+      ]),
+    ];
+
+    $form['regex_pattern'] = [
+      '#type' => 'textfield',
+      '#size' => 100,
+      '#title' => $this->t('Regular expression to match system paths for nodes, users and taxonomy terms'),
+      '#default_value' => $config->get('regex_pattern'),
+      '#description' => $this->t("While you can always reset this configuration and recover without permanent damage to your site, a change to this expression may temporarily break all extended aliases. Change only when you know what you're doing."),
+    ];
+
+    return parent::buildForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $config = $this->config('path_alias_xt.settings');
+
+    foreach ($form_state->getValues() as $key => $value) {
+      $config->set($key, $value);
+    }
+    $config->save();
+
+    parent::submitForm($form, $form_state);
+  }
+
+}

+ 89 - 0
sites/all/modules/contrib/admin/path_alias_xt/src/PathAliasXtProcessorAlias.php

@@ -0,0 +1,89 @@
+<?php
+
+namespace Drupal\path_alias_xt;
+
+use Drupal\Component\Utility\Unicode;
+use Drupal\Core\Config\ConfigFactory;
+use Drupal\Core\Path\AliasManagerInterface;
+use Drupal\Core\PathProcessor\PathProcessorAlias;
+use Drupal\Core\Render\BubbleableMetadata;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Processes inbound and outbound path determining alias.
+ */
+class PathAliasXtProcessorAlias extends PathProcessorAlias {
+
+  /**
+   * The config factory.
+   *
+   * @var \Drupal\Core\Config\ConfigFactory
+   */
+  protected $configFactory;
+
+  /**
+   * Constructs a Path alias processor.
+   *
+   * @param \Drupal\Core\Path\AliasManagerInterface $alias_manager
+   *   The alias manager service.
+   * @param \Drupal\Core\Config\ConfigFactory $config_factory
+   *   The config factory service.
+   */
+  public function __construct(AliasManagerInterface $alias_manager, ConfigFactory $config_factory) {
+    parent::__construct($alias_manager);
+    $this->configFactory = $config_factory;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function processInbound($path, Request $request) {
+    $path_to_process = ltrim($path, '/');
+
+    $removed_elements = [];
+    $path_elements = explode('/', $path_to_process);
+
+    foreach ($path_elements as $element) {
+      $candidate_alias = '/' . implode('/', $path_elements);
+      $source = $this->aliasManager->getPathByAlias($candidate_alias);
+
+      if ($source != $candidate_alias) {
+        // Change the order of the elements.
+        krsort($removed_elements);
+        $return_path = $source;
+        if (!empty($removed_elements)) {
+          $return_path .= '/' . implode('/', $removed_elements);
+        }
+
+        // Validate the path.
+        // Injecting the service threw ServiceCircularReferenceException.
+        if (\Drupal::service('path.validator')->isValid($return_path)) {
+          return $return_path;
+        }
+      }
+      // Remove the last element from the elements array to be able to add it
+      // to the end of the found path.
+      $removed_elements[] = array_pop($path_elements);
+    }
+
+    return $path;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function processOutbound($path, &$options = [], Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) {
+    $path = parent::processOutbound($path, $options, $request, $bubbleable_metadata);
+
+    $config = $this->configFactory->get('path_alias_xt.settings');
+    if (preg_match($config->get('regex_pattern'), Unicode::substr($path, 1), $matches)) {
+      $langcode = isset($options['language']) ? $options['language']->getId() : NULL;
+      if ($alias = $this->aliasManager->getAliasByPath("/$matches[1]/$matches[2]", $langcode)) {
+        $path = "$alias/$matches[3]";
+      }
+    }
+
+    return $path;
+  }
+
+}

File diff suppressed because it is too large
+ 9 - 0
sites/all/modules/figli/edlp_corpus/assets/dist/scripts/corpus.min.js


+ 1152 - 37
sites/all/modules/figli/edlp_corpus/assets/dist/scripts/physics.min.js

@@ -1,38 +1,1153 @@
+/**
+ * Physics
+ * A requirified port of Traer Physics from Processing to JavaScript.
+ * Copyright (C) 2012 jonobr1
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+var _      = require('./common')
+,   Vector = require('./vector')
+;
 
-require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){var _=require('./common'),Vector=require('./vector');function Attraction(a,b,k,d){this.a=a;this.b=b;this.constant=k;this.on=true;this.distanceMin=d;this.distanceMinSquared=d*d;}
-_.extend(Attraction.prototype,{update:function(){var a=this.a,b=this.b;if(!this.on||(a.fixed&&b.fixed)){return;}
-var a2bx=a.position.x-b.position.x;var a2by=a.position.y-b.position.y;var a2b=new Vector().sub(a.position,b.position);var a2bdistanceSquared=Math.max(a2b.lengthSquared(),this.distanceMinSquared);var force=(this.constant*a.mass*b.mass)/a2bdistanceSquared;var length=Math.sqrt(a2bdistanceSquared);if(force===0||length===0){a2b.clear();}else{a2b.divideScalar(length).multiplyScalar(force);}
-if(!a.fixed){a.force.subSelf(a2b);}
-if(!b.fixed){b.force.addSelf(a2b);}
-return this;},resting:function(){var a=this.a;var b=this.b;var l=this.distanceMin;return!this.on||(a.fixed&&b.fixed)||(a.fixed&&b.position.distanceTo(a.position)<=l&&b.resting())||(b.fixed&&a.position.distanceTo(b.position)<=l&&a.resting());}});module.exports=Attraction;},{"./common":8,"./vector":12}],2:[function(require,module,exports){var _=require('./common'),Vector=require('./vector');function Integrator(s){this.s=s;this.originalPositions=[];this.originalVelocities=[];this.k1Forces=[];this.k1Velocities=[];this.k2Forces=[];this.k2Velocities=[];this.k3Forces=[];this.k3Velocities=[];this.k4Forces=[];this.k4Velocities=[];}
-_.extend(Integrator.prototype,{allocateParticles:function(){while(this.s.particles.length>this.originalPositions.length){this.originalPositions.push(new Vector());this.originalVelocities.push(new Vector());this.k1Forces.push(new Vector());this.k1Velocities.push(new Vector());this.k2Forces.push(new Vector());this.k2Velocities.push(new Vector());this.k3Forces.push(new Vector());this.k3Velocities.push(new Vector());this.k4Forces.push(new Vector());this.k4Velocities.push(new Vector());}
-return this;},step:function(dt){var s=this.s;var p,x,y;this.allocateParticles();_.each(s.particles,function(p,i){if(!p.fixed){this.originalPositions[i].copy(p.position);this.originalVelocities[i].copy(p.velocity);}
-p.force.clear();},this);s.applyForces();_.each(s.particles,function(p,i){if(!p.fixed){this.k1Forces[i].copy(p.force);this.k1Velocities[i].copy(p.velocity);}
-p.force.clear();},this);_.each(s.particles,function(p,i){if(!p.fixed){var op=this.originalPositions[i];var k1v=this.k1Velocities[i];x=op.x+k1v.x*0.5*dt;y=op.y+k1v.y*0.5*dt;p.position.set(x,y);var ov=this.originalVelocities[i];var k1f=this.k1Forces[i];x=ov.x+k1f.x*0.5*dt/p.mass;y=ov.y+k1f.y*0.5*dt/p.mass;p.velocity.set(x,y);}},this);s.applyForces();_.each(s.particles,function(p,i){if(!p.fixed){this.k2Forces[i].copy(p.force);this.k2Velocities[i].copy(p.velocity);}
-p.force.clear();},this);_.each(s.particles,function(p,i){if(!p.fixed){var op=this.originalPositions[i];var k2v=this.k2Velocities[i];p.position.set(op.x+k2v.x*0.5*dt,op.y+k2v.y*0.5*dt);var ov=this.originalVelocities[i];var k2f=this.k2Forces[i];p.velocity.set(ov.x+k2f.x*0.5*dt/p.mass,ov.y+k2f.y*0.5*dt/p.mass);}},this);s.applyForces();_.each(s.particles,function(p,i){if(!p.fixed){this.k3Forces[i].copy(p.force);this.k3Velocities[i].copy(p.velocity);}
-p.force.clear();},this);_.each(s.particles,function(p,i){if(!p.fixed){var op=this.originalPositions[i];var k3v=this.k3Velocities[i];p.position.set(op.x+k3v.x*dt,op.y+k3v.y*dt)
-var ov=this.originalVelocities[i];var k3f=this.k3Forces[i];p.velocity.set(ov.x+k3f.x*dt/p.mass,ov.y+k3f.y*dt/p.mass);}},this);s.applyForces();_.each(s.particles,function(p,i){if(!p.fixed){this.k4Forces[i].copy(p.force);this.k4Velocities[i].copy(p.velocity);}},this);_.each(s.particles,function(p,i){p.age+=dt;if(!p.fixed){var op=this.originalPositions[i];var k1v=this.k1Velocities[i];var k2v=this.k2Velocities[i];var k3v=this.k3Velocities[i];var k4v=this.k4Velocities[i];var x=op.x+dt/6.0*(k1v.x+2.0*k2v.x+2.0*k3v.x+k4v.x);var y=op.y+dt/6.0*(k1v.y+2.0*k2v.y+2.0*k3v.y+k4v.y);p.position.set(x,y);var ov=this.originalVelocities[i];var k1f=this.k1Forces[i];var k2f=this.k2Forces[i];var k3f=this.k3Forces[i];var k4f=this.k4Forces[i];x=ov.x+dt/(6.0*p.mass)*(k1f.x+2.0*k2f.x+2.0*k3f.x+k4f.x);y=ov.y+dt/(6.0*p.mass)*(k1f.y+2.0*k2f.y+2.0*k3f.y+k4f.y);p.velocity.set(x,y);}},this);return this;}});module.exports=Integrator;},{"./common":8,"./vector":12}],3:[function(require,module,exports){var _=require('./common'),Vector=require('./vector');function Particle(mass){this.position=new Vector();this.velocity=new Vector();this.force=new Vector();this.mass=mass;this.fixed=false;this.age=0;this.dead=false;}
-_.extend(Particle.prototype,{distanceTo:function(p){return this.position.distanceTo(p.position);},makeFixed:function(){this.fixed=true;this.velocity.clear();return this;},reset:function(){this.age=0;this.dead=false;this.position.clear();this.velocity.clear();this.force.clear();this.mass=1.0;return this;},resting:function(){return this.fixed||this.velocity.isZero()&&this.force.isZero();}});module.exports=Particle;},{"./common":8,"./vector":12}],4:[function(require,module,exports){var _=require('./common'),Vector=require('./Vector'),Particle=require('./Particle'),Spring=require('./Spring'),Attraction=require('./Attraction'),Integrator=require('./Integrator');function ParticleSystem(){this.__equilibriumCriteria={particles:true,springs:true,attractions:true};this.__equilibrium=false;this.__optimized=false;this.particles=[];this.springs=[];this.attractions=[];this.forces=[];this.integrator=new Integrator(this);this.hasDeadParticles=false;var args=arguments.length;if(args===1){this.gravity=new Vector(0,arguments[0]);this.drag=ParticleSystem.DEFAULT_DRAG;}else if(args===2){this.gravity=new Vector(0,arguments[0]);this.drag=arguments[1];}else if(args===3){this.gravity=new Vector(arguments[0],arguments[1]);this.drag=arguments[3];}else{this.gravity=new Vector(0,ParticleSystem.DEFAULT_GRAVITY);this.drag=ParticleSystem.DEFAULT_DRAG;}}
-_.extend(ParticleSystem,{DEFAULT_GRAVITY:0,DEFAULT_DRAG:0.001,Attraction:Attraction,Integrator:Integrator,Particle:Particle,Spring:Spring,Vector:Vector});_.extend(ParticleSystem.prototype,{optimize:function(b){this.__optimized=!!b;return this;},setGravity:function(x,y){this.gravity.set(x,y);return this;},setEquilibriumCriteria:function(particles,springs,attractions){this.__equilibriumCriteria.particles=!!particles;this.__equilibriumCriteria.springs=!!springs;this.__equilibriumCriteria.attractions=!!attractions;},tick:function(){this.integrator.step(arguments.length===0?1:arguments[0]);if(this.__optimized){this.__equilibrium=!this.needsUpdate();}
-return this;},needsUpdate:function(){var i=0;if(this.__equilibriumCriteria.particles){for(i=0,l=this.particles.length;i<l;i++){if(!this.particles[i].resting()){return true;}}}
-if(this.__equilibriumCriteria.springs){for(i=0,l=this.springs.length;i<l;i++){if(!this.springs[i].resting()){return true;}}}
-if(this.__equilibriumCriteria.attractions){for(i=0,l=this.attractions.length;i<l;i++){if(!this.attractions[i].resting()){return true;}}}
-return false;},addParticle:function(p){this.particles.push(p);return this;},addSpring:function(s){this.springs.push(s);return this;},addAttraction:function(a){this.attractions.push(a);return this;},makeParticle:function(m,x,y){var mass=_.isNumber(m)?m:1.0;var x=x||0;var y=y||0;var p=new Particle(mass);p.position.set(x,y);this.addParticle(p);return p;},makeSpring:function(a,b,k,d,l){var s=new Spring(a,b,k,d,l);this.addSpring(s);return s;},makeAttraction:function(a,b,k,d){var a=new Attraction(a,b,k,d);this.addAttraction(a);return a;},clear:function(){this.particles.length=0;this.springs.length=0;this.attractions.length=0;},applyForces:function(){if(!this.gravity.isZero()){_.each(this.particles,function(p){p.force.addSelf(this.gravity);},this);}
-var t=new Vector();_.each(this.particles,function(p){t.set(p.velocity.x*-1*this.drag,p.velocity.y*-1*this.drag);p.force.addSelf(t);},this);_.each(this.springs,function(s){s.update();});_.each(this.attractions,function(a){a.update();});_.each(this.forces,function(f){f.update();});return this;},clearForces:function(){_.each(this.particles,function(p){p.clear();});return this;}});module.exports=ParticleSystem;},{"./Attraction":1,"./Integrator":2,"./Particle":3,"./Spring":6,"./Vector":7,"./common":8}],5:[function(require,module,exports){var _=require('./common'),raf=require('./requestAnimationFrame'),ParticleSystem=require('./ParticleSystem');var updates=[];function Physics(){var _this=this;this.playing=false;ParticleSystem.apply(this,arguments);this.animations=[];this.equilibriumCallbacks=[];update.call(this);}
-_.extend(Physics,ParticleSystem,{superclass:ParticleSystem});_.extend(Physics.prototype,ParticleSystem.prototype,{play:function(){if(this.playing){return this;}
-this.playing=true;this.__equilibrium=false;update.call(this);return this;},pause:function(){this.playing=false;return this;},toggle:function(){if(this.playing){this.pause();}else{this.play();}
-return this;},onUpdate:function(func){if(_.indexOf(this.animations,func)>=0||!_.isFunction(func)){return this;}
-this.animations.push(func);return this;},onEquilibrium:function(func){if(_.indexOf(this.equilibriumCallbacks,func)>=0||!_.isFunction(func)){return this;}
-this.equilibriumCallbacks.push(func);return this;},update:function(){if(!this.__equilibrium){return this;}
-this.__equilibrium=false;if(this.playing){update.call(this);}
-return this;}});function update(){var _this=this;this.tick();_.each(this.animations,function(a){a();});if((this.__optimized&&!this.__equilibrium||!this.__optimized)&&this.playing){raf(function(){update.call(_this);});}
-if(this.__optimized&&this.__equilibrium){_.each(this.equilibriumCallbacks,function(a){a();});}}
-module.exports=Physics;},{"./ParticleSystem":4,"./common":8,"./requestAnimationFrame":11}],6:[function(require,module,exports){var _=require('./common'),Vector=require('./vector');function Spring(a,b,k,d,l){this.constant=k;this.damping=d;this.length=l;this.a=a;this.b=b;this.on=true;}
-_.extend(Spring.prototype,{currentLength:function(){return this.a.position.distanceTo(this.b.position);},update:function(){var a=this.a;var b=this.b;if(!(this.on&&(!a.fixed||!b.fixed)))return this;var a2b=new Vector().sub(a.position,b.position);var d=a2b.length();if(d===0){a2b.clear();}else{a2b.divideScalar(d);}
-var fspring=-1*(d-this.length)*this.constant;var va2b=new Vector().sub(a.velocity,b.velocity);var fdamping=-1*this.damping*va2b.dot(a2b);var fr=fspring+fdamping;a2b.multiplyScalar(fr);if(!a.fixed){a.force.addSelf(a2b);}
-if(!b.fixed){b.force.subSelf(a2b);}
-return this;},resting:function(){var a=this.a;var b=this.b;var l=this.length;return!this.on||(a.fixed&&b.fixed)||(a.fixed&&(l===0?b.position.equals(a.position):b.position.distanceTo(a.position)<=l)&&b.resting())||(b.fixed&&(l===0?a.position.equals(b.position):a.position.distanceTo(b.position)<=l)&&a.resting());}});module.exports=Spring;},{"./common":8,"./vector":12}],7:[function(require,module,exports){var _=require('./common');function Vector(x,y){this.x=x||0;this.y=y||0;}
-_.extend(Vector.prototype,{set:function(x,y){this.x=x;this.y=y;return this;},copy:function(v){this.x=v.x;this.y=v.y;return this;},clear:function(){this.x=0;this.y=0;return this;},clone:function(){return new Vector(this.x,this.y);},add:function(v1,v2){this.x=v1.x+v2.x;this.y=v1.y+v2.y;return this;},addSelf:function(v){this.x+=v.x;this.y+=v.y;return this;},sub:function(v1,v2){this.x=v1.x-v2.x;this.y=v1.y-v2.y;return this;},subSelf:function(v){this.x-=v.x;this.y-=v.y;return this;},multiplySelf:function(v){this.x*=v.x;this.y*=v.y;return this;},multiplyScalar:function(s){this.x*=s;this.y*=s;return this;},multiplyScalarXY:function(sx,sy){this.x*=sx;this.y*=sy;return this;},divideScalar:function(s){if(s){this.x/=s;this.y/=s;}else{this.set(0,0);}
-return this;},negate:function(){return this.multiplyScalar(-1);},dot:function(v){return this.x*v.x+this.y*v.y;},lengthSquared:function(){return this.x*this.x+this.y*this.y;},length:function(){return Math.sqrt(this.lengthSquared());},normalize:function(){return this.divideScalar(this.length());},distanceTo:function(v){return Math.sqrt(this.distanceToSquared(v));},distanceToSquared:function(v){var dx=this.x-v.x,dy=this.y-v.y;return dx*dx+dy*dy;},setLength:function(l){return this.normalize().multiplyScalar(l);},equals:function(v){return(this.distanceTo(v)<0.0001);},lerp:function(v,t){var x=(v.x-this.x)*t+this.x;var y=(v.y-this.y)*t+this.y;return this.set(x,y);},isZero:function(){return(this.length()<0.0001);}});module.exports=Vector;},{"./common":8}],8:[function(require,module,exports){var breaker={};var ArrayProto=Array.prototype;var ObjProto=Object.prototype;var hasOwnProperty=ObjProto.hasOwnProperty;var slice=ArrayProto.slice;var nativeForEach=ArrayProto.forEach;var nativeIndexOf=ArrayProto.indexOf;var toString=ObjProto.toString;var has=function(obj,key){return hasOwnProperty.call(obj,key);};var each=function(obj,iterator,context){if(obj==null)return;if(nativeForEach&&obj.forEach===nativeForEach){obj.forEach(iterator,context);}else if(obj.length===+obj.length){for(var i=0,l=obj.length;i<l;i++){if(i in obj&&iterator.call(context,obj[i],i,obj)===breaker)return;}}else{for(var key in obj){if(_.has(obj,key)){if(iterator.call(context,obj[key],key,obj)===breaker)return;}}}};var identity=function(value){return value;};var sortedIndex=function(array,obj,iterator){iterator||(iterator=identity);var low=0,high=array.length;while(low<high){var mid=(low+high)>>1;iterator(array[mid])<iterator(obj)?low=mid+1:high=mid;}
-return low;};module.exports={has:has,each:each,extend:function(obj){each(slice.call(arguments,1),function(source){for(var prop in source){obj[prop]=source[prop];}});return obj;},indexOf:function(array,item,isSorted){if(array==null)return-1;var i,l;if(isSorted){i=sortedIndex(array,item);return array[i]===item?i:-1;}
-if(nativeIndexOf&&array.indexOf===nativeIndexOf)return array.indexOf(item);for(i=0,l=array.length;i<l;i++)if(i in array&&array[i]===item)return i;return-1;},sortedIndex:sortedIndex,identity:identity,isNumber:function(obj){return toString.call(obj)=='[object Number]';},isFunction:function(obj){return toString.call(obj)=='[object Function]'||typeof obj=='function';},isUndefined:function(obj){return obj===void 0;},isNull:function(obj){return obj===null;}};},{}],"H99CHA":[function(require,module,exports){var root=(function(){return this;})(),previousShortcut=root.Physics;module.exports=root.Physics=require('./Physics');},{"./Physics":5}],"physics":[function(require,module,exports){module.exports=require('H99CHA');},{}],11:[function(require,module,exports){module.exports=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1000/60);};},{}],12:[function(require,module,exports){module.exports=require(7)},{"./common":8}]},{},["H99CHA"])
+  function Attraction(a, b, k, d) {
+
+    this.a = a;
+    this.b = b;
+    this.constant = k;
+    this.on = true;
+    this.distanceMin = d;
+    this.distanceMinSquared = d * d;
+
+  }
+
+  _.extend(Attraction.prototype, {
+
+    update: function() {
+
+     var a = this.a, b = this.b;
+     if (!this.on || (a.fixed && b.fixed)) {
+       return;
+     }
+
+     var a2bx = a.position.x - b.position.x;
+     var a2by = a.position.y - b.position.y;
+
+     var a2b = new Vector().sub(a.position, b.position);
+
+     var a2bdistanceSquared = Math.max(a2b.lengthSquared(), this.distanceMinSquared);
+
+     var force = (this.constant * a.mass * b.mass) / a2bdistanceSquared;
+
+     var length = Math.sqrt(a2bdistanceSquared);
+
+     if (force === 0 || length === 0) {
+       a2b.clear();
+     } else {
+       a2b.divideScalar(length).multiplyScalar(force);
+     }
+
+     if (!a.fixed) {
+       a.force.subSelf(a2b);
+     }
+     if (!b.fixed) {
+       b.force.addSelf(a2b);
+     }
+
+     return this;
+
+    },
+
+    /**
+     * Returns a boolean describing whether the spring is resting or not.
+     * Convenient for knowing whether or not the spring needs another update
+     * tick.
+     *
+     * TODO: Test
+     */
+    resting: function() {
+
+      var a = this.a;
+      var b = this.b;
+      var l = this.distanceMin;
+
+      return !this.on || (a.fixed && b.fixed)
+        || (a.fixed && b.position.distanceTo(a.position) <= l && b.resting())
+        || (b.fixed && a.position.distanceTo(b.position) <= l && a.resting());
+
+    }
+
+  });
+
+  module.exports = Attraction;
+
+},{"./common":8,"./vector":12}],2:[function(require,module,exports){
+var _      = require('./common')
+,   Vector = require('./vector')
+;
+
+  /**
+   * Runge Kutta Integrator
+   * http://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods
+   *
+   * @class
+   */
+  function Integrator(s) {
+    this.s = s;
+    this.originalPositions = [];
+    this.originalVelocities = [];
+    this.k1Forces = [];
+    this.k1Velocities = [];
+    this.k2Forces = [];
+    this.k2Velocities = [];
+    this.k3Forces = [];
+    this.k3Velocities = [];
+    this.k4Forces = [];
+    this.k4Velocities = [];
+  }
+
+  _.extend(Integrator.prototype, {
+
+    allocateParticles: function() {
+
+      while (this.s.particles.length > this.originalPositions.length) {
+        this.originalPositions.push(new Vector());
+        this.originalVelocities.push(new Vector());
+        this.k1Forces.push(new Vector());
+        this.k1Velocities.push(new Vector());
+        this.k2Forces.push(new Vector());
+        this.k2Velocities.push(new Vector());
+        this.k3Forces.push(new Vector());
+        this.k3Velocities.push(new Vector());
+        this.k4Forces.push(new Vector());
+        this.k4Velocities.push(new Vector());
+      }
+
+      return this;
+
+    },
+
+    step: function(dt) {
+
+      var s = this.s;
+      var p, x, y;
+
+      this.allocateParticles();
+
+      _.each(s.particles, function(p, i) {
+        if (!p.fixed) {
+          this.originalPositions[i].copy(p.position);
+          this.originalVelocities[i].copy(p.velocity);
+        }
+        p.force.clear();
+      }, this);
+
+      // K1
+
+      s.applyForces();
+
+      _.each(s.particles, function(p, i) {
+        if (!p.fixed) {
+          this.k1Forces[i].copy(p.force);
+          this.k1Velocities[i].copy(p.velocity);
+        }
+        p.force.clear();
+      }, this);
+
+      // K2
+
+      _.each(s.particles, function(p, i) {
+        if (!p.fixed) {
+
+          var op = this.originalPositions[i];
+          var k1v = this.k1Velocities[i];
+          x = op.x + k1v.x * 0.5 * dt;
+          y = op.y + k1v.y * 0.5 * dt;
+          p.position.set(x, y);
+
+          var ov = this.originalVelocities[i];
+          var k1f = this.k1Forces[i];
+          x = ov.x + k1f.x * 0.5 * dt / p.mass;
+          y = ov.y + k1f.y * 0.5 * dt / p.mass;
+          p.velocity.set(x, y);
+
+        }
+      }, this);
+
+      s.applyForces();
+
+      _.each(s.particles, function(p, i) {
+        if (!p.fixed) {
+          this.k2Forces[i].copy(p.force);
+          this.k2Velocities[i].copy(p.velocity);
+        }
+        p.force.clear();
+      }, this);
+
+      // K3
+
+      _.each(s.particles, function(p, i) {
+        if (!p.fixed) {
+
+          var op = this.originalPositions[i];
+          var k2v = this.k2Velocities[i];
+          p.position.set(op.x + k2v.x * 0.5 * dt, op.y + k2v.y * 0.5 * dt);
+
+          var ov = this.originalVelocities[i];
+          var k2f = this.k2Forces[i];
+          p.velocity.set(ov.x + k2f.x * 0.5 * dt / p.mass, ov.y + k2f.y * 0.5 * dt / p.mass);
+        }
+      }, this);
+
+      s.applyForces();
+
+      _.each(s.particles, function(p, i) {
+        if (!p.fixed) {
+          this.k3Forces[i].copy(p.force);
+          this.k3Velocities[i].copy(p.velocity);
+        }
+        p.force.clear();
+      }, this);
+
+      // K4
+
+      _.each(s.particles, function(p, i) {
+        if (!p.fixed) {
+
+          var op = this.originalPositions[i];
+          var k3v = this.k3Velocities[i];
+          p.position.set(op.x + k3v.x * dt, op.y + k3v.y * dt)
+
+          var ov = this.originalVelocities[i];
+          var k3f = this.k3Forces[i];
+          p.velocity.set(ov.x + k3f.x * dt / p.mass, ov.y + k3f.y * dt / p.mass);
+        }
+      }, this);
+
+      s.applyForces();
+
+      _.each(s.particles, function(p, i) {
+        if (!p.fixed) {
+          this.k4Forces[i].copy(p.force);
+          this.k4Velocities[i].copy(p.velocity);
+        }
+      }, this);
+
+      // TOTAL
+
+      _.each(s.particles, function(p, i) {
+
+        p.age += dt;
+
+        if (!p.fixed) {
+
+          var op = this.originalPositions[i];
+          var k1v = this.k1Velocities[i];
+          var k2v = this.k2Velocities[i];
+          var k3v = this.k3Velocities[i];
+          var k4v = this.k4Velocities[i];
+
+          var x = op.x + dt / 6.0 * (k1v.x + 2.0 * k2v.x + 2.0 * k3v.x + k4v.x);
+          var y = op.y + dt / 6.0 * (k1v.y + 2.0 * k2v.y + 2.0 * k3v.y + k4v.y);
+
+          p.position.set(x, y);
+
+          var ov = this.originalVelocities[i];
+          var k1f = this.k1Forces[i];
+          var k2f = this.k2Forces[i];
+          var k3f = this.k3Forces[i];
+          var k4f = this.k4Forces[i];
+
+          x = ov.x + dt / (6.0 * p.mass) * (k1f.x + 2.0 * k2f.x + 2.0 * k3f.x + k4f.x);
+          y = ov.y + dt / (6.0 * p.mass) * (k1f.y + 2.0 * k2f.y + 2.0 * k3f.y + k4f.y);
+
+          p.velocity.set(x, y);
+
+        }
+
+      }, this);
+
+      return this;
+
+    }
+
+  });
+
+  module.exports = Integrator;
+
+},{"./common":8,"./vector":12}],3:[function(require,module,exports){
+var _      = require('./common')
+,   Vector = require('./vector')
+;
+
+  function Particle(mass) {
+
+    this.position = new Vector();
+    this.velocity = new Vector();
+    this.force = new Vector();
+    this.mass = mass;
+    this.fixed = false;
+    this.age = 0;
+    this.dead = false;
+
+  }
+
+  _.extend(Particle.prototype, {
+
+    /**
+     * Get the distance between two particles.
+     */
+    distanceTo: function(p) {
+      return this.position.distanceTo(p.position);
+    },
+
+    /**
+     * Make the particle fixed in 2D space.
+     */
+    makeFixed: function() {
+      this.fixed = true;
+      this.velocity.clear();
+      return this;
+    },
+
+    /**
+     * Reset a particle.
+     */
+    reset: function() {
+
+      this.age = 0;
+      this.dead = false;
+      this.position.clear();
+      this.velocity.clear();
+      this.force.clear();
+      this.mass = 1.0;
+
+      return this;
+    },
+
+    /**
+     * Returns a boolean describing whether the particle is in movement.
+     */
+    resting: function() {
+      return this.fixed || this.velocity.isZero() && this.force.isZero();
+    }
+
+  });
+
+  module.exports = Particle;
+
+},{"./common":8,"./vector":12}],4:[function(require,module,exports){
+var _          = require('./common')
+,   Vector     = require('./Vector')
+,   Particle   = require('./Particle')
+,   Spring     = require('./Spring')
+,   Attraction = require('./Attraction')
+,   Integrator = require('./Integrator')
+;
+
+  /**
+   * traer.js
+   * A particle-based physics engine ported from Jeff Traer's Processing
+   * library to JavaScript. This version is intended for use with the
+   * HTML5 canvas element. It is dependent on Three.js' Vector2 class,
+   * but can be overridden with any Vector2 class with the methods included.
+   *
+   * @author Jeffrey Traer Bernstein <jeff TA traer TOD cc> (original Java library)
+   * @author Adam Saponara <saponara TA gmail TOD com> (JavaScript port)
+   * @author Jono Brandel <http://jonobr1.com/> (requirified/optimization port)
+   * @author David Schoonover <http://less.ly> (Node/CommonJS/Browserify port)
+   *
+   * @version 0.3
+   * @date March 25, 2012
+   */
+
+  /**
+   * The whole kit and kaboodle.
+   *
+   * @class
+   */
+  function ParticleSystem() {
+
+    this.__equilibriumCriteria = { particles: true, springs: true, attractions: true };
+    this.__equilibrium = false; // are we at equilibrium?
+    this.__optimized = false;
+
+    this.particles = [];
+    this.springs = [];
+    this.attractions = [];
+    this.forces = [];
+    this.integrator = new Integrator(this);
+    this.hasDeadParticles = false;
+
+    var args = arguments.length;
+
+    if (args === 1) {
+      this.gravity = new Vector(0, arguments[0]);
+      this.drag = ParticleSystem.DEFAULT_DRAG;
+    } else if (args === 2) {
+      this.gravity = new Vector(0, arguments[0]);
+      this.drag = arguments[1];
+    } else if (args === 3) {
+      this.gravity = new Vector(arguments[0], arguments[1]);
+      this.drag = arguments[3];
+    } else {
+      this.gravity = new Vector(0, ParticleSystem.DEFAULT_GRAVITY);
+      this.drag = ParticleSystem.DEFAULT_DRAG;
+    }
+
+  }
+
+  _.extend(ParticleSystem, {
+
+    DEFAULT_GRAVITY: 0,
+
+    DEFAULT_DRAG: 0.001,
+
+    Attraction: Attraction,
+
+    Integrator: Integrator,
+
+    Particle: Particle,
+
+    Spring: Spring,
+
+    Vector: Vector
+
+  });
+
+  _.extend(ParticleSystem.prototype, {
+
+    /**
+     * Set whether to optimize the simulation. This enables the check of whether
+     * particles are moving.
+     */
+    optimize: function(b) {
+      this.__optimized = !!b;
+      return this;
+    },
+
+    /**
+     * Set the gravity of the ParticleSystem.
+     */
+    setGravity: function(x, y) {
+      this.gravity.set(x, y);
+      return this;
+    },
+
+    /**
+    * Sets the criteria for equilibrium
+    */
+    setEquilibriumCriteria: function(particles, springs, attractions) {
+      this.__equilibriumCriteria.particles = !!particles;
+      this.__equilibriumCriteria.springs = !!springs;
+      this.__equilibriumCriteria.attractions = !!attractions;
+    },
+
+    /**
+     * Update the integrator
+     */
+    tick: function() {
+      this.integrator.step(arguments.length === 0 ? 1 : arguments[0]);
+      if (this.__optimized) {
+        this.__equilibrium = !this.needsUpdate();
+      }
+      return this;
+    },
+
+    /**
+     * Checks all springs and attractions to see if the contained particles are
+     * inert / resting and returns a boolean.
+     */
+    needsUpdate: function() {
+      var i = 0;
+
+      if(this.__equilibriumCriteria.particles) {
+        for (i = 0, l = this.particles.length; i < l; i++) {
+          if (!this.particles[i].resting()) {
+            return true;
+          }
+        }
+      }
+
+      if(this.__equilibriumCriteria.springs) {
+        for (i = 0, l = this.springs.length; i < l; i++) {
+          if (!this.springs[i].resting()) {
+            return true;
+          }
+        }
+      }
+
+      if(this.__equilibriumCriteria.attractions) {
+        for (i = 0, l = this.attractions.length; i < l; i++) {
+          if (!this.attractions[i].resting()) {
+            return true;
+          }
+        }
+      }
+
+      return false;
+
+    },
+
+    /**
+     * Add a particle to the ParticleSystem.
+     */
+    addParticle: function(p) {
+
+      this.particles.push(p);
+      return this;
+
+    },
+
+    /**
+     * Add a spring to the ParticleSystem.
+     */
+    addSpring: function(s) {
+
+      this.springs.push(s);
+      return this;
+
+    },
+
+    /**
+     * Add an attraction to the ParticleSystem.
+     */
+    addAttraction: function(a) {
+
+      this.attractions.push(a);
+      return this;
+
+    },
+
+    /**
+     * Makes and then adds Particle to ParticleSystem.
+     */
+    makeParticle: function(m, x, y) {
+
+      var mass = _.isNumber(m) ? m : 1.0;
+      var x = x || 0;
+      var y = y || 0;
+
+      var p = new Particle(mass);
+      p.position.set(x, y);
+      this.addParticle(p);
+      return p;
+
+    },
+
+    /**
+     * Makes and then adds Spring to ParticleSystem.
+     */
+    makeSpring: function(a, b, k, d, l) {
+
+      var s = new Spring(a, b, k, d, l);
+      this.addSpring(s);
+      return s;
+
+    },
+
+    /**
+     * Makes and then adds Attraction to ParticleSystem.
+     */
+    makeAttraction: function(a, b, k, d) {
+
+      var a = new Attraction(a, b, k, d);
+      this.addAttraction(a);
+      return a;
+
+    },
+
+    /**
+     * Wipe the ParticleSystem clean.
+     */
+    clear: function() {
+
+      this.particles.length = 0;
+      this.springs.length = 0;
+      this.attractions.length = 0;
+
+    },
+
+    /**
+     * Calculate and apply forces.
+     */
+    applyForces: function() {
+
+      if (!this.gravity.isZero()) {
+        _.each(this.particles, function(p) {
+          p.force.addSelf(this.gravity);
+        }, this);
+      }
+
+      var t = new Vector();
+
+      _.each(this.particles, function(p) {
+        t.set(p.velocity.x * -1 * this.drag, p.velocity.y * -1 * this.drag);
+        p.force.addSelf(t);
+      }, this);
+
+      _.each(this.springs, function(s) {
+        s.update();
+      });
+
+      _.each(this.attractions, function(a) {
+        a.update();
+      });
+
+      _.each(this.forces, function(f) {
+        f.update();
+      });
+
+      return this;
+
+    },
+
+    /**
+     * Clear all particles in the system.
+     */
+    clearForces: function() {
+      _.each(this.particles, function(p) {
+        p.clear();
+      });
+      return this;
+    }
+
+  });
+
+  module.exports = ParticleSystem;
+
+},{"./Attraction":1,"./Integrator":2,"./Particle":3,"./Spring":6,"./Vector":7,"./common":8}],5:[function(require,module,exports){
+var _              = require('./common')
+,   raf            = require('./requestAnimationFrame')
+,   ParticleSystem = require('./ParticleSystem')
+;
+
+  var updates = [];
+
+  /**
+   * Extended singleton instance of ParticleSystem with convenience methods for
+   * Request Animation Frame.
+   * @class
+   */
+  function Physics() {
+
+    var _this = this;
+
+    this.playing = false;
+
+    ParticleSystem.apply(this, arguments);
+
+    this.animations = [];
+
+    this.equilibriumCallbacks = [];
+
+    update.call(this);
+
+  }
+
+  _.extend(Physics, ParticleSystem, {
+
+    superclass: ParticleSystem
+
+  });
+
+  _.extend(Physics.prototype, ParticleSystem.prototype, {
+
+    /**
+     * Play the animation loop. Doesn't affect whether in equilibrium or not.
+     */
+    play: function() {
+
+      if (this.playing) {
+        return this;
+      }
+
+      this.playing = true;
+      this.__equilibrium = false;
+      update.call(this);
+
+      return this;
+
+    },
+
+    /**
+     * Pause the animation loop. Doesn't affect whether in equilibrium or not.
+     */
+    pause: function() {
+
+      this.playing = false;
+      return this;
+
+    },
+
+    /**
+     * Toggle between playing and pausing the simulation.
+     */
+    toggle: function() {
+
+      if (this.playing) {
+        this.pause();
+      } else {
+        this.play();
+      }
+
+      return this;
+
+    },
+
+    onUpdate: function(func) {
+
+      if (_.indexOf(this.animations, func) >= 0 || !_.isFunction(func)) {
+        return this;
+      }
+
+      this.animations.push(func);
+
+      return this;
+
+    },
+
+    onEquilibrium: function(func) {
+
+      if (_.indexOf(this.equilibriumCallbacks, func) >= 0 || !_.isFunction(func)) {
+        return this;
+      }
+
+      this.equilibriumCallbacks.push(func);
+
+      return this;
+
+    },
+
+    /**
+     * Call update after values in the system have changed and this will fire
+     * it's own Request Animation Frame to update until things have settled
+     * to equilibrium — at which point the system will stop updating.
+     */
+    update: function() {
+
+      if (!this.__equilibrium) {
+        return this;
+      }
+
+      this.__equilibrium = false;
+      if (this.playing) {
+        update.call(this);
+      }
+
+      return this;
+
+    }
+
+  });
+
+  function update() {
+
+    var _this = this;
+
+    this.tick();
+
+    _.each(this.animations, function(a) {
+      a();
+    });
+
+    if ((this.__optimized && !this.__equilibrium || !this.__optimized) && this.playing) {
+
+      raf(function() {
+        update.call(_this);
+      });
+
+    }
+
+    if (this.__optimized && this.__equilibrium){
+
+      _.each(this.equilibriumCallbacks, function(a) {
+        a();
+      });
+
+    }
+
+  }
+
+  module.exports = Physics;
+
+
+},{"./ParticleSystem":4,"./common":8,"./requestAnimationFrame":11}],6:[function(require,module,exports){
+var _      = require('./common')
+,   Vector = require('./vector')
+;
+
+  function Spring(a, b, k, d, l) {
+
+    this.constant = k;
+    this.damping = d;
+    this.length = l;
+    this.a = a;
+    this.b = b;
+    this.on = true;
+
+  }
+
+  _.extend(Spring.prototype, {
+
+    /**
+     * Returns the distance between particle a and particle b
+     * in 2D space.
+     */
+    currentLength: function() {
+      return this.a.position.distanceTo(this.b.position);
+    },
+
+    /**
+     * Update spring logic.
+     */
+    update: function() {
+
+      var a = this.a;
+      var b = this.b;
+      if (!(this.on && (!a.fixed || !b.fixed))) return this;
+
+      var a2b = new Vector().sub(a.position, b.position);
+      var d = a2b.length();
+
+      if (d === 0) {
+        a2b.clear();
+      } else {
+        a2b.divideScalar(d);  // Essentially normalize
+      }
+
+      var fspring = -1 * (d - this.length) * this.constant;
+
+      var va2b = new Vector().sub(a.velocity, b.velocity);
+
+      var fdamping = -1 * this.damping * va2b.dot(a2b);
+
+      var fr = fspring + fdamping;
+
+      a2b.multiplyScalar(fr);
+
+      if (!a.fixed) {
+        a.force.addSelf(a2b);
+      }
+      if (!b.fixed) {
+        b.force.subSelf(a2b);
+      }
+
+      return this;
+
+    },
+
+    /**
+     * Returns a boolean describing whether the spring is resting or not.
+     * Convenient for knowing whether or not the spring needs another update
+     * tick.
+     */
+    resting: function() {
+
+      var a = this.a;
+      var b = this.b;
+      var l = this.length;
+
+      return !this.on || (a.fixed && b.fixed)
+        || (a.fixed && (l === 0 ? b.position.equals(a.position) : b.position.distanceTo(a.position) <= l) && b.resting())
+        || (b.fixed && (l === 0 ? a.position.equals(b.position) : a.position.distanceTo(b.position) <= l) && a.resting());
+
+    }
+
+  });
+
+  module.exports = Spring;
+
+
+},{"./common":8,"./vector":12}],7:[function(require,module,exports){
+/**
+ * @author mr.doob / http://mrdoob.com/
+ * @author philogb / http://blog.thejit.org/
+ * @author egraether / http://egraether.com/
+ * @author zz85 / http://www.lab4games.net/zz85/blog
+ * @author jonobr1 / http://jonobr1.com/
+ */
+
+var _ = require('./common');
+
+  /**
+   * A two dimensional vector.
+   */
+  function Vector(x, y) {
+
+    this.x = x || 0;
+    this.y = y || 0;
+
+  }
+
+  _.extend(Vector.prototype, {
+
+    set: function(x, y) {
+      this.x = x;
+      this.y = y;
+      return this;
+    },
+
+    copy: function(v) {
+      this.x = v.x;
+      this.y = v.y;
+      return this;
+    },
+
+    clear: function() {
+      this.x = 0;
+      this.y = 0;
+      return this;
+    },
+
+    clone: function() {
+      return new Vector(this.x, this.y);
+    },
+
+    add: function(v1, v2) {
+      this.x = v1.x + v2.x;
+      this.y = v1.y + v2.y;
+      return this;
+    },
+
+    addSelf: function(v) {
+      this.x += v.x;
+      this.y += v.y;
+      return this;
+    },
+
+    sub: function(v1, v2) {
+      this.x = v1.x - v2.x;
+      this.y = v1.y - v2.y;
+      return this;
+    },
+
+    subSelf: function(v) {
+      this.x -= v.x;
+      this.y -= v.y;
+      return this;
+    },
+
+    multiplySelf: function(v) {
+      this.x *= v.x;
+      this.y *= v.y;
+      return this;
+    },
+
+    multiplyScalar: function(s) {
+      this.x *= s;
+      this.y *= s;
+      return this;
+    },
+
+    multiplyScalarXY: function(sx,sy) {
+      this.x *= sx;
+      this.y *= sy;
+      return this;
+    },
+
+    divideScalar: function(s) {
+      if (s) {
+        this.x /= s;
+        this.y /= s;
+      } else {
+        this.set(0, 0);
+      }
+      return this;
+    },
+
+    negate: function() {
+      return this.multiplyScalar(-1);
+    },
+
+    dot: function(v) {
+      return this.x * v.x + this.y * v.y;
+    },
+
+    lengthSquared: function() {
+      return this.x * this.x + this.y * this.y;
+    },
+
+    length: function() {
+      return Math.sqrt(this.lengthSquared());
+    },
+
+    normalize: function() {
+      return this.divideScalar(this.length());
+    },
+
+    distanceTo: function(v) {
+      return Math.sqrt(this.distanceToSquared(v));
+    },
+
+    distanceToSquared: function(v) {
+      var dx = this.x - v.x, dy = this.y - v.y;
+      return dx * dx + dy * dy;
+    },
+
+    setLength: function(l) {
+      return this.normalize().multiplyScalar(l);
+    },
+
+    equals: function(v) {
+      return (this.distanceTo(v) < 0.0001 /* almost same position */);
+    },
+
+    lerp: function(v, t) {
+      var x = (v.x - this.x) * t + this.x;
+      var y = (v.y - this.y) * t + this.y;
+      return this.set(x, y);
+    },
+
+    isZero: function() {
+      return (this.length() < 0.0001 /* almost zero */ );
+    }
+
+  });
+
+  module.exports = Vector;
+
+},{"./common":8}],8:[function(require,module,exports){
+
+  /**
+   * Pulled only what's needed from:
+   *
+   * Underscore.js 1.3.3
+   * (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
+   * http://documentcloud.github.com/underscore
+   */
+
+  var breaker = {};
+  var ArrayProto = Array.prototype;
+  var ObjProto = Object.prototype;
+  var hasOwnProperty = ObjProto.hasOwnProperty;
+  var slice = ArrayProto.slice;
+  var nativeForEach = ArrayProto.forEach;
+  var nativeIndexOf      = ArrayProto.indexOf;
+  var toString = ObjProto.toString;
+
+  var has = function(obj, key) {
+    return hasOwnProperty.call(obj, key);
+  };
+
+  var each = function(obj, iterator, context) {
+
+    if (obj == null) return;
+        if (nativeForEach && obj.forEach === nativeForEach) {
+          obj.forEach(iterator, context);
+        } else if (obj.length === +obj.length) {
+          for (var i = 0, l = obj.length; i < l; i++) {
+            if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
+          }
+        } else {
+          for (var key in obj) {
+            if (_.has(obj, key)) {
+              if (iterator.call(context, obj[key], key, obj) === breaker) return;
+            }
+          }
+        }
+
+  };
+
+  var identity = function(value) {
+    return value;
+  };
+
+  var sortedIndex = function(array, obj, iterator) {
+    iterator || (iterator = identity);
+    var low = 0, high = array.length;
+    while (low < high) {
+      var mid = (low + high) >> 1;
+      iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;
+    }
+    return low;
+  };
+
+  module.exports = {
+
+    has: has,
+
+    each: each,
+
+    extend: function(obj) {
+      each(slice.call(arguments, 1), function(source) {
+        for (var prop in source) {
+          obj[prop] = source[prop];
+        }
+      });
+      return obj;
+    },
+
+    indexOf: function(array, item, isSorted) {
+      if (array == null) return -1;
+      var i, l;
+      if (isSorted) {
+        i = sortedIndex(array, item);
+        return array[i] === item ? i : -1;
+      }
+      if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
+      for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;
+      return -1;
+    },
+
+    sortedIndex: sortedIndex,
+
+    identity: identity,
+
+    isNumber: function(obj) {
+      return toString.call(obj) == '[object Number]';
+    },
+
+    isFunction: function(obj) {
+      return toString.call(obj) == '[object Function]' || typeof obj == 'function';
+    },
+
+    isUndefined: function(obj) {
+      return obj === void 0;
+    },
+
+    isNull: function(obj) {
+      return obj === null;
+    }
+
+  };
+
+
+},{}],"H99CHA":[function(require,module,exports){
+var root = (function(){ return this; })()
+,   previousShortcut = root.Physics
+;
+
+module.exports = root.Physics = require('./Physics');
+
+},{"./Physics":5}],"physics":[function(require,module,exports){
+module.exports=require('H99CHA');
+},{}],11:[function(require,module,exports){
+  /*
+   * Requirified version of Paul Irish's request animation frame.
+   * http://paulirish.com/2011/requestanimationframe-for-smart-animating/
+   */
+module.exports =
+          window.requestAnimationFrame       ||
+          window.webkitRequestAnimationFrame ||
+          window.mozRequestAnimationFrame    ||
+          window.oRequestAnimationFrame      ||
+          window.msRequestAnimationFrame     ||
+          function (callback) {
+            window.setTimeout(callback, 1000 / 60);
+          };
+
+},{}],12:[function(require,module,exports){
+module.exports=require(7)
+},{"./common":8}]},{},["H99CHA"])

+ 71 - 1
sites/all/modules/figli/edlp_corpus/assets/dist/styles/corpus.min.css

@@ -1 +1,71 @@
-canvas#corpus-map{position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;top:0;left:0;z-index:0}canvas#corpus-map.de-activated{background-color:#f4f4f4}div.node-popup{z-index:10;position:absolute;-webkit-box-sizing:content-box;box-sizing:content-box;width:300px;min-height:30px;top:60%;left:30%;pointer-events:none}div.node-popup .inner{padding:.6em;outline:red solid 1px;background-color:#fff}div.node-popup:before{content:"";position:absolute;width:60px;height:0;border-top:1px solid red}div.node-popup[pos=bottom-right]{-webkit-transform:translateY(42px) translateX(42px);transform:translateY(42px) translateX(42px)}div.node-popup[pos=bottom-right]:before{top:-1px;left:-61px;-webkit-transform-origin:bottom right;transform-origin:bottom right;-webkit-transform:rotateZ(45deg);transform:rotateZ(45deg)}div.node-popup[pos=bottom-left]{-webkit-transform:translateX(-100%) translateY(42px) translateX(-42px);transform:translateX(-100%) translateY(42px) translateX(-42px)}div.node-popup[pos=bottom-left]:before{top:calc(100% +1px);left:100%;-webkit-transform-origin:top left;transform-origin:top left;-webkit-transform:rotateZ(-45deg);transform:rotateZ(-45deg)}div.node-popup[pos=top-left]{-webkit-transform:translateY(-100%) translateX(-100%) translateY(-42px) translateX(-42px);transform:translateY(-100%) translateX(-100%) translateY(-42px) translateX(-42px)}div.node-popup[pos=top-left]:before{bottom:0;left:100%;-webkit-transform-origin:top left;transform-origin:top left;-webkit-transform:rotateZ(45deg);transform:rotateZ(45deg)}div.node-popup[pos=top-right]{-webkit-transform:translateY(-100%) translateY(-42px) translateX(42px);transform:translateY(-100%) translateY(-42px) translateX(42px)}div.node-popup[pos=top-right]:before{top:calc(100% + 1px);left:-61px;-webkit-transform-origin:top right;transform-origin:top right;-webkit-transform:rotateZ(-45deg);transform:rotateZ(-45deg)}
+canvas#corpus-map {
+  position: absolute;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  top: 0;
+  left: 0;
+  z-index: 0; }
+  canvas#corpus-map.de-activated {
+    background-color: #f4f4f4; }
+
+div.node-popup {
+  z-index: 10;
+  position: absolute;
+  -webkit-box-sizing: content-box;
+  box-sizing: content-box;
+  width: 300px;
+  min-height: 30px;
+  pointer-events: none;
+  top: 60%;
+  left: 30%;
+  pointer-events: none; }
+  div.node-popup .inner {
+    padding: 0.6em;
+    outline: 1px solid red;
+    background-color: white; }
+  div.node-popup:before {
+    content: "";
+    position: absolute;
+    width: 60px;
+    height: 0;
+    border-top: 1px solid red; }
+  div.node-popup[pos="bottom-right"] {
+    -webkit-transform: translateY(42px) translateX(42px);
+    transform: translateY(42px) translateX(42px); }
+    div.node-popup[pos="bottom-right"]:before {
+      top: -1px;
+      left: -61px;
+      -webkit-transform-origin: bottom right;
+      transform-origin: bottom right;
+      -webkit-transform: rotateZ(45deg);
+      transform: rotateZ(45deg); }
+  div.node-popup[pos="bottom-left"] {
+    -webkit-transform: translateX(-100%) translateY(42px) translateX(-42px);
+    transform: translateX(-100%) translateY(42px) translateX(-42px); }
+    div.node-popup[pos="bottom-left"]:before {
+      top: calc(100% +1px);
+      left: 100%;
+      -webkit-transform-origin: top left;
+      transform-origin: top left;
+      -webkit-transform: rotateZ(-45deg);
+      transform: rotateZ(-45deg); }
+  div.node-popup[pos="top-left"] {
+    -webkit-transform: translateY(-100%) translateX(-100%) translateY(-42px) translateX(-42px);
+    transform: translateY(-100%) translateX(-100%) translateY(-42px) translateX(-42px); }
+    div.node-popup[pos="top-left"]:before {
+      bottom: 0;
+      left: 100%;
+      -webkit-transform-origin: top left;
+      transform-origin: top left;
+      -webkit-transform: rotateZ(45deg);
+      transform: rotateZ(45deg); }
+  div.node-popup[pos="top-right"] {
+    -webkit-transform: translateY(-100%) translateY(-42px) translateX(42px);
+    transform: translateY(-100%) translateY(-42px) translateX(42px); }
+    div.node-popup[pos="top-right"]:before {
+      top: calc(100% + 1px);
+      left: -61px;
+      -webkit-transform-origin: top right;
+      transform-origin: top right;
+      -webkit-transform: rotateZ(-45deg);
+      transform: rotateZ(-45deg); }

+ 1 - 1
sites/all/modules/figli/edlp_corpus/assets/scripts/corpus.js

@@ -144,7 +144,7 @@
       console.warn('corpus load failed', jqxhr.responseText);
     };
     function onCorpusLoaded(data){
-      // console.log('corpus loaded : data', data);
+      console.log('corpus loaded : data', data);
       // console.log('first node', data.nodes[0]);
       // buildParticles(data.nodes);
       initPhysics();

+ 1 - 0
sites/all/modules/figli/edlp_corpus/src/Controller/CorpusController.php

@@ -5,6 +5,7 @@ namespace Drupal\edlp_corpus\Controller;
 use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\workflow\Entity\WorkflowManager;
+use Drupal\Core\Url;
 use Drupal\File\Entity\File;
 // use Symfony\Component\HttpFoundation\JsonResponse;
 use Drupal\Core\Cache\CacheableJsonResponse;

+ 2 - 1
sites/all/modules/figli/edlp_home/edlp_home.module

@@ -23,7 +23,8 @@ function edlp_home_theme($existing, $type, $theme, $path) {
         // 'last_fil_node' => NULL,
         // 'last_production_node' => NULL,
         'promoted_nodes' => array(),
-        'agenda_items' => NULL
+        'agenda_items' => NULL,
+        'entrees_items' => NULL,
       ),
     ),
   );

+ 8 - 0
sites/all/modules/figli/edlp_home/edlp_home.routing.yml

@@ -13,3 +13,11 @@ edlp_home.home:
     _title: 'Home'
   requirements:
     _permission: 'access content'
+
+edlp_home.home_mobile:
+  path: '/home_m'
+  defaults:
+    _controller: '\Drupal\edlp_home\Controller\HomeController::home_mobile'
+    _title: 'Home'
+  requirements:
+    _permission: 'access content'

+ 24 - 6
sites/all/modules/figli/edlp_home/includes/edlp_home.inc

@@ -3,7 +3,8 @@
 use Drupal\Core\Url;
 
 function template_preprocess_edlp_home(&$vars){
-  $view_builder = \Drupal::entityTypeManager()->getViewBuilder('node');
+  $node_view_builder = \Drupal::entityTypeManager()->getViewBuilder('node');
+  $term_view_builder = \Drupal::entityTypeManager()->getViewBuilder('taxonomy_term');
   // dpm($vars);
 
   // render the promoted_nodes
@@ -26,14 +27,14 @@ function template_preprocess_edlp_home(&$vars){
 
     $vars['nodes'][] = array(
       'vm'=>$vm,
-      'build'=>$view_builder->view($node, $vm)
+      'build'=>$node_view_builder->view($node, $vm)
     );
   }
 
   // render the presentation column
   // $vars["presentation"] = array(
   //   "#type"=>"container",
-  //   "pres"=>$view_builder->view($vars["presentation_node"], 'default'),
+  //   "pres"=>$node_view_builder->view($vars["presentation_node"], 'default'),
   //   "link"=> array(
   //     '#title' => t('Visiter la collection sonore.'),
   //     '#type' => 'link',
@@ -48,7 +49,7 @@ function template_preprocess_edlp_home(&$vars){
   // render the last fil column
   // $vars["last_fil"] = array(
   //   "#type" => "container",
-  //   // 'fil' => $view_builder->view($vars['last_fil_node'], 'teaser'),
+  //   // 'fil' => $node_view_builder->view($vars['last_fil_node'], 'teaser'),
   //   'title'=> array("#markup" => "<h2 class='title'>Dernier Fil</h2>"),
   //   'fil' => $vars['last_fil_node'],
   //   // 'links' => array(
@@ -80,7 +81,7 @@ function template_preprocess_edlp_home(&$vars){
   // render the last production column
   // $vars["last_production"] = array(
   //   '#type' => 'container',
-  //   'prod' => $view_builder->view($vars['last_production_node'], 'teaser'),
+  //   'prod' => $node_view_builder->view($vars['last_production_node'], 'teaser'),
   //   'link'=> array(
   //     '#title' => t('Voir toutes les productions.'),
   //     '#type' => 'link',
@@ -105,8 +106,25 @@ function template_preprocess_edlp_home(&$vars){
   );
 
   foreach($vars['agenda_items'] as $node){
-    $agenda['list']['#items'][] = $view_builder->view($node, 'teaser');
+    $agenda['list']['#items'][] = $node_view_builder->view($node, 'teaser');
   }
   $vars['agenda'] = render($agenda);
 
+  if(isset($vars['entrees_items'])){
+    $entrees = array(
+      '#type'=>"container",
+      // 'title'=>array(
+      //   '#markup'=>"<h3>".t("Entries")."</h3>",
+      // ),
+      'list'=> array(
+        '#theme' => 'item_list',
+        '#items' => [],
+      ),
+    );
+    foreach($vars['entrees_items'] as $term){
+      $entrees['list']['#items'][] = $term_view_builder->view($term, 'home_mobile');
+    }
+    $vars['entrees'] = render($entrees);
+  }
+
 }

+ 150 - 1
sites/all/modules/figli/edlp_home/src/Controller/HomeController.php

@@ -4,13 +4,15 @@ namespace Drupal\edlp_home\Controller;
 
 use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\Datetime\DrupalDateTime;
+use Drupal\taxonomy\Entity\Term;
+use Drupal\workflow\Entity\WorkflowManager;
 use Symfony\Component\HttpFoundation\JsonResponse;
 
 
 class HomeController extends ControllerBase {
 
   /**
-   * Display agenda as a page.
+   * Display home as a page.
    *
    * @return renderable array
    */
@@ -84,6 +86,153 @@ class HomeController extends ControllerBase {
     $events = $query->execute();
     $contents['#agenda_items'] = entity_load_multiple('node', $events);
 
+    return $contents;
+  }
+  /**
+   * Display agenda as a page.
+   *
+   * @return renderable array
+   */
+  public function home_mobile() {
+
+    // $view_builder = \Drupal::entityTypeManager()->getViewBuilder('node');
+
+    $contents = array("#theme"=>'edlp_home');
+
+    // first get static pages
+    $query = \Drupal::entityQuery('node')
+      ->condition('status', 1)
+      ->condition('field_afficher_en_page_d_acceuil', 1)
+      ->condition('type', 'static');
+
+    $promoted_nids = $query->execute();
+    $contents["#promoted_nodes"] = entity_load_multiple('node', $promoted_nids);
+
+    // then get production pages
+    $query = \Drupal::entityQuery('node')
+      ->condition('status', 1)
+      ->condition('field_afficher_en_page_d_acceuil', 1)
+      ->condition('type', 'page');
+
+    $promoted_nids = $query->execute();
+    $contents["#promoted_nodes"] += entity_load_multiple('node', $promoted_nids);
+
+    // last fil
+    // $query = \Drupal::entityQuery('node')
+    //   ->condition('status', 1)
+    //   ->condition('type', 'fil')
+    //   ->sort('created', 'DESC')
+    //   ->range(0,1);
+    //
+    // $fil = $query->execute();
+    // $contents["#last_fil_node"] = entity_load('node', array_pop($fil));
+    // $contents["#last_fil_node"] = array('#markup'=>'En développement.');
+
+    // agenda
+    $now = new DrupalDateTime('now');
+    $now->setTimezone(new \DateTimeZone(DATETIME_STORAGE_TIMEZONE));
+
+    $query = \Drupal::entityQuery('node')
+      ->condition('status', 1)
+      ->condition('type', 'evenement')
+      ->condition('field_date', $now->format(DATETIME_DATETIME_STORAGE_FORMAT), '>=')
+      ->range(0,5)
+      ->sort('field_date');
+
+    $events = $query->execute();
+    $contents['#agenda_items'] = entity_load_multiple('node', $events);
+
+
+    // entrées
+    $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
+
+    $query = \Drupal::entityQuery('taxonomy_term')
+      // ->sort('weight', 'DESC')
+      // ->sort('name', 'DESC')
+      ->condition('vid', 'entrees');
+
+    $tids = $query->execute();
+    // $terms = entity_load_multiple('taxonomy_term', $tids);
+    // $terms = \Drupal::entityManager()->getStorage('taxonomy_term')->loadMultiple($t‌​erms);
+    $terms = Term::loadMultiple($tids);
+
+    $ordered_terms = [];
+    foreach ($terms as $term) {
+      // remove masqué
+      $sid = WorkflowManager::getCurrentStateId($term, 'field_workflow');
+      if($sid == 'generique_masque') continue;
+      // translate the term
+      $term = \Drupal::service('entity.repository')->getTranslationFromContext($term, $language);
+      $name = $term->getName();
+      $ordered_trans_terms[$name] = $term;
+    }
+
+    ksort($ordered_trans_terms);
+
+    // dsm($terms);
+    // foreach ($ordered_trans_terms as $name => $term) {
+    //   $tid = $term->id();
+    //
+    //   $entree = array(
+    //     'tid'=>$tid
+    //   );
+
+      // term link
+      // $url = Url::fromRoute('entity.taxonomy_term.canonical', ['taxonomy_term'=>$tid]);
+      // $url->setOptions(array(
+      //   'attributes' => array(
+      //     'class' => ['term-'.$tid, 'term-link'],
+      //     'tid'=>$tid,
+      //     'selector' => 'entree-term-link-'.$tid,
+      //     'data-drupal-link-system-path' => $url->getInternalPath()
+      //   )
+      // ));
+      // $entree['term_link'] = Link::fromTextAndUrl($name, $url);
+      // index link
+      // $url = Url::fromRoute('entity.taxonomy_term.canonical', ['taxonomy_term'=>$tid]);
+      // $url->setOptions(array(
+      //   'attributes' => array(
+      //     'class' => ['index-link', 'ajax-link'],
+      //     'viewmode'=>'index',
+      //     'tid'=>$tid,
+      //     'selector' => 'entree-index-link-'.$tid,
+      //     'data-drupal-link-system-path' => $url->getInternalPath()
+      //   )
+      // ));
+      // $entree['index_link'] = Link::fromTextAndUrl('index', $url);
+
+      // notice-link
+      // $url = Url::fromRoute('entity.taxonomy_term.canonical', ['taxonomy_term'=>$tid]);
+      // $url->setOptions(array(
+      //   'attributes' => array(
+      //     'class' => ['notice-link'],
+      //     'viewmode'=>'notice',
+      //     'tid'=>$tid,
+      //     'selector' => 'entree-notice-link-'.$tid,
+      //     'data-drupal-link-system-path' => $url->getInternalPath()
+      //   )
+      // ));
+      // $entree['notice_link'] = Link::fromTextAndUrl('notice', $url);
+
+    //   $entree['description'] = $term->get('description')->value;
+    //
+    //   $entrees[] = $entree;
+    // }
+
+    $contents['#entrees_items'] = $ordered_trans_terms;
+
+    // = array (
+    //   '#theme' => 'blockentrees',
+    //   '#entrees_items' => $entrees,
+    //   '#attached'=>array(
+    //     'library' => array('edlp_corpus/corpus'),
+    //     'drupalSettings' => array(
+    //       'basepath' => base_path()
+    //     )
+    //   )
+    // );
+
+
     return $contents;
   }
 

+ 4 - 0
sites/all/modules/figli/edlp_home/templates/edlp-home.html.twig

@@ -6,3 +6,7 @@
 {% endfor %}
 
 {{ agenda }}
+
+{% if entrees %}
+  {{ entrees }}
+{% endif %}

+ 124 - 3
sites/all/modules/figli/edlp_search/assets/dist/scripts/edlp_search.min.js

@@ -1,4 +1,125 @@
+(function ($, Drupal, drupalSettings) {
 
-(function($,Drupal,drupalSettings){var settings=drupalSettings.edlp_search;var _$body=$('body');var _$container;var _$form;function init(){initEvents();initAjax();};function initEvents(){$('body').on('new-content-ajax-loaded',initAjax).on('edlp_search_search_form-col-closed',onSearchClosed);};function initAjax(){_$form=$('#edlp-search-form:not(.ajax-enabled)');if(!_$form.length)return false;_$form=$('#edlp-search-form:not(.ajax-enabled)').on('submit',onSubmitForm).addClass('ajax-enabled');_$container=_$form.parents('.row');if(!_$container.length){_$container=_$form.parent();}};function onSubmitForm(e){e.preventDefault();var args={};args.keys=$('input[type="search"]',this).val();args.entries=[];$('input[type="checkbox"]:checked','#edit-entries').each(function(index,el){args.entries.push($(this).val());});args.langues=$('input[name="language"]',this).val();args.genres=$('input[name="genres"]',this).val();loadResults(args);return false;};function loadResults(args){_$form.addClass('ajax-loading');_$body.addClass('ajax-loading');$('[theme="edlp_search_results"]',_$container).addClass('ajax-loading');var path=window.location.origin+drupalSettings.path.baseUrl+settings.results_ajax_url;$.getJSON(path,args).done(function(data){onResultsLoaded(data);}).fail(function(jqxhr,textStatus,error){onResultsLoadFail(jqxhr,textStatus,error);});};function onResultsLoaded(data){_$form.removeClass('ajax-loading');_$body.removeClass('ajax-loading');$prev_results=$('[theme="edlp_search_results"]',_$container);if($prev_results.length){$prev_results.replaceWith(data.rendered);}else{_$container.append(data.rendered);}
-_$body.trigger({'type':'search-results-loaded','results':data.results_nids});if(typeof _paq!=='undefined'){var search_name=data.keys+';'+data.langues+';'+data.genres+';'+data.entry_names.join(',');_paq.push(['trackSiteSearch',search_name,'search',data.results_nids.length]);}};function onResultsLoadFail(jqxhr,textStatus,error){void 0;};function onSearchClosed(e){$('div[theme="edlp_search_results"]').remove();_$body.trigger({'type':'search-closed'});}
-init();})(jQuery,Drupal,drupalSettings);
+  var settings = drupalSettings.edlp_search;
+  var _$body = $('body');
+  var _$container;
+  var _$form;
+
+  function init(){
+    // console.log('EdlpSearch Init', settings);
+    initEvents();
+    initAjax();
+  };
+
+  function initEvents(){
+    $('body')
+      .on('new-content-ajax-loaded', initAjax)
+      .on('edlp_search_search_form-col-closed', onSearchClosed);
+  };
+
+  function initAjax(){
+    _$form = $('#edlp-search-form:not(.ajax-enabled)');
+    if(!_$form.length) return false;
+
+    //console.log('EdlpSearch initAjaxForm()');
+    _$form = $('#edlp-search-form:not(.ajax-enabled)')
+      .on('submit', onSubmitForm)
+      .addClass('ajax-enabled');
+    _$container = _$form.parents('.row');
+    if(!_$container.length){
+      _$container = _$form.parent();
+    }
+  };
+
+  function onSubmitForm(e){
+    e.preventDefault();
+    // console.log('onSubmitForm',e);
+    var args = {};
+
+    // search for key words
+    args.keys = $('input[type="search"]', this).val();
+
+    // entries filter
+    args.entries = [];
+    $('input[type="checkbox"]:checked', '#edit-entries').each(function(index, el) {
+      args.entries.push($(this).val());
+    });
+
+    // langues
+    args.langues = $('input[name="language"]', this).val();
+
+    // genres
+    args.genres = $('input[name="genres"]', this).val();
+
+    //console.log('EdlpSearch onSubmitForm() : args',args);
+
+    loadResults(args);
+
+    return false;
+  };
+
+  function loadResults(args){
+    //console.log('EdlpSearch loadResults() : args', args);
+    _$form.addClass('ajax-loading');
+    _$body.addClass('ajax-loading');
+    $('[theme="edlp_search_results"]', _$container).addClass('ajax-loading');
+    var path = window.location.origin + drupalSettings.path.baseUrl +settings.results_ajax_url;
+    $.getJSON(path, args)
+      .done(function(data){
+        onResultsLoaded(data);
+      })
+      .fail(function(jqxhr, textStatus, error){
+        onResultsLoadFail(jqxhr, textStatus, error);
+      });
+  };
+
+  function onResultsLoaded(data){
+    // console.log('EdlpSearch onResultsLoaded()', data);
+    _$form.removeClass('ajax-loading');
+    _$body.removeClass('ajax-loading');
+
+    // insert results col
+    $prev_results = $('[theme="edlp_search_results"]', _$container);
+    if($prev_results.length){
+      $prev_results.replaceWith(data.rendered);
+    }else{
+      _$container.append(data.rendered);
+    }
+
+    // trigger event
+    _$body.trigger({
+      'type':'search-results-loaded',
+      'results':data.results_nids
+    });
+
+
+    // piwik
+    if(typeof _paq !== 'undefined'){
+      // page tracking
+      // https://matomo.org/blog/2017/02/how-to-track-single-page-websites-using-piwik-analytics/
+      // _paq.push(['setCustomUrl', state.url]);
+      // _paq.push(['setDocumentTitle', data.title]);
+      // _paq.push(['trackPageView']);
+
+      // trackEvent(category, action, [name], [value])
+      var search_name = data.keys+';'+data.langues+';'+data.genres+';'+data.entry_names.join(',');
+      // _paq.push(['trackEvent', 'AjaxSearch', 'Results', search_name, data.results_nids.length]);
+      // piwik track searches
+      // trackSiteSearch(keyword, [category], [resultsCount])
+      _paq.push(['trackSiteSearch', search_name, 'search', data.results_nids.length]);
+    }
+  };
+
+  function onResultsLoadFail(jqxhr, textStatus, error){
+    console.warn('EdlpSearch : search results ajax load failed : '+error, jqxhr.responseText);
+  };
+
+  function onSearchClosed(e){
+    // console.log('Edlp Search onSearchClosed()');
+    $('div[theme="edlp_search_results"]').remove();
+    // trigger event
+    _$body.trigger({'type':'search-closed'});
+  }
+
+  init();
+})(jQuery, Drupal, drupalSettings);

File diff suppressed because it is too large
+ 1 - 1
sites/all/modules/figli/edlp_studio/assets/dist/scripts/edlp_studio.min.js


File diff suppressed because it is too large
+ 1 - 33
sites/all/themes/custom/edlptheme/assets/dist/scripts/main.min.js


File diff suppressed because it is too large
+ 1 - 0
sites/all/themes/custom/edlptheme/assets/dist/scripts/redirect.min.js


File diff suppressed because it is too large
+ 0 - 0
sites/all/themes/custom/edlptheme/assets/dist/styles/app.min.css


+ 23 - 2
sites/all/themes/custom/edlptheme/assets/styles/app.scss

@@ -427,14 +427,18 @@ main[role="main"]{
 
   div.taxonomy-term{
     padding-top:1em!important;
-    >h2{
+    &:not(.home_mobile)>h2{
       display:none;
       // @include content_subtitles;
       // margin: 1em 0 0.5em;
     }
+    &.home_mobile h2{
+      margin:0;
+      @include content_big_titles;
+    }
     >.content{
     }
-    .field__label{
+    &:not(.home_mobile).field__label{
       display:none;
       // @include content_titles;
     }
@@ -443,12 +447,29 @@ main[role="main"]{
         margin-bottom: 1em;
       }
     }
+    &.home_mobile .field__label{
+      margin: 0;
+      @include content_titles;
+    }
     article.node--type-enregistrement{
       h2.node-title{
         @include content_subtitles;
         margin:0.9em 0 0 0;
       }
     }
+
+  }
+
+  div.taxonomy-term.vocabulary-entrees.home_mobile{
+    // &:not(:first-of-type){
+      border-bottom: 1px solid red;
+    // }
+    .field--name-field-notice, .index{
+      .field__item, .item-list{
+        overflow: hidden;
+        height:1px;
+      }
+    }
   }
 
   h4.inter-titre{

+ 20 - 0
sites/all/themes/custom/edlptheme/edlptheme.theme

@@ -70,6 +70,21 @@ function edlptheme_form_user_login_form_alter(&$form, FormStateInterface $form_s
   unset($form['pass']['#title']);
 }
 
+/**
+ * Implements hook_theme_suggestions_HOOK_alter().
+ */
+function edlptheme_theme_suggestions_taxonomy_term_alter(&$suggestions, $variables) {
+  $elements = $variables['elements'];
+
+  if (isset($elements['#taxonomy_term']) && isset($elements['#theme']) && isset($elements['#view_mode'])) {
+    $term = $elements['#taxonomy_term'];
+
+    if (is_object($term)) {
+      $suggestions[] = $elements['#theme'] . '__' . $term->getVocabularyId() . '__' . $elements['#view_mode'];
+      $suggestions[] = $elements['#theme'] . '__' . $term->id() . '__' . $elements['#view_mode'];
+    }
+  }
+}
 
 function edlptheme_preprocess_edlp_home(&$vars){
   foreach($vars['nodes'] as &$node){
@@ -89,6 +104,11 @@ function edlptheme_preprocess_edlp_home(&$vars){
     $node['cols'] = $cols;
   }
 }
+
+function edlptheme_preprocess_taxonomy_term__entrees__mobile_home(&$vars){
+  // dpm($vars, 'vars');
+}
+
 function edlptheme_preprocess_edlp_productions(&$vars){
   foreach($vars['nodes'] as &$node){
     switch($node['vm']){

+ 8 - 0
sites/all/themes/custom/edlptheme/templates/content/edlp-home.html.twig

@@ -32,4 +32,12 @@
     </div>
   </div>
 
+  {% if entrees %}
+    <div class="entrees col small-col-12 med-col-4 large-col-3">
+      <div class="wrapper">
+        {{ entrees }}
+      </div>
+    </div>
+  {% endif %}
+
 </div>

+ 42 - 0
sites/all/themes/custom/edlptheme/templates/content/taxonomy-term--entrees--home-mobile.html.twig

@@ -0,0 +1,42 @@
+{#
+/**
+ * @file
+ * Theme override to display a taxonomy term.
+ *
+ * Available variables:
+ * - url: URL of the current term.
+ * - name: Name of the current term.
+ * - content: Items for the content of the term (fields and description).
+ *   Use 'content' to print them all, or print a subset such as
+ *   'content.description'. Use the following code to exclude the
+ *   printing of a given child element:
+ *   @code
+ *   {{ content|without('description') }}
+ *   @endcode
+ * - attributes: HTML attributes for the wrapper.
+ * - page: Flag for the full page state.
+ * - term: The taxonomy term entity, including:
+ *   - id: The ID of the taxonomy term.
+ *   - bundle: Machine name of the current vocabulary.
+ * - view_mode: View mode, e.g. 'full', 'teaser', etc.
+ *
+ * @see template_preprocess_taxonomy_term()
+ */
+#}
+{%
+  set classes = [
+    'taxonomy-term',
+    'vocabulary-' ~ term.bundle|clean_class,
+    view_mode
+  ]
+%}
+<div{{ attributes.setAttribute('id', 'taxonomy-term-' ~ term.id).addClass(classes) }}>
+  {{ title_prefix }}
+  {% if not page %}
+    <h2>{{ name }}</h2>
+  {% endif %}
+  {{ title_suffix }}
+  <div class="content">
+    {{ content }}
+  </div>
+</div>

+ 22 - 7
sites/default/config/sync/core.entity_view_display.node.enregistrement.default.yml

@@ -17,6 +17,7 @@ dependencies:
     - field.field.node.enregistrement.field_workflow
     - node.type.enregistrement
   module:
+    - audiofield
     - text
     - user
 id: node.enregistrement.default
@@ -24,36 +25,50 @@ targetEntityType: node
 bundle: enregistrement
 mode: default
 content:
+  addtoany:
+    weight: 2
+    region: content
+    settings: {  }
+    third_party_settings: {  }
   content_moderation_control:
     weight: -20
     region: content
     settings: {  }
     third_party_settings: {  }
   field_description:
-    weight: 1
+    weight: 0
     label: hidden
     settings: {  }
     third_party_settings: {  }
     type: text_default
     region: content
-  field_entrees:
-    type: entity_reference_label
-    weight: 0
+  field_son:
+    type: audiofield_audioplayer
+    weight: 1
     region: content
     label: hidden
     settings:
-      link: false
+      audio_player: default_mp3_player
+      audio_player_jplayer_theme: none
+      audio_player_wordpress_animation: '1'
+      audio_player_soundmanager_theme: default
+      audio_player_initial_volume: '8'
+      audio_player_lazyload: '1'
+      audio_player_wavesurfer_combine_files: 0
+      audio_player_wordpress_combine_files: 0
+      audio_player_autoplay: 0
+      download_button: 0
+      download_link: 0
     third_party_settings: {  }
 hidden:
-  addtoany: true
   body: true
   chutier_actions: true
   field_collectionneurs: true
+  field_entrees: true
   field_genres: true
   field_langues: true
   field_locuteurs: true
   field_nbr_locuteurs: true
-  field_son: true
   field_transcript_trad: true
   field_transcript_vo: true
   field_workflow: true

+ 8 - 28
sites/default/config/sync/core.entity_view_display.taxonomy_term.entrees.default.yml

@@ -8,46 +8,26 @@ dependencies:
     - field.field.taxonomy_term.entrees.field_workflow
     - taxonomy.vocabulary.entrees
   module:
-    - color_field
-    - options
     - text
 id: taxonomy_term.entrees.default
 targetEntityType: taxonomy_term
 bundle: entrees
 mode: default
 content:
-  description:
-    label: hidden
-    type: text_default
-    weight: 0
-    region: content
-    settings: {  }
-    third_party_settings: {  }
-  field_color:
-    weight: 100
-    label: above
-    settings:
-      format: hex
-      opacity: '1'
-    third_party_settings: {  }
-    type: color_field_formatter_text
-    region: content
   field_notice:
-    weight: 2
-    label: above
+    weight: 0
+    label: visually_hidden
     settings: {  }
     third_party_settings: {  }
     type: text_default
     region: content
-  field_workflow:
-    weight: 3
-    label: above
-    settings: {  }
-    third_party_settings: {  }
-    type: list_default
-    region: content
   index:
-    weight: 99
+    weight: 1
     region: content
+    settings: {  }
+    third_party_settings: {  }
 hidden:
+  description: true
+  field_color: true
+  field_workflow: true
   langcode: true

+ 40 - 0
sites/default/config/sync/core.entity_view_display.taxonomy_term.entrees.home_mobile.yml

@@ -0,0 +1,40 @@
+uuid: c5662355-9c54-42d1-bab4-f5a4142c7a83
+langcode: fr
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.taxonomy_term.home_mobile
+    - field.field.taxonomy_term.entrees.field_color
+    - field.field.taxonomy_term.entrees.field_notice
+    - field.field.taxonomy_term.entrees.field_workflow
+    - taxonomy.vocabulary.entrees
+  module:
+    - text
+id: taxonomy_term.entrees.home_mobile
+targetEntityType: taxonomy_term
+bundle: entrees
+mode: home_mobile
+content:
+  description:
+    type: text_default
+    weight: 0
+    region: content
+    label: hidden
+    settings: {  }
+    third_party_settings: {  }
+  field_notice:
+    weight: 1
+    label: above
+    settings: {  }
+    third_party_settings: {  }
+    type: text_default
+    region: content
+  index:
+    weight: 2
+    region: content
+    settings: {  }
+    third_party_settings: {  }
+hidden:
+  field_color: true
+  field_workflow: true
+  langcode: true

+ 2 - 2
sites/default/config/sync/core.entity_view_display.taxonomy_term.entrees.notice.yml

@@ -16,12 +16,12 @@ bundle: entrees
 mode: notice
 content:
   field_notice:
+    type: text_default
     weight: 0
+    region: content
     label: above
     settings: {  }
     third_party_settings: {  }
-    type: text_default
-    region: content
 hidden:
   description: true
   field_color: true

+ 10 - 0
sites/default/config/sync/core.entity_view_mode.taxonomy_term.home_mobile.yml

@@ -0,0 +1,10 @@
+uuid: 096bce67-4d05-48de-82a9-30332addb135
+langcode: fr
+status: true
+dependencies:
+  module:
+    - taxonomy
+id: taxonomy_term.home_mobile
+label: home_mobile
+targetEntityType: taxonomy_term
+cache: true

+ 3 - 0
sites/default/config/sync/core.extension.yml

@@ -30,6 +30,8 @@ module:
   devel_generate: 0
   domain: 0
   domain_alias: 0
+  domain_config: 0
+  domain_site_settings: 0
   dynamic_page_cache: 0
   editor: 0
   edlp_admin: 0
@@ -73,6 +75,7 @@ module:
   options: 0
   page_cache: 0
   path: 0
+  path_alias_xt: 0
   piwik: 0
   profile: 0
   redirect: 0

+ 11 - 0
sites/default/config/sync/domain_site_settings.domainconfigsettings.yml

@@ -0,0 +1,11 @@
+domain_site_settings: null
+_core:
+  default_config_hash: tkmglv8nLQzpf1cBcgSWFvPzgDJEfiz6bifpEQYXq84
+langcode: fr
+m_encyclopediedelaparole_org:
+  site_name: 'Encyclopédie de la parole'
+  site_slogan: ''
+  site_mail: bachir@figureslibres.io
+  site_frontpage: /home_m
+  site_403: ''
+  site_404: ''

+ 5 - 0
sites/default/config/sync/path_alias_xt.settings.yml

@@ -0,0 +1,5 @@
+user_special: true
+regex_pattern: '{(^node|^user|^taxonomy/term)/([0-9]+)/(.+)}'
+_core:
+  default_config_hash: Eee2yPxbx-GtTowlxw6bfEtn5JdpohybL_OOCy3aUEE
+langcode: fr

+ 15 - 3
sites/default/config/sync/pathauto.pattern.documents.yml

@@ -3,20 +3,32 @@ langcode: fr
 status: true
 dependencies:
   module:
+    - language
     - node
 id: documents
 label: Documents
 type: 'canonical_entities:node'
 pattern: 'documents/[node:title]'
 selection_criteria:
-  88beab32-c4e4-446a-99f7-aaa33b66a902:
+  c7c625e4-3b00-436e-9300-64de1b9c4d9f:
     id: node_type
     bundles:
       enregistrement: enregistrement
     negate: false
     context_mapping:
       node: node
-    uuid: 88beab32-c4e4-446a-99f7-aaa33b66a902
+    uuid: c7c625e4-3b00-436e-9300-64de1b9c4d9f
+  6640f1a2-a0db-4de7-b503-2c9263d94aae:
+    id: language
+    langcodes:
+      fr: fr
+      en: en
+    negate: false
+    context_mapping:
+      language: 'node:langcode:language'
+    uuid: 6640f1a2-a0db-4de7-b503-2c9263d94aae
 selection_logic: and
 weight: -5
-relationships: {  }
+relationships:
+  'node:langcode:language':
+    label: Langue

+ 32 - 1
sites/default/config/sync/pathauto.settings.yml

@@ -1,8 +1,39 @@
 enabled_entity_types:
   - user
 punctuation:
+  double_quotes: 0
+  quotes: 0
+  backtick: 0
+  comma: 0
+  period: 0
   hyphen: 1
-verbose: false
+  underscore: 0
+  colon: 0
+  semicolon: 0
+  pipe: 0
+  left_curly: 0
+  left_square: 0
+  right_curly: 0
+  right_square: 0
+  plus: 0
+  equal: 0
+  asterisk: 0
+  ampersand: 0
+  percent: 0
+  caret: 0
+  dollar: 0
+  hash: 0
+  at: 0
+  exclamation: 0
+  tilde: 0
+  left_parenthesis: 0
+  right_parenthesis: 0
+  question_mark: 0
+  less_than: 0
+  greater_than: 0
+  slash: 0
+  back_slash: 0
+verbose: true
 separator: '-'
 max_length: 100
 max_component_length: 100

Some files were not shown because too many files changed in this diff