Select from the top100 books
This commit is contained in:
parent
24586525e7
commit
4058ebb0f7
@ -14,6 +14,7 @@ import { TextInput } from 'components/TextInput'
|
|||||||
import { TextOutput } from 'components/TextOutput'
|
import { TextOutput } from 'components/TextOutput'
|
||||||
import { TotalTime } from 'components/TotalTime'
|
import { TotalTime } from 'components/TotalTime'
|
||||||
import { Div } from 'styles/Div'
|
import { Div } from 'styles/Div'
|
||||||
|
import { BookSelect } from 'components/BookSelect'
|
||||||
|
|
||||||
export const App = () => {
|
export const App = () => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
@ -36,6 +37,8 @@ export const App = () => {
|
|||||||
<Div maxWidth="600px" margin="0 auto">
|
<Div maxWidth="600px" margin="0 auto">
|
||||||
<RsvpWidget />
|
<RsvpWidget />
|
||||||
</Div>
|
</Div>
|
||||||
|
<h2>Text Cursor</h2>
|
||||||
|
<TextOutput />
|
||||||
<Flex flexWrap="wrap">
|
<Flex flexWrap="wrap">
|
||||||
<FlexMain padding="10px" minWidth="300px">
|
<FlexMain padding="10px" minWidth="300px">
|
||||||
<h2>Options</h2>
|
<h2>Options</h2>
|
||||||
@ -46,10 +49,10 @@ export const App = () => {
|
|||||||
<TextInput />
|
<TextInput />
|
||||||
</FlexMain>
|
</FlexMain>
|
||||||
</Flex>
|
</Flex>
|
||||||
<h2>Text Output</h2>
|
|
||||||
<TextOutput />
|
|
||||||
<h2>Time needed</h2>
|
<h2>Time needed</h2>
|
||||||
<TotalTime />
|
<TotalTime />
|
||||||
|
<h2>Select from Project Gutenberg Top 100</h2>
|
||||||
|
<BookSelect />
|
||||||
</Container>
|
</Container>
|
||||||
</main>
|
</main>
|
||||||
<footer>
|
<footer>
|
||||||
|
43
src/components/BookSelect.js
Normal file
43
src/components/BookSelect.js
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import React, { useState, useCallback } from 'react'
|
||||||
|
|
||||||
|
import bookIndex from '../../books/index.json'
|
||||||
|
import { Flex, FlexMain } from 'styles/Flex.js'
|
||||||
|
import Axios from 'axios'
|
||||||
|
import { useDispatch } from 'store'
|
||||||
|
|
||||||
|
const bookList = Object.entries(bookIndex).sort()
|
||||||
|
|
||||||
|
export const BookSelect = () => {
|
||||||
|
const [bookId, setBookId] = useState(bookList[0][0])
|
||||||
|
const { setText } = useDispatch()
|
||||||
|
|
||||||
|
const loadBook = useCallback(() => {
|
||||||
|
Axios.get(`/books/${bookId}.txt`)
|
||||||
|
.then(res => res.data)
|
||||||
|
.then(setText)
|
||||||
|
}, [bookId, setText])
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Flex>
|
||||||
|
<FlexMain>
|
||||||
|
<select
|
||||||
|
style={{ width: '100%' }}
|
||||||
|
value={bookId}
|
||||||
|
onChange={evt => setBookId(evt.target.value)}
|
||||||
|
>
|
||||||
|
{/* <option value={0}>Select from Project Gutenberg Top 100</option> */}
|
||||||
|
{bookList.map(([id, title]) => (
|
||||||
|
<option key={id} value={id}>
|
||||||
|
{title}
|
||||||
|
</option>
|
||||||
|
))}
|
||||||
|
</select>
|
||||||
|
</FlexMain>
|
||||||
|
<button onClick={loadBook}>Load</button>
|
||||||
|
</Flex>
|
||||||
|
<span>
|
||||||
|
<a href="https://www.gutenberg.org/browse/scores/top">Source</a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
@ -32,8 +32,8 @@ export const SearchBar = () => {
|
|||||||
)
|
)
|
||||||
|
|
||||||
const handleSelect = async idx => {
|
const handleSelect = async idx => {
|
||||||
const { id, language } = results[idx]
|
const { textUris, language } = results[idx]
|
||||||
setText(await getBook(id))
|
setText(await getBook(textUris[0]))
|
||||||
setLang(language[0])
|
setLang(language[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ import Axios from 'axios'
|
|||||||
export async function search(searchTerm, maxResults = Infinity) {
|
export async function search(searchTerm, maxResults = Infinity) {
|
||||||
const regex = new RegExp(searchTerm, 'i')
|
const regex = new RegExp(searchTerm, 'i')
|
||||||
const result = []
|
const result = []
|
||||||
const data = await import('../../data/gutenberg.json').then(
|
const data = await import('../../data/PG-meta.json').then(
|
||||||
module => module.default
|
module => module.default
|
||||||
)
|
)
|
||||||
for (let entry of data) {
|
for (let entry of data) {
|
||||||
@ -16,8 +16,8 @@ export async function search(searchTerm, maxResults = Infinity) {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getBook(bookId) {
|
export async function getBook(textUri) {
|
||||||
const url = `https://gutenberg.muperfredi.de/texts/${bookId}/stripped-body`
|
const url = `https://aleph.gutenberg.org${textUri}`
|
||||||
const text = await Axios.get(url).then(res => res.data.body)
|
const text = await Axios.get(url).then(res => res.data.body)
|
||||||
return text
|
return text
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user