Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#173171577] Extract front-matter CTA data from message content #1936

Merged
merged 10 commits into from
Jun 23, 2020

Conversation

Undermaken
Copy link
Contributor

@Undermaken Undermaken commented Jun 22, 2020

Short description:
This PR extracts cta data from message content (front-matter)

  • add front-matter lib to parse data
  • add some utils function to:
    • extract ctas from message content
    • validate cta action
    • remove front matter from message content
  • add cta type defintion
  • add tests

add some utils function to: extra cta, check cta action, remove front-matter from message content
add type definition
@pagopa-github-bot
Copy link
Collaborator

pagopa-github-bot commented Jun 22, 2020

Affected stories

  • 🌟 #173171577: Il markdown nel messaggio contiene un front-matter che permette di specificare 2 CTA

New dependencies added: front-matter.

front-matter

Author: Jason Campbell

Description: Extract YAML front matter from a string

Homepage: https://github.com/jxson/front-matter

Createdalmost 8 years ago
Last Updated25 days ago
LicenseMIT
Maintainers1
Releases37
Direct Dependenciesjs-yaml
Keywordsyaml, front matter and meta data
README

front-matter

build
coverage
npm
github

Sauce Test Status

Extract meta data (front-matter) from documents.

This modules does not do any IO (file loading or reading), only extracting and
parsing front matter from strings.

This concept that was originally introduced to me through the jekyll blogging system and is pretty useful where you want to be able to easily add meta-data to content without the need for a database. YAML is extracted from the the top of a file between matching separators of "---" or "= yaml =". It will also extract YAML between a separator and "...".

Install

With npm do:

npm install front-matter

Example

So you have a file example.md:

---
title: Just hack'n
description: Nothing to see here
---

This is some text about some stuff that happened sometime ago

NOTE: As of [email protected] valid front matter is considered to have
the starting separator on the first line.

Then you can do this:

var fs = require('fs')
  , fm = require('front-matter')

fs.readFile('./example.md', 'utf8', function(err, data){
  if (err) throw err

  var content = fm(data)

  console.log(content)
})

And end up with an object like this:

{
    attributes: {
        title: 'Just hack\'n',
        description: 'Nothing to see here'
    },
    body: 'This is some text about some stuff that happened sometime ago',
    bodyBegin: 6,
    frontmatter: 'title: Just hack\'n\ndescription: Nothing to see here'
}

Methods

var fm = require('front-matter')

fm(string, { allowUnsafe: false })

Return a content object with two properties:

  • content.attributes contains the extracted yaml attributes in json form
  • content.body contains the string contents below the yaml separators
  • content.bodyBegin contains the line number the body contents begins at
  • content.frontmatter contains the original yaml string contents

NOTE: By default fm() uses ys-yaml's safeLoad unless you set
allowUnsafe in the options object to true.

fm.test(string)

Check if a string contains a front matter header of "---" or "= yaml =". Primarily used internally but is useful outside of the module.

Returns true or false

    fm.test(string) #=> true || false

Contributing

front-matter is an OPEN Source Project so please help out by reporting bugs or forking and opening pull requests when possible.

standard

All code is linted/formatted using standard style, any non-conforming code can be automatically formatted using the the fmt make task: make fmt.

Maintainers

Contributors

This module is awesome because of all the folks who submitted pull requests:

CHANGELOG

3.0.0

  • CI only tests Node versions >= v6 (drops v4, and v5)

LICENSE (MIT)

Copyright (c) Jason Campbell ("Author")

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Generated by 🚫 dangerJS

@Undermaken Undermaken marked this pull request as ready for review June 22, 2020 17:50
): Option<CTAS> => {
return fromPredicate((t: string) => FM.test(t))(message.content.markdown)
.map(m => FM<MessageCTA>(m).attributes)
.chain(attrs => fromNullable(attrs[locale]));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In case we are working on a locale that is missing from the CTA we received in the message we return a none and we won't show the cta even if it has been added to the message.

E.g. User changed to "EN" from preferences option in the message we received just the CTA on IT language -> no CTA displayed. Should we fallback on the received CTA?

Copy link
Contributor Author

@Undermaken Undermaken Jun 23, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@CrisTofani
Yes it could happen.
What if we make it/en as required and not optional?

Copy link
Contributor

@CrisTofani CrisTofani Jun 23, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Undermaken
I think it could fail anyway cause we don't have the complete control of what we get since it is a remote content, maybe we should handle attrs as an array of string and fallback on the first we get?

Copy link
Contributor Author

@Undermaken Undermaken Jun 23, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@CrisTofani
starting from your warning I improved the logic and I added a test ae77f58:
now if the front-matter doesn't respect MessageCTA type the decoding will fail.
So if, from remote, we receive a data that doesn't contain it nor en the CTA won't be decoded.

Btw about the fallback we can do as follow: since at the moment the MessageCTA requires it/en, if the CTA for the current locale is not available we can fallback to the other one. if from remote we receive not it/en, fr for example, the decoding will fail

What do you think?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep! I find it is a good point!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

update within 0dd7a0f

@Undermaken Undermaken merged commit b9ba859 into master Jun 23, 2020
@Undermaken Undermaken deleted the 173171577-extract-frontmatter-data-from-message branch June 23, 2020 15:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants