Source code for icomoon.store
import io
import os
import json
from pathlib import Path
from collections import OrderedDict
from .utils import IcomoonSettingsError, extend_webfont_settings
[docs]
class WebfontStore(object):
"""
Webfont store to collect every given manifest.
Store assume every webfont manifest file are located inside their webfont
directory set in their ``fontdir_path`` option.
Store does not create any file, it just parse manifest and store icon maps.
Manifest filename is the same for every webfont, it is given as
``WebfontStore`` init argument ``manifest_filename``, commonly
``selection.json``.
Args:
manifest_filename (string): Manifest filename to search for in webfont
directory.
"""
def __init__(self, manifest_filename):
self.manifest_filename = manifest_filename
self.manifests = OrderedDict()
self.errors = {}
[docs]
def get_icon_key(self, elem):
"""
Return the icon name to be used as a sorting key
"""
return elem.get('properties').get('name')
[docs]
def parse_manifest(self, fp):
"""
Open manifest JSON file and build icon map
Args:
fp (string or fileobject): Either manifest filepath to open or
manifest File object.
Returns:
dict: Webfont icon map. Contains:
* ``class_name``: Builded icon classname with prefix configured
in manifest (from parameters in Icomoon interface);
* ``int``: Icon integer code like ``59649``;
* ``hex``: Icon hexadecimal code like ``0xe901``;
* ``unicode``: Icon unicode like ``U+E901``;
* ``utf8``: Icon UTF8 code like ``\\e901``;
"""
# Given a string for file path to open
if isinstance(fp, str):
fp = io.open(fp, 'r', encoding='utf-8')
elif isinstance(fp, Path):
fp = fp.open()
with fp as json_file:
webfont_manifest = json.load(json_file)
# Get the font set prefix to know the css classname
icon_prefix = webfont_manifest.get('preferences').get('fontPref').get('prefix')
# Get sorted icons
icons_map = OrderedDict()
sorted_entries = sorted(webfont_manifest.get('icons'), key=self.get_icon_key)
for icon_entry in sorted_entries:
name = icon_entry.get('properties').get('name')
code = icon_entry.get('properties').get('code')
hexa_code = hex(code)
icons_map[name] = {
'class_name': icon_prefix + name,
'int': code,
'hex': hexa_code,
'unicode': 'U+'+''.join(hex(code).split('x')[1:]).upper(),
'utf8': '\\'+''.join(hex(code).split('x')[1:]).lower(),
}
return icons_map
[docs]
def get(self, webfont_name, webfont_settings):
"""
Get a manifest file, parse and store it.
Args:
webfont_name (string): Webfont key name. Used to store manifest
and potentially its parser error.
webfont_settings (dict): Webfont settings (an item value from
``settings.ICOMOON_WEBFONTS``).
"""
try:
webfont_settings = extend_webfont_settings(webfont_settings)
except IcomoonSettingsError as e:
msg = "Invalid webfont settings for '{}': {}"
self.errors[webfont_name] = msg.format(webfont_name, e.value)
return
filepath = os.path.join(webfont_settings['fontdir_path'],
self.manifest_filename)
if os.path.exists(filepath):
self.manifests[webfont_name] = self.parse_manifest(filepath)
else:
msg = ("""Filepath for webfont <strong>{name}</strong> does not """
"""exists: <code>{filepath}</code>""")
self.errors[webfont_name] = msg.format(name=webfont_name,
filepath=filepath)
[docs]
def fetch(self, webfonts):
"""
Store every defined webfonts.
Webfont are stored with sort on their name.
Args:
webfonts (dict): Dictionnary of webfont settings from
``settings.ICOMOON_WEBFONTS``.
"""
sorted_keys = sorted(webfonts.keys())
for webfont_name in sorted_keys:
self.get(webfont_name, webfonts[webfont_name])
[docs]
def get_manifests(self):
"""
Simple shortcut to get stored manifests.
Returns:
collections.OrderedDict: Stored webfont manifest.
"""
return self.manifests