Version 1
[yaffs-website] / web / modules / contrib / fontyourface / modules / adobe_edge_fonts / adobe_edge_fonts.module
diff --git a/web/modules/contrib/fontyourface/modules/adobe_edge_fonts/adobe_edge_fonts.module b/web/modules/contrib/fontyourface/modules/adobe_edge_fonts/adobe_edge_fonts.module
new file mode 100644 (file)
index 0000000..5a859a0
--- /dev/null
@@ -0,0 +1,208 @@
+<?php
+
+/**
+ * @file
+ * Adobe Edge Fonts module file.
+ */
+
+/**
+ * Implements hook_fontyourface_api().
+ */
+function adobe_edge_fonts_fontyourface_api() {
+  return [
+    'version' => '3',
+    'name' => 'Adobe Edge',
+  ];
+}
+
+/**
+ * Implements hook_page_attachments().
+ */
+function adobe_edge_fonts_page_attachments(&$page) {
+  $enabled_fonts = &drupal_static('fontyourface_fonts', []);
+  $fonts = [];
+  foreach ($enabled_fonts as $font) {
+    if ($font->pid->value == 'adobe_edge_fonts') {
+      $fonts[] = $font;
+    }
+  }
+  $url = adobe_edge_fonts_generate_font_family_css($fonts);
+  if (!empty($url)) {
+    $page['#attached']['html_head'][] = [
+      [
+        '#type' => 'html_tag',
+        '#tag' => 'script',
+        '#attributes' => [
+          'src' => $url,
+        ],
+      ], 'fontyourface-adobe-edge-fonts',
+    ];
+  }
+}
+
+/**
+ * Implements hook_fontyourface_import().
+ */
+function adobe_edge_fonts_fontyourface_import($font_context = []) {
+  $context = $font_context;
+  if (empty($context['sandbox'])) {
+    $context['sandbox']['fonts'] = _adobe_edge_fonts_get_fonts_from_api();
+    $context['sandbox']['progress'] = 0;
+    $context['sandbox']['max'] = count($context['sandbox']['fonts']);
+  }
+  $font = array_pop($context['sandbox']['fonts']);
+  if (!empty($font)) {
+    fontyourface_save_font($font);
+    $context['message'] = "Imported {$context['sandbox']['progress']} of {$context['sandbox']['max']}";
+    $context['sandbox']['progress'] = $context['sandbox']['max'] - count($context['sandbox']['fonts']);
+    $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
+  }
+  else {
+    drupal_set_message(t('Imported @count fonts from Adobe Edge', ['@count' => $context['sandbox']['progress']]));
+  }
+  return $context;
+}
+
+/**
+ * Generates font family css for multiple fonts.
+ *
+ * @param array $fonts
+ *   Array of FontInterface objects.
+ *
+ * @return string
+ *   URL to load fonts on page.
+ */
+function adobe_edge_fonts_generate_font_family_css(array $fonts) {
+  $font_list = $families = [];
+  $url = '';
+  foreach ($fonts as $font) {
+    $metadata = $font->getMetadata();
+    $font_list[$font->css_family->value][] = $metadata['subset'];
+  }
+  foreach ($font_list as $key => $font) {
+    $families[] = $key . ':' . implode(',', $font);
+  }
+  if (!empty($families)) {
+    $url = 'https://use.edgefonts.net/' . implode(';', $families) . '.js';
+  }
+  return $url;
+}
+
+/**
+ * Retrieves fonts from api and parses them for consumption.
+ *
+ * @return array
+ *   List of fonts ready for ingesting as FontInterface objects.
+ */
+function _adobe_edge_fonts_get_fonts_from_api() {
+  try {
+    $uri = 'https://edgewebfonts.adobe.com/data/fontData.json';
+    $response = \Drupal::httpClient()->get($uri, ['headers' => ['Accept' => 'text/plain'], 'verify' => FALSE]);
+    $data = (string) $response->getBody();
+  }
+  catch (RequestException $e) {
+    drupal_set_message(t('The list of Adobe Edge Fonts could not be fetched. Verify that your server can connect the Adobe Edge Servers (https://edgewebfonts.adobe.com). Error: %error', ['%error' => $e->error]), 'error');
+    return FALSE;
+  }
+
+  $json_fonts_results = json_decode($data);
+  return _adobe_edge_fonts_convert_api_results($json_fonts_results->families);
+}
+
+/**
+ * Converts Adobe Edge Fonts json data into font-compatible format.
+ *
+ * @param array $json_fonts
+ *   Fonts returned from Adobe Edge json endpoint.
+ *
+ * @return array
+ *   Array of objects compatible with Fontyourface interface.
+ */
+function _adobe_edge_fonts_convert_api_results(array $json_fonts) {
+  $fonts = [];
+  foreach ($json_fonts as $json_font) {
+    foreach ($json_font->variations as $json_font_variant) {
+      $font_id = $json_font->name . ' ' . $json_font_variant->name;
+      $css_style = substr($json_font_variant->fvd, 0, 1);
+      $css_weight = substr($json_font_variant->fvd, 1, 1) * 100;
+
+      // Defaults for css style.
+      if ($css_style == 'i') {
+        $css_style = 'italic';
+      }
+      else {
+        $css_style = 'normal';
+      }
+
+      if ($css_weight == '400') {
+        $css_weight = 'normal';
+      }
+      elseif ($css_weight == '700') {
+        $css_weight = 'bold';
+      }
+
+      $font = new stdClass();
+      $font->name = $font_id;
+      $font->url = 'https://edgewebfonts.adobe.com/?font=' . $json_font->slug . '&fvd=' . $json_font_variant->fvd;
+      $font->provider = 'adobe_edge_fonts';
+      $font->css_family = $json_font->slug;
+      $font->css_style = $css_style;
+      $font->css_weight = $css_weight;
+      $font->designer = '';
+      $font->designer_url = '';
+      $font->foundry = '';
+      $font->foundry_url = '';
+      $font->license = 'Font license';
+      $font->license_url = $json_font_variant->eula;
+      $font->classification = $json_font->classification;
+      $font->language = _adobe_edge_fonts_human_languages($json_font->language);
+      $font->tags = [
+        $json_font->contrast,
+      ];
+      $font->metadata = [
+        'id' => $json_font->id,
+        'subset' => $json_font_variant->fvd,
+        'capitals' => $json_font->capitals,
+        'classification' => $json_font->classification,
+        'contrast' => $json_font->contrast,
+        'language' => $json_font->language,
+        'number_style' => $json_font->number_style,
+      ];
+      $fonts[$font_id] = $font;
+    }
+  }
+  return $fonts;
+}
+
+/**
+ * Returns list of human-readable languages.
+ *
+ * @param array $list
+ *   List of allowed languages.
+ *
+ * @return array
+ *   List of allowed lanaguages.
+ */
+function _adobe_edge_fonts_human_languages(array $list) {
+  $languages = [
+    'ca' => 'Catalan',
+    'cs' => 'Czech',
+    'de' => 'German',
+    'en' => 'English',
+    'es' => 'Spanish',
+    'fr' => 'French',
+    'it' => 'Italian',
+    'nl' => 'Dutch',
+    'pl' => 'Polish',
+    'pt' => 'Portuguese',
+    'ru' => 'Russian',
+    'sv' => 'Swedish',
+  ];
+  $new_list = [];
+  foreach ($list as $item) {
+    if (isset($languages[$item])) {
+      $new_list[$item] = $languages[$item];
+    }
+  }
+  return $new_list;
+}