From 7cd8ac75a38fa1585438cf3a43c25fd89bf9f484 Mon Sep 17 00:00:00 2001 From: Robbie Antenesse Date: Thu, 27 Apr 2017 14:33:25 -0600 Subject: [PATCH] Integrate KeyboardFire's phondue into IPAField Rewrote MIT-Licensed scripts to work as Inferno components. Use keyboard shortcuts, smart replacement, or a table selection to choose IPA characters! --- package.json | 2 + src/components/management/IPAField.jsx | 184 +-- src/components/management/IPATable.jsx | 1310 ++++++++++++++++++++++ vendor/KeyboardFire/phondue/digraphs.txt | 379 +++++++ vendor/KeyboardFire/phondue/index.html | 143 +++ vendor/KeyboardFire/phondue/phondue.css | 48 + vendor/KeyboardFire/phondue/phondue.js | 54 + vendor/KeyboardFire/phondue/table.html | 1143 +++++++++++++++++++ vendor/KeyboardFire/phondue/usage.html | 124 ++ webpack.config.js | 14 + yarn.lock | 122 +- 11 files changed, 3433 insertions(+), 90 deletions(-) create mode 100644 src/components/management/IPATable.jsx create mode 100644 vendor/KeyboardFire/phondue/digraphs.txt create mode 100644 vendor/KeyboardFire/phondue/index.html create mode 100644 vendor/KeyboardFire/phondue/phondue.css create mode 100644 vendor/KeyboardFire/phondue/phondue.js create mode 100644 vendor/KeyboardFire/phondue/table.html create mode 100644 vendor/KeyboardFire/phondue/usage.html diff --git a/package.json b/package.json index 6a916d2..d20999c 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,9 @@ "css-loader": "^0.28.0", "express": "^4.15.2", "file-loader": "^0.11.1", + "html-loader": "^0.4.5", "node-sass": "^4.5.2", + "raw-loader": "^0.5.1", "sass-loader": "^6.0.3", "style-loader": "^0.16.1", "url-loader": "^0.5.8", diff --git a/src/components/management/IPAField.jsx b/src/components/management/IPAField.jsx index 5241057..7187158 100644 --- a/src/components/management/IPAField.jsx +++ b/src/components/management/IPAField.jsx @@ -1,97 +1,119 @@ import Inferno from 'inferno'; import Component from 'inferno-component'; +const phondueUsage = require('../../../vendor/KeyboardFire/phondue/usage.html'); +const digraphsHexes = require('../../../vendor/KeyboardFire/phondue/digraphs.txt'); + import Helper from '../../Helper'; +import {IPATable} from './IPATable'; + export class IPAField extends Component { +/* + Modified from KeyboardFire's Phondue project (https://github.com/KeyboardFire/phondue) + to fit React/Inferno and Lexiconga +*/ constructor (props) { super(props); - this.field = null; - - this.letterPossibilities = { - 'a': ['\u00E6', '\u0276', '\u0250', '\u0251', '\u0252'] - , 'e': ['\u025B', '\u0258', '\u0259', '\u025C', '\u0153'] - , 'i': ['\u026A', '\u0268'] - , 'o': ['\u0153', '\u00F8', '\u0275', '\u0254'] - , 'u': ['\u0289', '\u028C', '\u028A', '\u026F'] - , 'y': ['\u028F', '\u006A', '\u028E', '\u026F'] - } - this.state = { - value: '' - , isFocused: false - , shouldDisplay: false + value: props.value || '' + , doShowHelp: false + , doShowTable: false } + + this.field = null; + this.digraphs = {}; } - get valueAtCursor () { - const startPosition = this.field.selectionStart - , endPosition = this.field.selectionEnd; - - // Get the character left of the farthest forward selection position. - let index = (startPosition === endPosition ? startPosition - 1 : (endPosition < startPosition ? startPosition : endPosition) - 1) - if (!index && index !== 0) { - index = -1; - } - const character = this.state.value.charAt(index) || ''; - - return { - character: character - , position: index - }; - } - - get valueAtCursorIsUpperCase () { - return Helper.characterIsUppercase(this.valueAtCursor.character); - } - - get valueAtCursorHasSuggestions () { - return this.letterPossibilities.hasOwnProperty(this.valueAtCursor.character.toLowerCase()); - } - - get valueAtCursorPossibilities () { - return this.valueAtCursorHasSuggestions - ? this.letterPossibilities[this.valueAtCursor.character.toLowerCase()] - : []; - } - - checkDisplay () { - console.log(this.valueAtCursor); - this.setState({ - valueAtCursorHasSuggestions: this.valueAtCursorHasSuggestions + componentDidMount () { + // Decode digraph hexes. + digraphsHexes.split('\n').forEach(digraph => { + let chunks = digraph.match(/\S{8}/g); + if (!chunks || chunks.length != 3) return; // failsafe + chunks = chunks.map(hex => { + return String.fromCharCode(parseInt(hex, 16)); + }); + this.digraphs[chunks[0] + chunks[1]] = chunks[2]; }); } - listSuggestions () { - if (this.state.isFocused && this.state.valueAtCursorHasSuggestions) { + showHelp () { + if (this.state.doShowHelp) { return ( -
this.setState({ isFocused: true }, this.checkDisplay)}> - {this.valueAtCursorHasSuggestions - ? this.valueAtCursorPossibilities.map(letter => { - return ( - this.replaceValueAtCursor(letter)}> - {this.valueAtCursorIsUpperCase ? letter.toUpperCase() : letter} - - ); - }) - : ''} +
+
this.setState({ doShowHelp: false })} /> +
+
+ +
+ +
+
); } } - replaceValueAtCursor (character) { - const valueAtCursor = this.valueAtCursor; - let updatedValue = this.state.value; - updatedValue = updatedValue.replaceAt(valueAtCursor.position, (this.valueAtCursorIsUpperCase) ? character.toUpperCase() : character); + showTable () { + if (this.state.doShowTable) { + return ( +
+
this.setState({ doShowTable: false })} /> +
+ this.setState({ value: newValue }, this.field.focus())} /> +
+
+ ); + } + } - this.setState({ value: updatedValue }, () => { - this.field.focus(); - this.field.startPosition = valueAtCursor.index + 1; - }); + showButtons () { + if (!this.props.isDisplayOnly) { + return ( + + ); + } + } + + onInput (event) { + let val = event.target.value + , pos = this.field.selectionStart || val.length; + + if (event.key) { + const key = event.key + , digraph = this.digraphs[val.substr(pos - 1, 1) + key]; + + if (digraph) { + event.preventDefault(); + val = val.slice(0, pos - 1) + digraph + val.slice(pos); + } + } + + if (val !== this.state.value) { + this.setState({ value: val }, () => { + this.field.focus(); + this.field.setSelectionRange(pos, pos); + }); + } } render () { @@ -99,26 +121,14 @@ export class IPAField extends Component {

- this.field = input} value={this.state.value} - onFocus={() => { - setTimeout(() => { - this.setState({ isFocused: true }, this.checkDisplay) - }, 250); - }} - onBlur={() => { - setTimeout(() => { - this.setState({ isFocused: false }, this.checkDisplay) - }, 250); - }} - onInput={event => { - this.setState({ value: event.target.value }, this.checkDisplay); - }} + onInput={event => this.onInput(event)} + onKeyDown={event => this.onInput(event)} onChange={() => this.props.onChange(this.state.value)} /> - - {this.listSuggestions()}

+ {this.showButtons()}
); } diff --git a/src/components/management/IPATable.jsx b/src/components/management/IPATable.jsx new file mode 100644 index 0000000..007fb29 --- /dev/null +++ b/src/components/management/IPATable.jsx @@ -0,0 +1,1310 @@ +import Inferno from 'inferno'; + +import {IPAField} from './IPAField'; + +export const IPATable = ({value, update}) => { +/* + Modified from KeyboardFire's Phondue project (https://github.com/KeyboardFire/phondue) + to fit React/Inferno and Lexiconga +*/ + const updateInput = (newValue) => { + console.log(newValue); + this.field.setState({ value: value + newValue }); + update(value + newValue); + } + + return ( +
+ this.field = field} + value={value} /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Bilabial + + Labiodental + + Dental + + Alveolar + + Postalveolar + + Palatal + + Velar + + Uvular + + Pharyngeal + + Glottal +
+ Plosive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Nasal + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Trill + + + + + + + + + + + + + + + + + + + + + + + +
+ Tap/Flap + + + + + + + + + + + + + + + + + + + + + + +
+ Fricative + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Lateral fricative + + + + + + + + + + + + + + + + + + + + + + +
+ Approximant + + + + + + + + + + + + + + + + + + + + + + + + +
+ Lateral approximant + + + + + + + + + + + + + + + + + + + + + + + +
+ + Front + + Central + + Back + + + Non-pulmonic + + + Other + + + Diacritics +
+ Close + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Near-close + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Close-mid + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Mid + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Open-mid + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Near-open + + + + + + + + + + + + + + + + + +
+ Open + + + + + + + + + + + + + + + + + + Suprasegmental + + + + + + + + + + + + + + + + +
+
+ ) +} \ No newline at end of file diff --git a/vendor/KeyboardFire/phondue/digraphs.txt b/vendor/KeyboardFire/phondue/digraphs.txt new file mode 100644 index 0000000..ed25b35 --- /dev/null +++ b/vendor/KeyboardFire/phondue/digraphs.txt @@ -0,0 +1,379 @@ +000000210000002a 000001c3 +000000210000002f 000000a1 +000000220000005e 0000030b +000000220000005f 0000030f +000000230000005f 0000033b +0000002700000027 000002c8 +0000002700000029 000002bc +000000270000002d 000002d4 +000000270000005e 00000341 +000000270000005f 00000340 +0000002800000028 00000361 +000000280000005f 0000031c +0000002900000029 0000035c +000000290000005f 00000339 +0000002b0000005f 0000031f +0000002b0000007c 0000a71b +0000002c0000002c 000002cc +0000002c0000002d 000002d5 +0000002d00000027 000002d4 +0000002d0000002c 000002d5 +0000002d0000003f 000002a1 +0000002d00000045 00000258 +0000002d00000048 00000127 +0000002d00000049 00000268 +0000002d0000004a 0000025f +0000002d0000004c 0000026c +0000002d0000004f 00000275 +0000002d00000055 00000289 +0000002d0000005e 00000304 +0000002d00000065 00000258 +0000002d00000068 00000127 +0000002d00000069 00000268 +0000002d0000006a 0000025f +0000002d0000006c 0000026c +0000002d0000006f 00000275 +0000002d00000075 00000289 +0000002d0000007c 0000a71c +0000002d00000294 000002a1 +0000002d00000295 000002a2 +0000002d000002a1 00000294 +0000002d000002a2 00000295 +0000002d000002d0 000002d1 +0000002d000002d1 000002d0 +0000002f0000003e 00002197 +0000002f0000005c 0000028c +0000002f0000005e 00002197 +000000310000007c 000002e9 +000000320000007c 000002e8 +000000330000007c 000002e7 +000000340000007c 000002e6 +000000350000007c 000002e5 +0000003a0000003a 000002d0 +0000003a0000005e 00000308 +0000003a0000005f 00000324 +0000003c0000007c 000022a3 +0000003d0000002a 000001c1 +0000003e0000002f 00002197 +0000003e00000052 000002de +0000003e0000005c 00002198 +0000003e0000005e 0000031a +0000003e00000072 000002de +0000003e0000007c 000022a2 +0000003f0000002d 000002a1 +0000003f0000002f 00000295 +0000003f0000003f 00000294 +000000410000002f 00000250 +0000004100000041 00000251 +0000004100000045 000000e6 +000000410000007c 00000251 +0000004200000028 00000253 +0000004200000042 00000299 +0000004200000048 000003b2 +000000430000002c 000000e7 +000000430000002f 00000254 +0000004300000045 00000276 +0000004400000028 00000257 +0000004400000029 00000256 +0000004400000048 000000f0 +000000450000002d 00000258 +000000450000002f 00000259 +0000004500000042 0000025e +0000004500000045 0000025b +0000004700000028 00000260 +0000004700000047 00000262 +000000480000002c 00000266 +000000480000002d 00000127 +000000480000002f 00000265 +0000004800000048 0000029c +000000480000005e 000002b0 +000000490000002d 00000268 +0000004900000049 0000026a +0000004a00000028 00000284 +0000004a0000002c 0000029d +0000004a0000002d 0000025f +0000004a0000005e 000002b2 +0000004b0000002f 0000029e +0000004c00000029 0000026d +0000004c0000002d 0000026c +0000004c0000004c 0000029f +0000004c00000052 0000027a +0000004c0000005a 0000026e +0000004c0000005e 000002e1 +0000004c0000027e 0000027a +0000004d0000002c 00000271 +0000004d0000002f 0000026f +0000004d0000005e 00001d50 +0000004e00000029 00000273 +0000004e0000002c 0000014b +0000004e0000004e 00000274 +0000004e0000005e 0000207f +0000004f0000002a 00000298 +0000004f0000002d 00000275 +0000004f0000002e 00000298 +0000004f0000002f 000000f8 +0000004f00000045 00000153 +0000004f0000004f 0000025e +0000004f00000058 00000264 +0000004f0000005e 0000030a +0000004f0000005f 00000325 +0000004f0000007c 00000251 +0000005000000048 00000278 +0000005200000029 0000027d +000000520000002f 00000279 +0000005200000030 0000027e +000000520000003e 000002de +000000520000004c 0000027a +000000520000004f 0000027e +0000005200000052 00000280 +0000005300000029 00000282 +0000005300000048 00000283 +000000530000004a 00000255 +0000005400000029 00000288 +0000005400000048 000003b8 +000000550000002d 00000289 +0000005500000055 0000028a +000000550000005e 00000306 +000000550000005f 0000032e +000000560000002c 00002c71 +000000560000002f 0000028c +0000005600000030 0000028b +000000560000004f 0000028b +000000560000005e 0000030c +000000560000005e 0000030c +000000560000005f 0000032c +000000570000002c 00000270 +000000570000002f 0000028d +000000570000005e 000002b7 +000000570000007c 00000270 +000000580000002c 00000263 +000000580000004f 00000264 +0000005800000058 000003c7 +000000580000005e 0000033d +0000005800000283 00000267 +000000590000002f 0000028e +0000005900000059 0000028f +0000005a00000029 00000290 +0000005a00000048 00000292 +0000005a0000004a 00000291 +0000005b0000005d 0000033b +0000005b0000005f 0000032a +0000005c0000003e 00002198 +0000005c00000056 00002198 +0000005c00000076 00002198 +0000005d0000005f 0000033a +0000005e00000022 0000030b +0000005e00000027 00000341 +0000005e0000002d 00000304 +0000005e0000002f 00002197 +0000005e0000003a 00000308 +0000005e0000003e 0000031a +0000005e00000048 000002b0 +0000005e0000004a 000002b2 +0000005e0000004c 000002e1 +0000005e0000004d 00001d50 +0000005e0000004e 0000207f +0000005e0000004f 0000030a +0000005e00000055 00000306 +0000005e00000056 0000030c +0000005e00000056 0000030c +0000005e00000057 000002b7 +0000005e00000058 0000033d +0000005e0000005e 00000302 +0000005e0000005e 00000302 +0000005e0000005f 0000032f +0000005e00000068 000002b0 +0000005e0000006a 000002b2 +0000005e0000006c 000002e1 +0000005e0000006d 00001d50 +0000005e0000006e 0000207f +0000005e0000006f 0000030a +0000005e00000075 00000306 +0000005e00000076 0000030c +0000005e00000076 0000030c +0000005e00000077 000002b7 +0000005e00000078 0000033d +0000005e0000007c 0000030d +0000005e0000007e 00000303 +0000005e0000014b 00001d51 +0000005e00000263 000002e0 +0000005e00000265 00001da3 +0000005e0000028b 00001db9 +0000005e00000295 000002e4 +0000005f00000022 0000030f +0000005f00000023 0000033b +0000005f00000027 00000340 +0000005f00000028 0000031c +0000005f00000029 00000339 +0000005f0000002b 0000031f +0000005f0000003a 00000324 +0000005f0000004f 00000325 +0000005f00000055 0000032e +0000005f00000056 0000032c +0000005f0000005b 0000032a +0000005f0000005d 0000033a +0000005f0000005e 0000032f +0000005f0000005f 00000320 +0000005f0000005f 00000320 +0000005f0000006f 00000325 +0000005f00000075 0000032e +0000005f00000076 0000032c +0000005f0000007b 0000033c +0000005f0000007c 00000329 +0000005f0000007e 00000330 +0000005f000002d4 0000031d +0000005f000002d5 0000031e +0000005f000022a2 00000319 +0000005f000022a3 00000318 +000000610000002f 00000250 +000000610000007c 00000251 +0000006200000028 00000253 +000000630000002c 000000e7 +000000630000002f 00000254 +0000006400000028 00000257 +0000006400000029 00000256 +000000650000002d 00000258 +000000650000002f 00000259 +0000006700000028 00000260 +000000680000002c 00000266 +000000680000002d 00000127 +000000680000002f 00000265 +000000680000005e 000002b0 +000000690000002d 00000268 +0000006a00000028 00000284 +0000006a0000002c 0000029d +0000006a0000002d 0000025f +0000006a0000005e 000002b2 +0000006b0000002f 0000029e +0000006c00000029 0000026d +0000006c0000002d 0000026c +0000006c0000005e 000002e1 +0000006c0000027e 0000027a +0000006d0000002c 00000271 +0000006d0000002f 0000026f +0000006d0000005e 00001d50 +0000006e00000029 00000273 +0000006e0000002c 0000014b +0000006e0000005e 0000207f +0000006f0000002a 00000298 +0000006f0000002d 00000275 +0000006f0000002e 00000298 +0000006f0000002f 000000f8 +0000006f0000005e 0000030a +0000006f0000005f 00000325 +0000006f0000007c 00000251 +0000007200000029 0000027d +000000720000002f 00000279 +0000007200000030 0000027e +000000720000003e 000002de +000000720000004f 0000027e +0000007300000029 00000282 +0000007400000029 00000288 +000000750000002d 00000289 +000000750000005e 00000306 +000000750000005f 0000032e +000000760000002c 00002c71 +000000760000002f 0000028c +0000007600000030 0000028b +000000760000004f 0000028b +000000760000005e 0000030c +000000760000005e 0000030c +000000760000005f 0000032c +000000770000002c 00000270 +000000770000002f 0000028d +000000770000005e 000002b7 +000000770000007c 00000270 +000000780000002c 00000263 +000000780000005e 0000033d +0000007800000283 00000267 +000000790000002f 0000028e +0000007a00000029 00000290 +0000007b0000005f 0000033c +0000007c0000002a 000001c0 +0000007c0000002d 0000a71c +0000007c0000003c 000022a3 +0000007c0000003d 000001c2 +0000007c0000003e 000022a2 +0000007c00000041 00000252 +0000007c0000004f 00000252 +0000007c0000005e 0000030d +0000007c0000005f 00000329 +0000007c00000061 00000252 +0000007c0000006f 00000252 +0000007c0000007c 00002016 +0000007e0000005e 00000303 +0000007e0000005f 00000330 +0000007e0000007e 00000334 +0000014b0000002c 00000272 +0000014b0000005e 00001d51 +0000014b00001d51 0000005e +000002510000002f 00000252 +000002520000002f 00000251 +0000025600000028 00001d91 +0000025700000029 00001d91 +0000025b0000002f 0000025c +0000025c00000028 0000025e +0000025c0000002f 0000025b +0000025e00000028 0000025c +0000025f00000028 00000284 +0000026200000028 0000029b +000002630000002c 000003c7 +000002630000005e 000002e0 +00000263000002e0 0000005e +000002650000005e 00001da3 +0000026500001da3 0000005e +0000026700000058 00000283 +0000026700000078 00000283 +0000026700000283 00000058 +0000026700000283 00000078 +000002720000002c 0000014b +0000027900000029 0000027b +0000027a0000004c 0000027e +0000027a0000006c 0000027e +0000027a0000027e 0000004c +0000027a0000027e 0000006c +0000027b00000029 00000279 +0000027d00000029 0000027e +0000027e00000029 0000027d +0000027e0000004c 0000027a +0000027e0000006c 0000027a +000002800000002f 00000281 +000002810000002f 00000280 +0000028300000058 00000267 +0000028300000078 00000267 +0000028400000028 0000025f +0000028b0000005e 00001db9 +0000028b00001db9 0000005e +000002940000002d 000002a1 +000002940000002f 00000295 +000002950000002d 000002a2 +000002950000002f 00000294 +000002950000005e 000002e4 +00000295000002e4 0000005e +0000029b00000028 00000262 +000002a10000002d 00000294 +000002a20000002d 00000295 +000002d00000002d 000002d1 +000002d10000002d 000002d0 +000002d40000005f 0000031d +000002d40000031d 0000005f +000002d50000005f 0000031e +000002d50000031e 0000005f +000002e000000263 0000005e +000002e400000295 0000005e +00000318000022a3 0000005f +00000319000022a2 0000005f +0000031d000002d4 0000005f +0000031e000002d5 0000005f +0000035c00000029 0000203f +000003c70000002c 00000263 +00001d510000014b 0000005e +00001d9100000028 00000256 +00001d9100000029 00000257 +00001da300000265 0000005e +00001db90000028b 0000005e +0000203f00000029 0000035c +000022a20000005f 00000319 +000022a200000319 0000005f +000022a30000005f 00000318 +000022a300000318 0000005f diff --git a/vendor/KeyboardFire/phondue/index.html b/vendor/KeyboardFire/phondue/index.html new file mode 100644 index 0000000..7ab2ada --- /dev/null +++ b/vendor/KeyboardFire/phondue/index.html @@ -0,0 +1,143 @@ + + + + + + Phondue + + + + +

