Skip to content

Commit de37634

Browse files
authored
Merge pull request #35 from pietrop/refactors-from-pagination
Extrated some refactors from pagination PR
2 parents 438b10d + 68c4515 commit de37634

File tree

7 files changed

+182
-62
lines changed

7 files changed

+182
-62
lines changed

src/components/index.js

Lines changed: 82 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,17 @@ import { createEditor, Editor, Transforms } from 'slate';
1818
// Import the Slate components and React plugin.
1919
import { Slate, Editable, withReact, ReactEditor } from 'slate-react';
2020
import { withHistory } from 'slate-history';
21-
import { faSave, faShare, faUndo, faSync, faInfoCircle, faMehBlank, faPause, faMusic, faClosedCaptioning } from '@fortawesome/free-solid-svg-icons';
21+
import {
22+
faSave,
23+
faFileDownload,
24+
faUndo,
25+
faSync,
26+
faInfoCircle,
27+
// faMehBlank,
28+
faPause,
29+
// faMusic,
30+
// faClosedCaptioning,
31+
} from '@fortawesome/free-solid-svg-icons';
2232
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
2333
import { shortTimecode } from '../util/timecode-converter';
2434
import download from '../util/downlaod/index.js';
@@ -27,10 +37,11 @@ import convertDpeToSlate from '../util/dpe-to-slate';
2737
import insertTimecodesInline from '../util/inline-interval-timecodes';
2838
import pluck from '../util/pluk';
2939
import subtitlesExportOptionsList from '../util/export-adapters/subtitles-generator/list.js';
30-
import updateTimestamps from '../util/update-timestamps';
40+
// import updateTimestamps from '../util/update-timestamps';
41+
import updateTimestamps from '../util/export-adapters/slate-to-dpe/update-timestamps';
3142
import exportAdapter from '../util/export-adapters';
3243
import isEmpty from '../util/is-empty';
33-
44+
import generatePreviousTimingsUpToCurrent from '../util/generate-previous-timings-up-to-current';
3445
const PLAYBACK_RATE_VALUES = [0.2, 0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 3, 3.5];
3546
const SEEK_BACK_SEC = 15;
3647
const PAUSE_WHILTE_TYPING_TIMEOUT_MILLISECONDS = 1500;
@@ -306,14 +317,14 @@ export default function SlateTranscriptEditor(props) {
306317
if (e.target.classList.contains('timecode')) {
307318
const start = e.target.dataset.start;
308319
if (mediaRef && mediaRef.current) {
309-
mediaRef.current.currentTime = parseInt(start);
320+
mediaRef.current.currentTime = parseFloat(start);
310321
mediaRef.current.play();
311322
}
312323
} else if (e.target.dataset.slateString) {
313324
if (e.target.parentNode.dataset.start) {
314325
const start = e.target.parentNode.dataset.start;
315326
if (mediaRef && mediaRef.current && start) {
316-
mediaRef.current.currentTime = parseInt(start);
327+
mediaRef.current.currentTime = parseFloat(start);
317328
mediaRef.current.play();
318329
}
319330
}
@@ -397,19 +408,19 @@ export default function SlateTranscriptEditor(props) {
397408
* to provide current paragaph's highlight.
398409
* @param {Number} currentTime - float in seconds
399410
*/
400-
const generatePreviousTimingsUpToCurrent = (currentTime) => {
401-
// edge case - empty transcription
402-
if (isEmpty(props.transcriptData)) {
403-
return '';
404-
}
405-
const lastWordStartTime = props.transcriptData.words[props.transcriptData.words.length - 1].start;
406-
const lastWordStartTimeInt = parseInt(lastWordStartTime);
407-
const emptyListOfTimes = Array(lastWordStartTimeInt);
408-
const listOfTimesInt = [...emptyListOfTimes.keys()];
409-
const listOfTimesUpToCurrentTimeInt = listOfTimesInt.splice(0, currentTime, 0);
410-
const stringlistOfTimesUpToCurrentTimeInt = listOfTimesUpToCurrentTimeInt.join(' ');
411-
return stringlistOfTimesUpToCurrentTimeInt;
412-
};
411+
// const generatePreviousTimingsUpToCurrent = (currentTime) => {
412+
// // edge case - empty transcription
413+
// if (isEmpty(props.transcriptData)) {
414+
// return '';
415+
// }
416+
// const lastWordStartTime = props.transcriptData.words[props.transcriptData.words.length - 1].start;
417+
// const lastWordStartTimeInt = parseInt(lastWordStartTime);
418+
// const emptyListOfTimes = Array(lastWordStartTimeInt);
419+
// const listOfTimesInt = [...emptyListOfTimes.keys()];
420+
// const listOfTimesUpToCurrentTimeInt = listOfTimesInt.splice(0, currentTime, 0);
421+
// const stringlistOfTimesUpToCurrentTimeInt = listOfTimesUpToCurrentTimeInt.join(' ');
422+
// return stringlistOfTimesUpToCurrentTimeInt;
423+
// };
413424

414425
const handleSetPauseWhileTyping = () => {
415426
setIsPauseWhiletyping(!isPauseWhiletyping);
@@ -447,9 +458,7 @@ export default function SlateTranscriptEditor(props) {
447458
<style scoped>
448459
{`
449460
/* Next words */
450-
.timecode[data-previous-timings*="${
451-
mediaRef && mediaRef.current && mediaRef.current.duration && generatePreviousTimingsUpToCurrent(parseInt(currentTime))
452-
}"]{
461+
.timecode[data-previous-timings*="${generatePreviousTimingsUpToCurrent(parseInt(currentTime), value)}"]{
453462
color: #9E9E9E;
454463
}
455464
`}
@@ -613,8 +622,16 @@ export default function SlateTranscriptEditor(props) {
613622
overlay={<Tooltip id="tooltip-disabled">Export options</Tooltip>}
614623
>
615624
<span className="d-inline-block">
616-
<DropdownButton disabled={isProcessing} id="dropdown-basic-button" title={<FontAwesomeIcon icon={faShare} />} variant="light">
625+
<DropdownButton
626+
disabled={isProcessing}
627+
id="dropdown-basic-button"
628+
title={<FontAwesomeIcon icon={faFileDownload} />}
629+
variant="light"
630+
>
617631
{/* TODO: need to run re-alignement if exportin with timecodes true, otherwise they'll be inaccurate */}
632+
<Dropdown.Item style={{ color: 'black' }} disabled>
633+
<b>Text Export</b>
634+
</Dropdown.Item>
618635
<Dropdown.Item
619636
onClick={() => {
620637
handleExport({
@@ -752,6 +769,27 @@ export default function SlateTranscriptEditor(props) {
752769
Word (OHMS)
753770
</Dropdown.Item>
754771
<Dropdown.Divider />
772+
773+
<Dropdown.Item style={{ color: 'black' }} disabled>
774+
<b>Closed Captions Export</b>
775+
</Dropdown.Item>
776+
{subtitlesExportOptionsList.map(({ type, label, ext }, index) => {
777+
return (
778+
<Dropdown.Item
779+
key={index + label}
780+
onClick={() => {
781+
handleExport({ type, ext, isDownload: true });
782+
}}
783+
>
784+
{label} (<code>.{ext}</code>)
785+
</Dropdown.Item>
786+
);
787+
})}
788+
<Dropdown.Divider />
789+
<Dropdown.Item style={{ color: 'black' }} disabled>
790+
<b>Developer options</b>
791+
</Dropdown.Item>
792+
755793
<Dropdown.Item
756794
onClick={() => {
757795
handleExport({
@@ -782,7 +820,7 @@ export default function SlateTranscriptEditor(props) {
782820
</span>
783821
</OverlayTrigger>
784822
</Col>
785-
<Col xs={2} sm={12} md={12} lg={12} xl={12} className={'p-1 mx-auto'}>
823+
{/* <Col xs={2} sm={12} md={12} lg={12} xl={12} className={'p-1 mx-auto'}>
786824
<OverlayTrigger
787825
OverlayTrigger
788826
delay={TOOTLIP_LONGER_DELAY}
@@ -809,7 +847,7 @@ export default function SlateTranscriptEditor(props) {
809847
})}
810848
</DropdownButton>
811849
</OverlayTrigger>
812-
</Col>
850+
</Col> */}
813851
<Col xs={2} sm={12} md={12} lg={12} xl={12} className={'p-1 mx-auto'}>
814852
<OverlayTrigger
815853
OverlayTrigger
@@ -822,23 +860,23 @@ export default function SlateTranscriptEditor(props) {
822860
</Button>
823861
</OverlayTrigger>
824862
</Col>
825-
<Col xs={2} sm={12} md={12} lg={12} xl={12} className={'p-1 mx-auto'}>
826-
<OverlayTrigger
827-
delay={TOOTLIP_DELAY}
828-
placement={'bottom'}
829-
overlay={
830-
<Tooltip id="tooltip-disabled">
831-
To insert a paragraph break, and split a pargraph in two, put the cursor at a point where you'd want to add a paragraph break in
832-
the text and either click this button or hit enter key
833-
</Tooltip>
834-
}
835-
>
836-
<Button disabled={isProcessing} onClick={breakParagraph} variant="light">
837-
{/* <FontAwesomeIcon icon={ faICursor } /> */}
838-
</Button>
839-
</OverlayTrigger>
840-
</Col>
841-
<Col xs={2} sm={12} md={12} lg={12} xl={12} className={'p-1 mx-auto'}>
863+
{/* <Col xs={2} sm={12} md={12} lg={12} xl={12} className={'p-1 mx-auto'}>
864+
<OverlayTrigger
865+
delay={TOOTLIP_DELAY}
866+
placement={'bottom'}
867+
overlay={
868+
<Tooltip id="tooltip-disabled">
869+
To insert a paragraph break, and split a pargraph in two, put the cursor at a point where you'd want to add a paragraph break in
870+
the text and either click this button or hit enter key
871+
</Tooltip>
872+
}
873+
>
874+
<Button disabled={isProcessing} onClick={breakParagraph} variant="light">
875+
876+
</Button>
877+
</OverlayTrigger>
878+
</Col> */}
879+
{/* <Col xs={2} sm={12} md={12} lg={12} xl={12} className={'p-1 mx-auto'}>
842880
<OverlayTrigger
843881
delay={TOOTLIP_DELAY}
844882
placement={'bottom'}
@@ -850,16 +888,16 @@ export default function SlateTranscriptEditor(props) {
850888
<FontAwesomeIcon icon={faMehBlank} />
851889
</Button>
852890
</OverlayTrigger>
853-
</Col>
854-
<Col xs={2} sm={12} md={12} lg={12} xl={12} className={'p-1 mx-auto'}>
891+
</Col> */}
892+
{/* <Col xs={2} sm={12} md={12} lg={12} xl={12} className={'p-1 mx-auto'}>
855893
<OverlayTrigger delay={TOOTLIP_DELAY} placement={'bottom'} overlay={<Tooltip id="tooltip-disabled">Insert a ♫ in the text</Tooltip>}>
856894
<span className="d-inline-block">
857895
<Button onClick={handleInsertMusicNote} variant={'light'}>
858896
<FontAwesomeIcon icon={faMusic} />
859897
</Button>
860898
</span>
861899
</OverlayTrigger>
862-
</Col>
900+
</Col> */}
863901
<Col xs={2} sm={12} md={12} lg={12} xl={12} className={'p-1 mx-auto'}>
864902
<OverlayTrigger
865903
delay={TOOTLIP_DELAY}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { generatePreviousTimingsUpToCurrentOne } from '../dpe-to-slate';
2+
3+
/**
4+
* See explanation in `src/utils/dpe-to-slate/index.js` for how this function works with css injection
5+
* to provide current paragaph's highlight.
6+
* @param {Number} currentTime - float in seconds
7+
*/
8+
import isEmpty from '../../util/is-empty';
9+
/**
10+
*
11+
* @param {*} currentTime
12+
* @param {*} transcriptData - dpe transcript data with timecodes at word level
13+
*/
14+
// const generatePreviousTimingsUpToCurrent = (currentTime, transcriptData) => {
15+
// // edge case - empty transcription
16+
// if (isEmpty(transcriptData)) {
17+
// return '';
18+
// }
19+
// const lastWordStartTime = transcriptData.words[transcriptData.words.length - 1].start;
20+
// const lastWordStartTimeInt = parseInt(lastWordStartTime);
21+
// const emptyListOfTimes = Array(lastWordStartTimeInt);
22+
// const listOfTimesInt = [...emptyListOfTimes.keys()];
23+
// const listOfTimesUpToCurrentTimeInt = listOfTimesInt.splice(0, currentTime, 0);
24+
// const stringlistOfTimesUpToCurrentTimeInt = listOfTimesUpToCurrentTimeInt.join(' ');
25+
// return stringlistOfTimesUpToCurrentTimeInt;
26+
// };
27+
28+
// export default generatePreviousTimingsUpToCurrent;
29+
30+
/**
31+
*
32+
* @param {*} currentTime
33+
* @param {*} transcriptDataSlateValue - slateJS value data with timecodes at paragraph level
34+
*/
35+
const generatePreviousTimingsUpToCurrent = (currentTime, transcriptDataSlateValue) => {
36+
// edge case - empty transcription
37+
if (isEmpty(transcriptDataSlateValue)) {
38+
return '';
39+
}
40+
const lastWordStartTime = transcriptDataSlateValue[transcriptDataSlateValue.length - 1].start;
41+
const lastWordStartTimeInt = parseInt(lastWordStartTime);
42+
const emptyListOfTimes = Array(lastWordStartTimeInt);
43+
const listOfTimesInt = [...emptyListOfTimes.keys()];
44+
const listOfTimesUpToCurrentTimeInt = listOfTimesInt.splice(0, currentTime, 0);
45+
const stringlistOfTimesUpToCurrentTimeInt = listOfTimesUpToCurrentTimeInt.join(' ');
46+
return stringlistOfTimesUpToCurrentTimeInt;
47+
};
48+
49+
export default generatePreviousTimingsUpToCurrent;

src/util/dpe-to-slate/index.js

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ import { shortTimecode } from '../timecode-converter';
1212
* eg if current time is `3` then `listOfPreviousTimingsUpToCurrentOne` "0 1 2"
1313
*/
1414

15+
// TODO: should it consolidate generatePreviousTimingsUpToCurrent or are they for different porpuses?
16+
// import generatePreviousTimingsUpToCurrent from './generate-previous-timings-up-to-current';
17+
1518
/**
1619
* Generate a list of times, each rounded up to int.
1720
* from zero to the provided `time`.
@@ -21,7 +24,11 @@ import { shortTimecode } from '../timecode-converter';
2124

2225
export const generatePreviousTimings = (time) => {
2326
// https://stackoverflow.com/questions/3746725/how-to-create-an-array-containing-1-n
24-
return [...Array(parseInt(time)).keys()];
27+
if (time) {
28+
return [...Array(parseInt(time)).keys()];
29+
} else {
30+
return [0];
31+
}
2532
};
2633

2734
/**
@@ -68,6 +75,8 @@ const convertDpeToSlate = (transcript) => {
6875
children: [
6976
{
7077
text: 'Text',
78+
// Adding list of words in slateJs paragraphs
79+
words: [],
7180
},
7281
],
7382
},
@@ -83,7 +92,13 @@ const convertDpeToSlate = (transcript) => {
8392
// pre-computing the display of the formatting here so that it doesn't need to convert it in leaf render
8493
startTimecode: shortTimecode(paragraph.start),
8594
type: 'timedText',
86-
children: [{ text: generateText(paragraph, words) }],
95+
children: [
96+
{
97+
text: generateText(paragraph, words),
98+
// Adding list of words in slateJs paragraphs
99+
words,
100+
},
101+
],
87102
}));
88103
};
89104

src/util/export-adapters/slate-to-dpe/index.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33
* https://github.com/pietrop/react-transcript-editor/blob/master/packages/components/timed-text-editor/UpdateTimestamps/index.js
44
* similar to updateTimestamps
55
*/
6-
import { alignSTT } from 'stt-align-node';
7-
import slateToText from '../txt';
6+
// import { alignSTT } from 'stt-align-node';
7+
// import slateToText from '../txt';
88
import countWords from '../../count-words';
9+
import updateTimestampsHelper from './update-timestamps/update-timestamps-helper';
910
/**
1011
* Transposes the timecodes from stt json list of words onto
1112
* dpe transcript with paragraphs and words
1213
*/
13-
const createParagraphsFromSlateJs = (currentContent, newEntities) => {
14+
export const createDpeParagraphsFromSlateJs = (currentContent, newEntities) => {
1415
// Update entites to block structure.
1516
const updatedBlockArray = [];
1617
let totalWords = 0;
@@ -45,9 +46,8 @@ const createParagraphsFromSlateJs = (currentContent, newEntities) => {
4546
* @return dpe transcript with paragraphs and words
4647
*/
4748
const converSlateToDpe = (currentContent, words) => {
48-
const currentText = slateToText({ value: currentContent, speakers: false, timecodes: false, atlasFormat: false });
49-
const alignedWords = alignSTT(words, currentText);
50-
const updatedContent = createParagraphsFromSlateJs(currentContent, alignedWords);
49+
const alignedWords = updateTimestampsHelper(currentContent, words);
50+
const updatedContent = createDpeParagraphsFromSlateJs(currentContent, alignedWords);
5151
return { words: alignedWords, paragraphs: updatedContent };
5252
};
5353

src/util/update-timestamps/index.js renamed to src/util/export-adapters/slate-to-dpe/update-timestamps/index.js

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,15 @@
33
* https://github.com/pietrop/react-transcript-editor/blob/master/packages/components/timed-text-editor/UpdateTimestamps/index.js
44
*
55
*/
6-
import { alignSTT } from 'stt-align-node';
7-
import slateToText from '../export-adapters/txt';
8-
import { shortTimecode } from '../timecode-converter';
9-
import { generatePreviousTimingsUpToCurrentOne } from '../dpe-to-slate';
10-
import countWords from '../count-words';
6+
import { shortTimecode } from '../../../timecode-converter';
7+
import { generatePreviousTimingsUpToCurrentOne } from '../../../dpe-to-slate';
8+
import countWords from '../../../count-words';
9+
import updateTimestampsHelper from './update-timestamps-helper';
1110
/**
1211
* Transposes the timecodes from stt json list of words onto
1312
* slateJs value paragraphs
1413
*/
15-
const createContentFromSlateJsParagraphs = (currentContent, newEntities) => {
14+
export const createSlateContentFromSlateJsParagraphs = (currentContent, newEntities) => {
1615
// Update entites to block structure.
1716
const updatedBlockArray = [];
1817
let totalWords = 0;
@@ -53,9 +52,8 @@ const createContentFromSlateJsParagraphs = (currentContent, newEntities) => {
5352
* @return slateJS value
5453
*/
5554
const updateTimestamps = (currentContent, words) => {
56-
const currentText = slateToText({ value: currentContent, speakers: false, timecodes: false, atlasFormat: false });
57-
const alignedWords = alignSTT(words, currentText);
58-
const updatedContent = createContentFromSlateJsParagraphs(currentContent, alignedWords);
55+
const alignedWords = updateTimestampsHelper(currentContent, words);
56+
const updatedContent = createSlateContentFromSlateJsParagraphs(currentContent, alignedWords);
5957
return updatedContent;
6058
};
6159

0 commit comments

Comments
 (0)