Skip to content

Instantly share code, notes, and snippets.

@nickstewart95
Created December 15, 2020 03:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nickstewart95/371757e062ddabe7e34c699603658b49 to your computer and use it in GitHub Desktop.
Save nickstewart95/371757e062ddabe7e34c699603658b49 to your computer and use it in GitHub Desktop.
const express = require("express");
const jsdom = require('jsdom')
const blockTools = require('@sanity/block-tools');
const Schema = require('@sanity/schema');
const defaultSchema = require('./defaultSchema');
const { JSDOM } = jsdom;
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))
app.listen(3000, () => {
console.log("Server running on port 3000");
});
app.post('/convert', (req, res) => {
var text = Buffer.from(req.param('html'), 'base64'); // Ta-da
var notFormatted = '<html>' + text + '</html>';
var blockContentType = defaultSchema.get('blogPost').fields.find(field => field.name === 'body').type;
const blocks = blockTools.htmlToBlocks(
notFormatted,
blockContentType,
{
parseHtml: html => new JSDOM(html).window.document,
rules: [
{
deserialize (el, next, block) {
if (el.tagName === 'IMG') {
return block({
_type: 'image',
_sanityAsset: `image@${el
.getAttribute('src')
.replace(/^\/\//, 'https://')}`
});
}
if (
el.tagName.toLowerCase() === 'p' &&
el.childNodes.length === 1 &&
el.childNodes.tagName &&
el.childNodes[0].tagName.toLowerCase() === 'img'
) {
return block({
_type: 'image',
_sanityAsset: `image@${el.childNodes[0]
.getAttribute('src')
.replace(/^\/\//, 'https://')}`
});
}
return undefined;
}
},
{
deserialize (el, next, block) {
if (el.tagName === 'ROW') {
var children = Array.prototype.slice.call(el.childNodes);
var childrenHolder = [];
for (child in children) {
if (children[child].tagName === 'GALLERYIMAGE' || children[child].tagName === 'IMG') {
var tmp = {
_type: 'image',
_sanityAsset: `image@${children[child]
.getAttribute('src')
.replace(/^\/\//, 'https://')}`
};
} else {
var tmp = {
_type: 'textContent',
'text': children[child].textContent
};
}
childrenHolder.push(tmp);
}
return block({
_type: 'cluster',
items: childrenHolder,
});
}
}
},
{
deserialize (el, next, block) {
if (el.tagName === 'CTABUTTON') {
return block({
_type: 'ctaButton',
title: el.textContent,
link: el.getAttribute('href')
});
}
}
},
]
}
);
return res.send(blocks);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment