X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fmodules%2Fcontrib%2Ffontyourface%2Fmodules%2Fadobe_edge_fonts%2Fadobe_edge_fonts.module;fp=web%2Fmodules%2Fcontrib%2Ffontyourface%2Fmodules%2Fadobe_edge_fonts%2Fadobe_edge_fonts.module;h=5a859a0531262f49638115ae7dece74fecc1de64;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website 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 index 000000000..5a859a053 --- /dev/null +++ b/web/modules/contrib/fontyourface/modules/adobe_edge_fonts/adobe_edge_fonts.module @@ -0,0 +1,208 @@ + '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; +}