1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-08-15 11:44:05 +02:00

add benchmarks for html and plain serializers, fixes #1168 (#1169)

This commit is contained in:
Ian Storm Taylor
2017-09-22 18:38:41 -07:00
committed by GitHub
parent 8a68d8a749
commit 4652f96d8d
6 changed files with 210 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
/** @jsx h */
/* eslint-disable react/jsx-key */
import Html from '../..'
import React from 'react'
import parse5 from 'parse5' // eslint-disable-line import/no-extraneous-dependencies
const html = new Html({
parseHtml: parse5.parseFragment,
rules: [
{
serialize(obj, children) {
switch (obj.kind) {
case 'block': {
switch (obj.type) {
case 'paragraph': return React.createElement('p', {}, children)
case 'quote': return React.createElement('blockquote', {}, children)
}
}
case 'mark': {
switch (obj.type) {
case 'bold': return React.createElement('strong', {}, children)
case 'italic': return React.createElement('em', {}, children)
}
}
}
}
}
]
})
export default function (string) {
html.deserialize(string)
}
export const input = `
<blockquote>
<p>
This is editable <strong>rich</strong> text, <em>much</em> better than a textarea!
</p>
</blockquote>
`.trim().repeat(10)

View File

@@ -0,0 +1,49 @@
/** @jsx h */
/* eslint-disable react/jsx-key */
import Html from '../..'
import React from 'react'
import h from '../../test/helpers/h'
import parse5 from 'parse5' // eslint-disable-line import/no-extraneous-dependencies
const html = new Html({
parseHtml: parse5.parseFragment,
rules: [
{
serialize(obj, children) {
switch (obj.kind) {
case 'block': {
switch (obj.type) {
case 'paragraph': return React.createElement('p', {}, children)
case 'quote': return React.createElement('blockquote', {}, children)
}
}
case 'mark': {
switch (obj.type) {
case 'bold': return React.createElement('strong', {}, children)
case 'italic': return React.createElement('em', {}, children)
}
}
}
}
}
]
})
export default function (state) {
html.serialize(state)
}
export const input = (
<state>
<document>
{Array.from(Array(10)).map(() => (
<quote>
<paragraph>
This is editable <b>rich</b> text, <i>much</i> better than a textarea!
</paragraph>
</quote>
))}
</document>
</state>
)

View File

@@ -0,0 +1,41 @@
/* global suite, set, bench */
import fs from 'fs'
import { basename, extname, resolve } from 'path'
import { __clear } from '../../slate/lib/utils/memoize'
/**
* Benchmarks.
*/
const categoryDir = resolve(__dirname)
const categories = fs.readdirSync(categoryDir).filter(c => c[0] != '.' && c != 'index.js')
categories.forEach((category) => {
suite(category, () => {
set('iterations', 100)
set('mintime', 2000)
if (category == 'models') {
after(() => {
__clear()
})
}
const benchmarkDir = resolve(categoryDir, category)
const benchmarks = fs.readdirSync(benchmarkDir).filter(b => b[0] != '.' && !!~b.indexOf('.js')).map(b => basename(b, extname(b)))
benchmarks.forEach((benchmark) => {
const dir = resolve(benchmarkDir, benchmark)
const module = require(dir)
const fn = module.default
let { input, before, after } = module
if (before) input = before(input)
bench(benchmark, () => {
fn(input)
if (after) after()
})
})
})
})

View File

@@ -0,0 +1,41 @@
/* global suite, set, bench */
import fs from 'fs'
import { basename, extname, resolve } from 'path'
import { __clear } from '../../slate/lib/utils/memoize'
/**
* Benchmarks.
*/
const categoryDir = resolve(__dirname)
const categories = fs.readdirSync(categoryDir).filter(c => c[0] != '.' && c != 'index.js')
categories.forEach((category) => {
suite(category, () => {
set('iterations', 100)
set('mintime', 2000)
if (category == 'models') {
after(() => {
__clear()
})
}
const benchmarkDir = resolve(categoryDir, category)
const benchmarks = fs.readdirSync(benchmarkDir).filter(b => b[0] != '.' && !!~b.indexOf('.js')).map(b => basename(b, extname(b)))
benchmarks.forEach((benchmark) => {
const dir = resolve(benchmarkDir, benchmark)
const module = require(dir)
const fn = module.default
let { input, before, after } = module
if (before) input = before(input)
bench(benchmark, () => {
fn(input)
if (after) after()
})
})
})
})

View File

@@ -0,0 +1,12 @@
/** @jsx h */
/* eslint-disable react/jsx-key */
import Plain from '../..'
export default function (string) {
Plain.deserialize(string)
}
export const input = `
This is editable plain text, just like a text area.
`.trim().repeat(10)

View File

@@ -0,0 +1,25 @@
/** @jsx h */
/* eslint-disable react/jsx-key */
import Plain from '../..'
import h from '../../test/helpers/h'
export default function (state) {
Plain.serialize(state)
}
export const input = (
<state>
<document>
{Array.from(Array(10)).map(() => (
<quote>
<paragraph>
<paragraph>
This is editable <b>rich</b> text, <i>much</i> better than a textarea!
</paragraph>
</paragraph>
</quote>
))}
</document>
</state>
)