def new_markdown(item_type, title=None, **kwargs): # Some defaults now = datetime.now() # FIXME Timezones are hard. Hard coding for now. now = pytz.timezone('America/New_York').localize(now) text = "" metas = ['itemtype: %s' % item_type, 'guid: %s' % uuid.uuid4()] for key in kwargs: metas.append('%s: %s' % (key, kwargs[key])) if 'created' not in kwargs: metas.append('updated: %s' % now.isoformat()) if 'updated' not in kwargs: metas.append('updated: %s' % now.isoformat()) if 'category' not in kwargs: metas.append('category: uncategorized') text = text + ''' For SEO, please assign a keyword-rich category like "keyword/seo" above. It will be used to generate a URL. ''' if title: metas.append('slug: %s' % slugify(title)) metas.append('title: %s' % title) else: metas.append('slug:') metas.append('title:') text = text + ''' You need to set a title and slug. Slug will be used to generate a URL. ''' return "\n".join(metas) + "\n\n" + text
def to_archetype(archivist, text): "Given text in markdown format, returns a dict of metadata and body text." timezone = archivist.siteconfig.get('timezone', pytz.utc) html = md.convert(text) metadata = md.Meta itemmeta = {} catalogmeta = {} # Here we implement some special case transforms for data that may need # cleanup or is hard to encode using markdown's simple format. for key, value in metadata.items(): if key in ['created', 'date', 'published', 'updated']: # because humans are sloppy, we parse and normalize date values dt = parse_date(value[0]) if dt.tzinfo: dt = dt.astimezone(timezone) else: dt = timezone.localize(dt) if key == 'date': # Legacy DC.date, convert to specific key == 'published' itemmeta[key] = dt.isoformat() elif key == 'itemtype': itemmeta['itemtype'] = string.capwords(metadata['itemtype'][0], '/') elif key == 'author': itemmeta["attribution"] = [{"role": "author", "name": metadata[key][0]}] elif key == "copyright": # Typical usage provides only notice itemmeta["rights"] = {"copyright_notice": metadata[key][0]} elif key.startswith("rights-"): if "rights" not in itemmeta: itemmeta["rights"] = {} itemmeta["rights"][key[7:]] = metadata[key][0] elif key == "category": # Typical usage provides only name itemmeta["category"] = {"name": metadata[key][0]} elif key.startswith("category-"): if "category" not in itemmeta: itemmeta["category"] = {} itemmeta["category"][key[9:]] = metadata[key][0] elif key.startswith("query-"): if "query" not in catalogmeta: catalogmeta["query"] = {} catalogmeta["query"][key[6:]] = metadata[key][0] else: # reads everything as list, but most values should be scalar itemmeta[key] = value[0] if len(value) == 1 else value # itemmeta needs a self-referencing archetype key. key = archivist.pathstrategy.path_for(resourcetype='archetype', **itemmeta) self_link = { "bucket": archivist.bucket, "key": key, "href": key } itemmeta['archetype'] = self_link itemmeta['contenttype'] = "text/html; charset=utf-8" if "itemtype" not in itemmeta: itemmeta["itemtype"] = "Item/Page/Article" if "slug" not in itemmeta: itemmeta["slug"] = slugify(itemmeta["title"]) if "published" not in itemmeta: itemmeta["published"] = itemmeta["updated"] if "updated" not in itemmeta: itemmeta["updated"] = itemmeta["published"] # Some metadata has fallback defaults from the siteconfig if "rights" not in itemmeta: itemmeta["rights"] = archivist.siteconfig.get("rights") if "attribution" not in itemmeta: itemmeta["attribution"] = archivist.siteconfig.get("attribution") archetype = {"Item": itemmeta, "Item_Page_Article": {"body": html}} if itemmeta['itemtype'].startswith('Item/Page/Catalog'): catalogmeta['query'] = fixup_query(catalogmeta['query']) archetype['Item_Page_Catalog'] = catalogmeta return archetype