def post(self, title, body, author=None, permlink=None, reply_identifier=None, json_metadata=None, comment_options=None, community=None, app=None, tags=None, beneficiaries=None, self_vote=False, parse_body=False, **kwargs):
    " Create a new post.\n        If this post is intended as a reply/comment, `reply_identifier` needs\n        to be set with the identifier of the parent post/comment (eg.\n        `@author/permlink`).\n        Optionally you can also set json_metadata, comment_options and upvote\n        the newly created post as an author.\n        Setting category, tags or community will override the values provided\n        in json_metadata and/or comment_options where appropriate.\n\n        :param str title: Title of the post\n        :param str body: Body of the post/comment\n        :param str author: Account are you posting from\n        :param str permlink: Manually set the permlink (defaults to None).\n            If left empty, it will be derived from title automatically.\n        :param str reply_identifier: Identifier of the parent post/comment (only\n            if this post is a reply/comment).\n        :param json_metadata: JSON meta object that can be attached to\n            the post.\n        :type json_metadata: str, dict\n        :param dict comment_options: JSON options object that can be\n            attached to the post.\n\n        Example::\n\n            comment_options = {\n                'max_accepted_payout': '1000000.000 CBD',\n                'percent_crea_dollars': 10000,\n                'allow_votes': True,\n                'allow_curation_rewards': True,\n                'extensions': [[0, {\n                    'beneficiaries': [\n                        {'account': 'account1', 'weight': 5000},\n                        {'account': 'account2', 'weight': 5000},\n                    ]}\n                ]]\n            }\n\n        :param str community: (Optional) Name of the community we are posting\n            into. This will also override the community specified in\n            `json_metadata`.\n        :param str app: (Optional) Name of the app which are used for posting\n            when not set, crea/<version> is used\n        :param tags: (Optional) A list of tags to go with the\n            post. This will also override the tags specified in\n            `json_metadata`. The first tag will be used as a 'category'. If\n            provided as a string, it should be space separated.\n        :type tags: str, list\n        :param list beneficiaries: (Optional) A list of beneficiaries\n            for posting reward distribution. This argument overrides\n            beneficiaries as specified in `comment_options`.\n\n        For example, if we would like to split rewards between account1 and\n        account2::\n\n            beneficiaries = [\n                {'account': 'account1', 'weight': 5000},\n                {'account': 'account2', 'weight': 5000}\n            ]\n\n        :param bool self_vote: (Optional) Upvote the post as author, right after\n            posting.\n        :param bool parse_body: (Optional) When set to True, all mentioned users,\n            used links and images are put into users, links and images array inside\n            json_metadata. This will override provided links, images and users inside\n            json_metadata. Hashtags will added to tags until its length is below five entries.\n\n        "
    json_metadata = (json_metadata or {})
    if isinstance(json_metadata, str):
        json_metadata = json.loads(json_metadata)
    if community:
        json_metadata.update({'community': community})
    if app:
        json_metadata.update({'app': app})
    elif ('app' not in json_metadata):
        json_metadata.update({'app': ('crea/%s' % crea_version)})
    if ((not author) and config['default_account']):
        author = config['default_account']
    if (not author):
        raise ValueError('You need to provide an account')
    account = Account(author, crea_instance=self)
    if isinstance(tags, str):
        tags = list(set([_f for _f in re.split('[\\W_]', tags) if _f]))
    category = None
    tags = (tags or json_metadata.get('tags', []))
    if parse_body:

        def get_urls(mdstring):
            return list(set(re.findall('http[s]*://[^\\s"><\\)\\(]+', mdstring)))

        def get_users(mdstring):
            users = []
            for u in re.findall('(^|[^a-zA-Z0-9_!#$%&*@＠\\/]|(^|[^a-zA-Z0-9_+~.-\\/#]))[@＠]([a-z][-\\.a-z\\d]+[a-z\\d])', mdstring):
                users.append(list(u)[(- 1)])
            return users

        def get_hashtags(mdstring):
            hashtags = []
            for t in re.findall('(^|\\s)(#[-a-z\\d]+)', mdstring):
                hashtags.append(list(t)[(- 1)])
            return hashtags
        users = []
        image = []
        links = []
        for url in get_urls(body):
            img_exts = ['.jpg', '.png', '.gif', '.svg', '.jpeg']
            if (os.path.splitext(url)[1].lower() in img_exts):
                image.append(url)
            else:
                links.append(url)
        users = get_users(body)
        hashtags = get_hashtags(body)
        users = list(set(users).difference(set([author])))
        if (len(users) > 0):
            json_metadata.update({'users': users})
        if (len(image) > 0):
            json_metadata.update({'image': image})
        if (len(links) > 0):
            json_metadata.update({'links': links})
        if (len(tags) < 5):
            for i in range((5 - len(tags))):
                if (len(hashtags) > i):
                    tags.append(hashtags[i])
    if tags:
        category = tags[0]
        json_metadata.update({'tags': tags})
    if (reply_identifier and category):
        category = None
    if reply_identifier:
        (parent_author, parent_permlink) = resolve_authorperm(reply_identifier)
        if (not permlink):
            permlink = derive_permlink(title, parent_permlink)
    elif category:
        parent_permlink = derive_permlink(category)
        parent_author = ''
        if (not permlink):
            permlink = derive_permlink(title)
    else:
        parent_author = ''
        parent_permlink = ''
        if (not permlink):
            permlink = derive_permlink(title)
    post_op = operations.Comment(**{'parent_author': parent_author, 'parent_permlink': parent_permlink, 'author': account['name'], 'permlink': permlink, 'title': title, 'body': body, 'json_metadata': json_metadata})
    ops = [post_op]
    if (comment_options or beneficiaries):
        comment_op = self._build_comment_options_op(account['name'], permlink, comment_options, beneficiaries)
        ops.append(comment_op)
    if self_vote:
        vote_op = operations.Vote(**{'voter': account['name'], 'author': account['name'], 'permlink': permlink, 'weight': CREA_100_PERCENT})
        ops.append(vote_op)
    return self.finalizeOp(ops, account, 'posting', **kwargs)