Phondue

+

An IPA entry tool so good, it's delicious

+

Desktop version | Hover over any symbol to view its digraphs (ex. THθ)

+
+ +

Usage

+

As seen in the above table, certain symbols of the IPA can be entered by +clicking on them. However, it is far more efficient to use the many keyboard +shortcuts that Phondue provides. These are called digraphs, since they are +made up of two letters, and they allow you to type any IPA symbol with only a +standard keyboard.

+

These symbols were decided to be intuitive as possible:

+
    +
  • +

    Many symbols that look similar to letters of the English alphabet (such as +small caps) can be produced by doubling the capital letter:

    +
      GG -> ɢ   ?? -> ʔ   NN -> ɴ   BB -> ʙ   RR -> ʀ   XX -> χ
    +  LL -> ʟ   II -> ɪ   YY -> ʏ   UU -> ʊ   EE -> ɛ   OO -> ɞ
    +  AA -> ɑ   '' -> ˈ   ,, -> ˌ   :: -> ː
    +
    +
  • +
  • +

    The slash is used to "reflect," "rotate," or otherwise flip around a given +symbol:

    +
      ʀ/ -> ʁ   ʔ/ -> ʕ   ?/ -> ʕ   r/ -> ɹ   y/ -> ʎ   m/ -> ɯ
    +  o/ -> ø   e/ -> ə   ɛ/ -> ɜ   c/ -> ɔ   a/ -> ɐ   ɑ/ -> ɒ
    +  w/ -> ʍ   h/ -> ɥ   k/ -> ʞ   !/ -> ¡   v/ -> ʌ
    +
    +

    Also note that for any digraph, if either of the two characters that +compose it are not "standard" letters you can find on your keyboard, the +digraph can be done in reverse order—so since ʀ/ produces ʁ, you can press +/ again to go back to ʀ in case of accidental flippage (it's also weirdly +amusing to press RR///////).

    +

    This sometimes makes it easier to enter certain pairs; you may prefer to +use AA for ɑ and AA/ for ɒ instead of the visual o| and |o.

    +
  • +
  • +

    Digraphs have also been designed for when a symbol looks like two overlayed +characters, or two characters next to each other. This includes "hooked" +letters (such as ŋ), produced with the original letter and a comma, and +"stroked" letters (such as ɟ), produced with the original letter and a dash:

    +
      m, -> ɱ   n, -> ŋ   ŋ, -> ɲ   v, -> ⱱ   c, -> ç   j, -> ʝ
    +  x, -> ɣ   ɣ, -> χ   h, -> ɦ   w, -> ɰ
    +
    +  j- -> ɟ   h- -> ħ   l- -> ɬ   i- -> ɨ   u- -> ʉ   e- -> ɘ
    +  o- -> ɵ   ʕ- -> ʢ   ?- -> ʡ   ʔ- -> ʡ
    +
    +  LZ -> ɮ   OX -> ɤ   XO -> ɤ   OE -> œ   EB -> ɞ   AE -> æ
    +  CE -> ɶ   RL -> ɺ   LR -> ɺ   ɾl -> ɺ   lɾ -> ɺ
    +
    +  w| -> ɰ   o/ -> ø   ɜ( -> ɞ   /\ -> ʌ   o| -> ɑ   a| -> ɑ
    +  |o -> ɒ   |a -> ɒ
    +
    +  o. -> ʘ   |= -> ǂ   || -> ‖   /^ -> ↗   /> -> ↗   \v -> ↘
    +  \> -> ↘
    +
    +
  • +
  • +

    Others are based on pronunciation:

    +
      PH -> ɸ   BH -> β   TH -> θ   DH -> ð   SH -> ʃ   ZH -> ʒ
    +  SJ -> ɕ   ZJ -> ʑ   ʃx -> ɧ   xʃ -> ɧ
    +
    +

    It may be worth noting at this point that digraphs of two lowercase letters +were intentionally avoided to prevent interference with regular typing. If +you need to type a sequence without it turning into a digraph (maybe you +want to type an actual ʃx), place a backslash between the two characters +(so, type ʃ\x).

    +

    In fact, [backslash][anything] is treated as a digraph that simply resolves +to the second character.

    +
  • +
  • +

    A few digraphs are based on shape:

    +
      rO -> ɾ   r0 -> ɾ   vO -> ʋ   v0 -> ʋ
    +
    +

    Another related point: digraphs that contain a lowercase letter can also be +typed with that letter as uppercase. So, if RO is easier to type than +rO, that works as well.

    +
  • +
  • +

    Retroflex and nonpulmonic symbols have their own categories:

    +
      retroflex: ) looks like the shape of the tongue
    +  t) -> ʈ   d) -> ɖ   n) -> ɳ   r) -> ɽ   ɾ) -> ɽ   s) -> ʂ
    +  z) -> ʐ   ɹ) -> ɻ   l) -> ɭ   ɗ) -> ᶑ
    +
    +  clicks: clicking noise reminiscent of a *
    +  o* -> ʘ   |* -> ǀ   !* -> ǃ   =* -> ǁ
    +
    +  implosives and ejective marker: direction of airflow
    +  b( -> ɓ   d( -> ɗ   j( -> ʄ   ɟ( -> ʄ   g( -> ɠ   ɢ( -> ʛ
    +  ɖ( -> ᶑ   ') -> ʼ
    +
    +
  • +
  • +

    Superscripts and diacritics that go above the letter use ^, diacritics that +go below use _, and miscellaneous "moved" symbols use < or >:

    +
      ^h -> ʰ   ^n -> ⁿ   ^m -> ᵐ   ^ŋ -> ᵑ   ^l -> ˡ   ^w -> ʷ
    +  ^j -> ʲ   ^ɥ -> ᶣ   ^ʋ -> ᶹ   ^ɣ -> ˠ   ^ʕ -> ˤ
    +
    +  _| -> ◌̩   ^| -> ◌̍   _o -> ◌̥   ^o -> ◌̊   _v -> ◌̬   ^v -> ◌̌
    +
    +  _^ -> ◌̯   _: -> ◌̤   _~ -> ◌̰   _[ -> ◌̪   _] -> ◌̺   _{ -> ◌̼
    +  _+ -> ◌̟   __ -> ◌̠   _) -> ◌̹   _( -> ◌̜   _# -> ◌̻   [] -> ◌̻
    +
    +  ^> -> ◌̚   ^: -> ◌̈   ^x -> ◌̽   ^~ -> ◌̃
    +
    +  -' -> ˔   _˔ -> ◌̝   -, -> ˕   _˕ -> ◌̞   <| -> ⊣   _⊣ -> ◌̘
    +  >| -> ⊢   _⊢ -> ◌̙
    +
    +  ~~ -> ◌̴   >r -> ˞
    +
    +

    Note that all of these sequences can be flipped in order—that is, ^h +produces the same thing as h^. This allows usage such as |<_ to produce +⊣_ which becomes ◌̘.

    +
  • +
  • +

    Tonal countours use numbers plus |:

    +
      5| -> ˥   4| -> ˦   3| -> ˧   2| -> ˨   1| -> ˩
    +  +| -> ꜛ   -| -> ꜜ
    +
    +
  • +
  • +

    Finally, some digraphs simply have unique mnemonics:

    +
      ː-  -> ˑ   "chop off" the bottom triangle
    +  ((  -> ◌͡◌  two parens for a tie that connects 2 chars
    +  ))  -> ◌͜◌
    +  ◌͜◌) -> ‿   one more paren to make it a little bit longer
    +
    +
  • +
+ + + + diff --git a/vendor/KeyboardFire/phondue/phondue.css b/vendor/KeyboardFire/phondue/phondue.css new file mode 100644 index 0000000..d13efb3 --- /dev/null +++ b/vendor/KeyboardFire/phondue/phondue.css @@ -0,0 +1,48 @@ +body { + font-family: sans-serif; + max-width: 1000px; + margin: 0px auto; + padding: 20px 10px; + color: #333; + background-color: #f7f7f7; + line-height: 1.6; +} + +h1 { + margin: 0px; +} + +#subtitle { + font-style: italic; + margin: 0px; +} + +table { + border-collapse: collapse; +} + +td { + padding: 0; + margin: 0; + text-align: center; +} +td.grey { + background-color: #ddd; +} + +button { + padding: 5px 10px; + border: none; + background: none; +} +button:hover { + background-color: #eee; + box-shadow: 0px 0px 10px rgba(0,0,0,0.2) inset; +} +button:active { + background-color: #ccc; +} + +#inputBox { + width: 98%; +} diff --git a/vendor/KeyboardFire/phondue/phondue.js b/vendor/KeyboardFire/phondue/phondue.js new file mode 100644 index 0000000..14c34e3 --- /dev/null +++ b/vendor/KeyboardFire/phondue/phondue.js @@ -0,0 +1,54 @@ +(function() { + var inputBox; + var keypress = function(e) { + var val = inputBox.value, + key = String.fromCharCode(e.which || e.keyCode), + pos = inputBox.selectionStart || val.length, + digraph = digraphs[val.substr(pos - 1, 1) + key]; + if (digraph) { + e.preventDefault(); + val = val.slice(0, pos - 1) + digraph + val.slice(pos); + inputBox.value = val; + } + }; + + var digraphs = {}; + + window.addEventListener('load', function() { + var phondue = document.getElementById('phondue'); + + var builderReq = new XMLHttpRequest(); + builderReq.addEventListener('load', function() { + phondue.innerHTML = this.responseText; + [].slice.call(document.getElementsByTagName('button')) + .forEach(function(btn) { + btn.addEventListener('click', function() { + inputBox.value += btn.innerText; + inputBox.focus(); + }); + }); + + inputBox = document.createElement('input'); + inputBox.id = 'inputBox'; + inputBox.spellcheck = false; + inputBox.addEventListener('keypress', keypress); + phondue.appendChild(inputBox); + }); + builderReq.open('GET', 'builder.html'); + builderReq.send(); + + var digraphsReq = new XMLHttpRequest(); + digraphsReq.addEventListener('load', function() { + this.responseText.split('\n').forEach(function(digraph) { + var chunks = digraph.match(/\S{8}/g); + if (!chunks || chunks.length != 3) return; // failsafe + chunks = chunks.map(function(hex) { + return String.fromCharCode(parseInt(hex, 16)); + }); + digraphs[chunks[0] + chunks[1]] = chunks[2]; + }); + }); + digraphsReq.open('GET', 'digraphs.txt'); + digraphsReq.send(); + }); +})(); diff --git a/vendor/KeyboardFire/phondue/table.html b/vendor/KeyboardFire/phondue/table.html new file mode 100644 index 0000000..dcc8323 --- /dev/null +++ b/vendor/KeyboardFire/phondue/table.html @@ -0,0 +1,1143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Bilabial + + Labiodental + + Dental + + Alveolar + + Postalveolar + + Palatal + + Velar + + Uvular + + Pharyngeal + + Glottal +
+ Plosive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Nasal + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Trill + + + + + + + + + + + + + + + + + + + + + + + +
+ Tap/Flap + + + + + + + + + + + + + + + + + + + + + + +
+ Fricative + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Lateral fricative + + + + + + + + + + + + + + + + + + + + + + +
+ Approximant + + + + + + + + + + + + + + + + + + + + + + + + +
+ Lateral approximant + + + + + + + + + + + + + + + + + + + + + + + +
+ + Front + + Central + + Back + + + Non-pulmonic + + + Other + + + Diacritics +
+ Close + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Near-close + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Close-mid + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Mid + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Open-mid + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Near-open + + + + + + + + + + + + + + + + + +
+ Open + + + + + + + + + + + + + + + + + + Suprasegmental + + + + + + + + + + + + + + + + +
diff --git a/vendor/KeyboardFire/phondue/usage.html b/vendor/KeyboardFire/phondue/usage.html new file mode 100644 index 0000000..111fe92 --- /dev/null +++ b/vendor/KeyboardFire/phondue/usage.html @@ -0,0 +1,124 @@ +

Usage

+

As seen in the above table, certain symbols of the IPA can be entered by +clicking on them. However, it is far more efficient to use the many keyboard +shortcuts that Phondue provides. These are called digraphs, since they are +made up of two letters, and they allow you to type any IPA symbol with only a +standard keyboard.

+

These symbols were decided to be intuitive as possible:

+
    +
  • +

    Many symbols that look similar to letters of the English alphabet (such as +small caps) can be produced by doubling the capital letter:

    +
      GG -> ɢ   ?? -> ʔ   NN -> ɴ   BB -> ʙ   RR -> ʀ   XX -> χ
    +  LL -> ʟ   II -> ɪ   YY -> ʏ   UU -> ʊ   EE -> ɛ   OO -> ɞ
    +  AA -> ɑ   '' -> ˈ   ,, -> ˌ   :: -> ː
    +
    +
  • +
  • +

    The slash is used to "reflect," "rotate," or otherwise flip around a given +symbol:

    +
      ʀ/ -> ʁ   ʔ/ -> ʕ   ?/ -> ʕ   r/ -> ɹ   y/ -> ʎ   m/ -> ɯ
    +  o/ -> ø   e/ -> ə   ɛ/ -> ɜ   c/ -> ɔ   a/ -> ɐ   ɑ/ -> ɒ
    +  w/ -> ʍ   h/ -> ɥ   k/ -> ʞ   !/ -> ¡   v/ -> ʌ
    +
    +

    Also note that for any digraph, if either of the two characters that +compose it are not "standard" letters you can find on your keyboard, the +digraph can be done in reverse order—so since ʀ/ produces ʁ, you can press +/ again to go back to ʀ in case of accidental flippage (it's also weirdly +amusing to press RR///////).

    +

    This sometimes makes it easier to enter certain pairs; you may prefer to +use AA for ɑ and AA/ for ɒ instead of the visual o| and |o.

    +
  • +
  • +

    Digraphs have also been designed for when a symbol looks like two overlayed +characters, or two characters next to each other. This includes "hooked" +letters (such as ŋ), produced with the original letter and a comma, and +"stroked" letters (such as ɟ), produced with the original letter and a dash:

    +
      m, -> ɱ   n, -> ŋ   ŋ, -> ɲ   v, -> ⱱ   c, -> ç   j, -> ʝ
    +  x, -> ɣ   ɣ, -> χ   h, -> ɦ   w, -> ɰ
    +
    +  j- -> ɟ   h- -> ħ   l- -> ɬ   i- -> ɨ   u- -> ʉ   e- -> ɘ
    +  o- -> ɵ   ʕ- -> ʢ   ?- -> ʡ   ʔ- -> ʡ
    +
    +  LZ -> ɮ   OX -> ɤ   XO -> ɤ   OE -> œ   EB -> ɞ   AE -> æ
    +  CE -> ɶ   RL -> ɺ   LR -> ɺ   ɾl -> ɺ   lɾ -> ɺ
    +
    +  w| -> ɰ   o/ -> ø   ɜ( -> ɞ   /\ -> ʌ   o| -> ɑ   a| -> ɑ
    +  |o -> ɒ   |a -> ɒ
    +
    +  o. -> ʘ   |= -> ǂ   || -> ‖   /^ -> ↗   /> -> ↗   \v -> ↘
    +  \> -> ↘
    +
    +
  • +
  • +

    Others are based on pronunciation:

    +
      PH -> ɸ   BH -> β   TH -> θ   DH -> ð   SH -> ʃ   ZH -> ʒ
    +  SJ -> ɕ   ZJ -> ʑ   ʃx -> ɧ   xʃ -> ɧ
    +
    +

    It may be worth noting at this point that digraphs of two lowercase letters +were intentionally avoided to prevent interference with regular typing. If +you need to type a sequence without it turning into a digraph (maybe you +want to type an actual ʃx), place a backslash between the two characters +(so, type ʃ\x).

    +

    In fact, [backslash][anything] is treated as a digraph that simply resolves +to the second character.

    +
  • +
  • +

    A few digraphs are based on shape:

    +
      rO -> ɾ   r0 -> ɾ   vO -> ʋ   v0 -> ʋ
    +
    +

    Another related point: digraphs that contain a lowercase letter can also be +typed with that letter as uppercase. So, if RO is easier to type than +rO, that works as well.

    +
  • +
  • +

    Retroflex and nonpulmonic symbols have their own categories:

    +
      retroflex: ) looks like the shape of the tongue
    +  t) -> ʈ   d) -> ɖ   n) -> ɳ   r) -> ɽ   ɾ) -> ɽ   s) -> ʂ
    +  z) -> ʐ   ɹ) -> ɻ   l) -> ɭ   ɗ) -> ᶑ
    +
    +  clicks: clicking noise reminiscent of a *
    +  o* -> ʘ   |* -> ǀ   !* -> ǃ   =* -> ǁ
    +
    +  implosives and ejective marker: direction of airflow
    +  b( -> ɓ   d( -> ɗ   j( -> ʄ   ɟ( -> ʄ   g( -> ɠ   ɢ( -> ʛ
    +  ɖ( -> ᶑ   ') -> ʼ
    +
    +
  • +
  • +

    Superscripts and diacritics that go above the letter use ^, diacritics that +go below use _, and miscellaneous "moved" symbols use < or >:

    +
      ^h -> ʰ   ^n -> ⁿ   ^m -> ᵐ   ^ŋ -> ᵑ   ^l -> ˡ   ^w -> ʷ
    +  ^j -> ʲ   ^ɥ -> ᶣ   ^ʋ -> ᶹ   ^ɣ -> ˠ   ^ʕ -> ˤ
    +
    +  _| -> ◌̩   ^| -> ◌̍   _o -> ◌̥   ^o -> ◌̊   _v -> ◌̬   ^v -> ◌̌
    +
    +  _^ -> ◌̯   _: -> ◌̤   _~ -> ◌̰   _[ -> ◌̪   _] -> ◌̺   _{ -> ◌̼
    +  _+ -> ◌̟   __ -> ◌̠   _) -> ◌̹   _( -> ◌̜   _# -> ◌̻   [] -> ◌̻
    +
    +  ^> -> ◌̚   ^: -> ◌̈   ^x -> ◌̽   ^~ -> ◌̃
    +
    +  -' -> ˔   _˔ -> ◌̝   -, -> ˕   _˕ -> ◌̞   <| -> ⊣   _⊣ -> ◌̘
    +  >| -> ⊢   _⊢ -> ◌̙
    +
    +  ~~ -> ◌̴   >r -> ˞
    +
    +

    Note that all of these sequences can be flipped in order—that is, ^h +produces the same thing as h^. This allows usage such as |<_ to produce +⊣_ which becomes ◌̘.

    +
  • +
  • +

    Tonal countours use numbers plus |:

    +
      5| -> ˥   4| -> ˦   3| -> ˧   2| -> ˨   1| -> ˩
    +  +| -> ꜛ   -| -> ꜜ
    +
    +
  • +
  • +

    Finally, some digraphs simply have unique mnemonics:

    +
      ː-  -> ˑ   "chop off" the bottom triangle
    +  ((  -> ◌͡◌  two parens for a tie that connects 2 chars
    +  ))  -> ◌͜◌
    +  ◌͜◌) -> ‿   one more paren to make it a little bit longer
    +
    +
  • +
diff --git a/webpack.config.js b/webpack.config.js index c750842..b78df96 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -36,6 +36,20 @@ const webpackConfig = { } ] } + , { + test: (/\.html$/) + , exclude: (/node_modules/) + , use: [ + 'html-loader' + ] + } + , { + test: (/\.txt$/) + , exclude: (/node_modules/) + , use: [ + 'raw-loader' + ] + } , { test: (/\.jsx?$/) , exclude: (/node_modules/) diff --git a/yarn.lock b/yarn.lock index 4583065..7b30d9b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -134,6 +134,10 @@ assert@^1.1.1: dependencies: util "0.10.3" +ast-types@0.9.6: + version "0.9.6" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" + async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" @@ -490,6 +494,13 @@ bulma@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/bulma/-/bulma-0.4.1.tgz#620b7986bc552311358aa9393c10905c55648864" +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -570,6 +581,12 @@ clap@^1.0.9: dependencies: chalk "^1.1.3" +clean-css@4.0.x: + version "4.0.12" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.0.12.tgz#a02e61707f1840bd3338f54dbc9acbda4e772fa3" + dependencies: + source-map "0.5.x" + cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" @@ -656,6 +673,12 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" +commander@2.9.x: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -982,6 +1005,13 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" +es6-templates@^0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/es6-templates/-/es6-templates-0.2.3.tgz#5cb9ac9fb1ded6eb1239342b81d792bbb4078ee4" + dependencies: + recast "~0.11.12" + through "~2.3.6" + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -994,6 +1024,10 @@ esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" +esprima@~3.1.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -1265,6 +1299,10 @@ graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" @@ -1311,6 +1349,10 @@ hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" +he@1.1.x: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -1338,6 +1380,29 @@ html-comment-regex@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" +html-loader@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-0.4.5.tgz#5fbcd87cd63a5c49a7fce2fe56f425e05729c68c" + dependencies: + es6-templates "^0.2.2" + fastparse "^1.1.1" + html-minifier "^3.0.1" + loader-utils "^1.0.2" + object-assign "^4.1.0" + +html-minifier@^3.0.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.4.3.tgz#eb3a7297c804611f470454eeebe0aacc427e424a" + dependencies: + camel-case "3.0.x" + clean-css "4.0.x" + commander "2.9.x" + he "1.1.x" + ncname "1.0.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "~2.8.22" + http-errors@~1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" @@ -1752,6 +1817,10 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + lru-cache@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" @@ -1895,10 +1964,22 @@ nan@^2.3.0, nan@^2.3.2: version "2.6.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" +ncname@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ncname/-/ncname-1.0.0.tgz#5b57ad18b1ca092864ef62b0b1ed8194f383b71c" + dependencies: + xml-char-classes "^1.0.0" + negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" +no-case@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.1.tgz#7aeba1c73a52184265554b7dc03baf720df80081" + dependencies: + lower-case "^1.1.1" + node-gyp@^3.3.1: version "3.6.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.0.tgz#7474f63a3a0501161dda0b6341f022f14c423fa6" @@ -2100,6 +2181,12 @@ papaparse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-4.2.0.tgz#ac5bed7de39445dabb6616a507024b8b88eee7c3" +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + dependencies: + no-case "^2.2.0" + parse-asn1@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" @@ -2431,7 +2518,7 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -private@^0.1.6: +private@^0.1.6, private@~0.1.5: version "0.1.7" resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" @@ -2514,6 +2601,10 @@ range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" +raw-loader@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" + rc@^1.1.7: version "1.2.1" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" @@ -2559,6 +2650,15 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" +recast@~0.11.12: + version "0.11.23" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" + dependencies: + ast-types "0.9.6" + esprima "~3.1.0" + private "~0.1.5" + source-map "~0.5.0" + redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -2613,6 +2713,10 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + remove-trailing-separator@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" @@ -2804,7 +2908,7 @@ source-map-support@^0.4.2: dependencies: source-map "^0.5.6" -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3: +source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.3: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" @@ -2973,6 +3077,10 @@ tar@^2.0.0, tar@^2.2.1: fstream "^1.0.2" inherits "2" +through@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + timers-browserify@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86" @@ -3022,7 +3130,7 @@ type-is@~1.6.14: media-typer "0.3.0" mime-types "~2.1.15" -uglify-js@^2.8.5: +uglify-js@^2.8.5, uglify-js@~2.8.22: version "2.8.22" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1a0" dependencies: @@ -3057,6 +3165,10 @@ unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + url-loader@^0.5.8: version "0.5.8" resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.5.8.tgz#b9183b1801e0f847718673673040bc9dc1c715c5" @@ -3200,6 +3312,10 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" +xml-char-classes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d" + xtend@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"