K3rn3l5
K3rn3l5

Reputation: 361

Import text json for node js template literals

For my node js projects i typically have a text.json file and require it, instead of having static text within my code. something like below

JSON file

{
  "greet":"Hello world"
}


var text = require('./text.json');
var greet = text.greet

I am having a little trouble in figuring out how this would work with template literals ?

Upvotes: 0

Views: 2897

Answers (2)

dferg
dferg

Reputation: 97

I know this is an old issue but I just came up with a need for the same thing and.. yeah there are node modules that help do this but, this isn't that complex so I just made my own solution

function injectVariables( replacements, input ) {
    const entries = Object.entries(replacements)
    const result = entries.reduce( (output, entry) => {
        const [key, value] = entry
        const regex = new RegExp( `\\$\{${key}\}`, 'g')
    return output.replace( regex, value )
    }, input )
    return result
} 


const template = 'Hello my name is ${name} and I like ${language}'
const inputs = { name: 'David', language: 'JavaScript' }
const replaced = injectVariables(inputs, template) 
console.log(replaced)

So, in this, it takes an input string and an object where the keys are the variable names in the string and the values are, you guessed it, the values.

It creates an array the values using Object.entries and then runs reduce across the entries to keep an updated version of the string as you go. On each iteration it makes a regex to match the variable expression and replaces that value with the one passed it.

This in particular won't look through nested objects (I didn't need that) but if for example your string had ${name.last} in it, since object keys can be strings, your input variable could be inputs = { 'name.last': 'Smith' } and it should work.

Hopefully this helps someone else.

Upvotes: 2

Adam Jenkins
Adam Jenkins

Reputation: 55643

I often use a very tiny templating helper library (tim - https://github.com/premasagar/tim) and it can be used to accomplish this:

//in my json file
var strings = {
   'Hello': 'Hello {{name}}!',
   'Goodbye': 'Goodbye {{name}}!'
};

//in my app
var tim = require('tim'); //templating library
var strings = require('./strings.json');

//replace
console.log(tim(strings.Hello,{name:'Fred'}));

Relevant JSFiddle:

https://jsfiddle.net/rtresjqv/

Alternatively, you could turn your strings into functions and then pass in the arguments:

//in my json file
var strings = {
   'Hello': function() { return `Hello ${arguments[0]}!`; },
   'Goodbye': function() { return `Goodbye {$arguments[0]}!`; }
};

//in my app
var strings = require('./strings.json');

//replace
console.log(strings.Hello('Fred'));

Fiddle: https://jsfiddle.net/t6ta0576/

Upvotes: 1

Related Questions