Create a new post.
If this post is intended as a reply/comment, `reply_identifier` needs
to be set with the identifier of the parent post/comment (eg.
`@author/permlink`).
Optionally you can also set json_metadata, comment_options and upvote
the newly created post as an author.
Setting category, tags or community will override the values provided
in json_metadata and/or comment_options where appropriate.

:param str title: Title of the post
:param str body: Body of the post/comment
:param str author: Account are you posting from
:param str permlink: Manually set the permlink (defaults to None).
    If left empty, it will be derived from title automatically.
:param str reply_identifier: Identifier of the parent post/comment (only
    if this post is a reply/comment).
:param json_metadata: JSON meta object that can be attached to
    the post.
:type json_metadata: str, dict
:param dict comment_options: JSON options object that can be
    attached to the post.

Example::

    comment_options = {
        'max_accepted_payout': '1000000.000 CBD',
        'percent_crea_dollars': 10000,
        'allow_votes': True,
        'allow_curation_rewards': True,
        'extensions': [[0, {
            'beneficiaries': [
                {'account': 'account1', 'weight': 5000},
                {'account': 'account2', 'weight': 5000},
            ]}
        ]]
    }

:param str community: (Optional) Name of the community we are posting
    into. This will also override the community specified in
    `json_metadata`.
:param str app: (Optional) Name of the app which are used for posting
    when not set, crea/<version> is used
:param tags: (Optional) A list of tags to go with the
    post. This will also override the tags specified in
    `json_metadata`. The first tag will be used as a 'category'. If
    provided as a string, it should be space separated.
:type tags: str, list
:param list beneficiaries: (Optional) A list of beneficiaries
    for posting reward distribution. This argument overrides
    beneficiaries as specified in `comment_options`.

For example, if we would like to split rewards between account1 and
account2::

    beneficiaries = [
        {'account': 'account1', 'weight': 5000},
        {'account': 'account2', 'weight': 5000}
    ]

:param bool self_vote: (Optional) Upvote the post as author, right after
    posting.
:param bool parse_body: (Optional) When set to True, all mentioned users,
    used links and images are put into users, links and images array inside
    json_metadata. This will override provided links, images and users inside
    json_metadata. Hashtags will added to tags until its length is below five entries.
def post(self, title, body, author=None, permlink=None, reply_identifier=None, json_metadata=None, comment_options=None, community=None, app=None, tags=None, beneficiaries=None, self_vote=False, parse_body=False, **kwargs):
    " Create a new post.\n        If this post is intended as a reply/comment, `reply_identifier` needs\n        to be set with the identifier of the parent post/comment (eg.\n        `@author/permlink`).\n        Optionally you can also set json_metadata, comment_options and upvote\n        the newly created post as an author.\n        Setting category, tags or community will override the values provided\n        in json_metadata and/or comment_options where appropriate.\n\n        :param str title: Title of the post\n        :param str body: Body of the post/comment\n        :param str author: Account are you posting from\n        :param str permlink: Manually set the permlink (defaults to None).\n            If left empty, it will be derived from title automatically.\n        :param str reply_identifier: Identifier of the parent post/comment (only\n            if this post is a reply/comment).\n        :param json_metadata: JSON meta object that can be attached to\n            the post.\n        :type json_metadata: str, dict\n        :param dict comment_options: JSON options object that can be\n            attached to the post.\n\n        Example::\n\n            comment_options = {\n                'max_accepted_payout': '1000000.000 CBD',\n                'percent_crea_dollars': 10000,\n                'allow_votes': True,\n                'allow_curation_rewards': True,\n                'extensions': [[0, {\n                    'beneficiaries': [\n                        {'account': 'account1', 'weight': 5000},\n                        {'account': 'account2', 'weight': 5000},\n                    ]}\n                ]]\n            }\n\n        :param str community: (Optional) Name of the community we are posting\n            into. This will also override the community specified in\n            `json_metadata`.\n        :param str app: (Optional) Name of the app which are used for posting\n            when not set, crea/<version> is used\n        :param tags: (Optional) A list of tags to go with the\n            post. This will also override the tags specified in\n            `json_metadata`. The first tag will be used as a 'category'. If\n            provided as a string, it should be space separated.\n        :type tags: str, list\n        :param list beneficiaries: (Optional) A list of beneficiaries\n            for posting reward distribution. This argument overrides\n            beneficiaries as specified in `comment_options`.\n\n        For example, if we would like to split rewards between account1 and\n        account2::\n\n            beneficiaries = [\n                {'account': 'account1', 'weight': 5000},\n                {'account': 'account2', 'weight': 5000}\n            ]\n\n        :param bool self_vote: (Optional) Upvote the post as author, right after\n            posting.\n        :param bool parse_body: (Optional) When set to True, all mentioned users,\n            used links and images are put into users, links and images array inside\n            json_metadata. This will override provided links, images and users inside\n            json_metadata. Hashtags will added to tags until its length is below five entries.\n\n        "
    json_metadata = (json_metadata or {})
    if isinstance(json_metadata, str):
        json_metadata = json.loads(json_metadata)
    if community:
        json_metadata.update({'community': community})
    if app:
        json_metadata.update({'app': app})
    elif ('app' not in json_metadata):
        json_metadata.update({'app': ('crea/%s' % crea_version)})
    if ((not author) and config['default_account']):
        author = config['default_account']
    if (not author):
        raise ValueError('You need to provide an account')
    account = Account(author, crea_instance=self)
    if isinstance(tags, str):
        tags = list(set([_f for _f in re.split('[\\W_]', tags) if _f]))
    category = None
    tags = (tags or json_metadata.get('tags', []))
    if parse_body:

        def get_urls(mdstring):
            return list(set(re.findall('http[s]*://[^\\s"><\\)\\(]+', mdstring)))

        def get_users(mdstring):
            users = []
            for u in re.findall('(^|[^a-zA-Z0-9_!#$%&*@＠\\/]|(^|[^a-zA-Z0-9_+~.-\\/#]))[@＠]([a-z][-\\.a-z\\d]+[a-z\\d])', mdstring):
                users.append(list(u)[(- 1)])
            return users

        def get_hashtags(mdstring):
            hashtags = []
            for t in re.findall('(^|\\s)(#[-a-z\\d]+)', mdstring):
                hashtags.append(list(t)[(- 1)])
            return hashtags
        users = []
        image = []
        links = []
        for url in get_urls(body):
            img_exts = ['.jpg', '.png', '.gif', '.svg', '.jpeg']
            if (os.path.splitext(url)[1].lower() in img_exts):
                image.append(url)
            else:
                links.append(url)
        users = get_users(body)
        hashtags = get_hashtags(body)
        users = list(set(users).difference(set([author])))
        if (len(users) > 0):
            json_metadata.update({'users': users})
        if (len(image) > 0):
            json_metadata.update({'image': image})
        if (len(links) > 0):
            json_metadata.update({'links': links})
        if (len(tags) < 5):
            for i in range((5 - len(tags))):
                if (len(hashtags) > i):
                    tags.append(hashtags[i])
    if tags:
        category = tags[0]
        json_metadata.update({'tags': tags})
    if (reply_identifier and category):
        category = None
    if reply_identifier:
        (parent_author, parent_permlink) = resolve_authorperm(reply_identifier)
        if (not permlink):
            permlink = derive_permlink(title, parent_permlink)
    elif category:
        parent_permlink = derive_permlink(category)
        parent_author = 
        if (not permlink):
            permlink = derive_permlink(title)
    else:
        parent_author = 
        parent_permlink = 
        if (not permlink):
            permlink = derive_permlink(title)
    post_op = operations.Comment(**{'parent_author': parent_author, 'parent_permlink': parent_permlink, 'author': account['name'], 'permlink': permlink, 'title': title, 'body': body, 'json_metadata': json_metadata})
    ops = [post_op]
    if (comment_options or beneficiaries):
        comment_op = self._build_comment_options_op(account['name'], permlink, comment_options, beneficiaries)
        ops.append(comment_op)
    if self_vote:
        vote_op = operations.Vote(**{'voter': account['name'], 'author': account['name'], 'permlink': permlink, 'weight': CREA_100_PERCENT})
        ops.append(vote_op)
    return self.finalizeOp(ops, account, 'posting', **kwargs)