Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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