FlashReader
Un lecteur qui affiche un fichier texte mot par mot à la vitesse que vous choisissez et se souvient d'où vous vous êtes arrêté.
- Sortie
- Données collectées
- Aucune
- Prix
- Gratuit
À propos
FlashReader ouvre un fichier .txt local et l'affiche mot par mot au milieu de l'écran, toutes les 500 ms par défaut. Le lecteur règle l'intervalle, la taille des lettres, la couleur des lettres et la couleur de fond. Le texte entier et la position du mot restent sur l'appareil : après un redémarrage, le même fichier se rouvre au même mot.
Cette page décrit la version web sur flashreader.fun : une page HTML avec JavaScript en ligne. Le script n'effectue aucune requête réseau et n'a aucune analytique. L'application Android sur Google Play est une build distincte dont le code source n'est pas couvert ici.
L'ingénierie est modeste et précise : un minuteur qui peut changer de rythme sans perdre le mot, un stockage qui survit à un redémarrage, et des réglages appliqués et enregistrés à l'instant où ils changent.
FlashReader · lecture concentrée
ce qui a été résolu
Boucle des mots
dans le produitCe que cela apporteL'utilisateur choisit un fichier texte et le lit mot par mot à un rythme régulier, et peut changer la vitesse en cours de texte sans perdre sa place.
- Problème
- Les mots doivent changer à un intervalle régulier défini par l'utilisateur, et l'intervalle doit pouvoir être modifié en plein milieu d'un texte sans perdre le mot courant.
- Solution
Un minuteur à intervalle fait avancer un index dans un tableau de mots. Un changement de vitesse arrête ce minuteur et en démarre un nouveau à partir du même index.
- Stack
Transformer un fichier texte choisi en une suite de motsLire le fichier en UTF-8 avec FileReader et le découper aux espaces dans un tableau
Le fichier vient d'un champ de fichier standard limité à .txt, la page n'a donc besoin d'aucun accès au système de fichiers. action_load_file() le lit avec readAsText(file, 'UTF-8') et découpe le résultat aux espaces simples ; la ponctuation reste attachée à son mot. Le texte brut est aussi transmis à saveFileContent() pour la session suivante.
Afficher un mot par tick et ne jamais exécuter deux minuteurs à la foisread() se termine si un minuteur tourne déjà ; chaque tick affiche un mot et enregistre l'index suivant
read() refuse de démarrer sans texte chargé ('Load text file to read!') et retourne immédiatement lorsque is_going est défini, de sorte qu'appuyer deux fois sur lecture ne peut pas lancer un second intervalle. Chaque tick écrit text[position] dans #text-zone et enregistre position + 1. togglePlayPause() bascule entre read() et pause() et met à jour le bouton de lecture.
Un changement de vitesse en cours de lecture doit s'appliquer immédiatementArrêter et redémarrer l'intervalle avec la nouvelle période, en conservant l'index du mot
setInterval ne peut pas changer sa période. updateReadingSpeed() et le gestionnaire de changement du champ de vitesse appellent pause() puis read() lorsque la lecture est active. L'index vit sur l'objet lecteur, de sorte que le minuteur redémarré continue avec le mot suivant. Une valeur saisie inférieure à 1 est ramenée à la valeur par défaut de 500 ms.
Fin du texte : s'arrêter proprement ou recommencerÀ la fin, soit s'arrêter avec 'THE END!' et revenir au mot 0, soit reboucler au mot 0
Le tick vérifie la présence d'un mot indéfini à l'index courant. Avec Loop désactivé, il efface le minuteur, affiche 'THE END!', enregistre la position 0 et remet le bouton de lecture dans son état initial. Avec Loop activé, il remet l'index à 0 et continue. Le choix de Loop est enregistré comme les autres réglages.
Reprise après redémarrage
dans le produitCe que cela apporteFermez l'application et revenez plus tard : le même texte s'ouvre au même mot, avec la même taille de lettres et la même vitesse, le tout conservé sur l'appareil.
- Problème
- Le texte entier, la position du mot et les réglages d'affichage doivent survivre à la fermeture de la page ou de l'application, sans serveur.
- Solution
Le texte va dans IndexedDB, la position et les réglages dans localStorage, et les deux sont relus au démarrage.
- Stack
Un livre entier n'a pas sa place dans localStorageStocker le texte brut dans IndexedDB sous une clé fixe ; garder les petites valeurs dans localStorage
saveFileContent() place le texte dans le store 'files' de la base 'flashreader' (version 2) avec l'identifiant 'flashreader_last_text', de sorte qu'un nouveau fichier remplace l'ancien. onupgradeneeded ne crée le store que s'il manque, donc l'ouverture au-dessus d'une version plus ancienne n'échoue pas.
La position, les couleurs, la taille, la vitesse, la boucle et le nom du fichier restent dans localStorage, où les lectures au démarrage sont synchrones.
Rouvrir le dernier fichier au mot où la lecture s'est arrêtéeEnregistrer l'index à chaque mot affiché ; au démarrage, recharger le texte et cet index
set_position() écrit l'index dans localStorage (fr_position) à chaque tick, de sorte qu'une application fermée ou tuée perd au plus un mot. Le constructeur lit d'abord l'index ; à DOMContentLoaded, getFileContent() charge le texte depuis IndexedDB, le découpe de nouveau et affiche 'The last file, <name>, has been loaded' avec une invitation à appuyer sur lecture.
Les valeurs stockées peuvent manquer ou être corrompuesRestaurer chaque valeur séparément avec des valeurs de repli : position 0, taille 48 px, vitesse 500 ms
Chaque clé est lue et appliquée séparément, donc une valeur erronée ne bloque pas les autres. Une position non numérique devient 0, une taille de police qui s'analyse en 0 retombe sur 48 px, une vitesse qui s'analyse en 0 retombe sur 500 ms. Les couleurs sont enregistrées sans '#' et restaurées avec, puis appliquées au texte et au fond de la page.
Affichage et commandes
dans le produitCe que cela apporteLa taille des lettres et les couleurs changent pendant la lecture, des raccourcis clavier commandent la lecture dans un navigateur, et le lecteur peut reculer de dix mots ou sauter à n'importe quel mot.
- Problème
- La taille des lettres et les couleurs doivent pouvoir changer pendant la lecture, et dans un navigateur de bureau la lecture doit pouvoir se commander au clavier.
- Solution
Les champs de la barre d'outils appliquent et enregistrent chaque changement immédiatement ; dans le navigateur, les raccourcis clavier appellent les mêmes méthodes du lecteur.
- Stack
La taille des lettres et les couleurs doivent s'appliquer immédiatement et persisterLes gestionnaires de changement définissent directement le style et enregistrent la valeur ; une taille inférieure à 8 px devient 8
Le gestionnaire de couleur de police définit la couleur du texte de #text-zone, celui du fond définit l'arrière-plan du body, et celui de la taille définit font-size en px avec un plancher de 8. Chaque gestionnaire écrit sa valeur dans localStorage dans la même étape, il n'y a donc pas d'action d'enregistrement distincte.
Dans le navigateur, la commande au clavier ne doit pas faire défiler la page pendant la lectureEspace, F, Haut et Bas appellent des actions du lecteur et annulent le comportement par défaut du navigateur
Dans la version navigateur, Espace bascule lecture et pause, F bascule le plein écran, Haut accélère les mots de 10 ms avec un plancher de 50 ms, Bas les ralentit de 10 ms. preventDefault() empêche le navigateur de faire défiler la page ou d'actionner un contrôle ayant le focus. Les changements de vitesse passent par updateReadingSpeed(), de sorte qu'un minuteur en cours redémarre au nouveau rythme.
Le lecteur a manqué quelques mots et veut revenir en arrièreLa flèche gauche (navigateur) recule de 10 mots, bornée à 0 ; le champ de position saute à n'importe quel mot
skipBackwards() recule l'index de 10, jamais en dessous de 0, affiche aussitôt ce mot et enregistre la position. Le champ de position de la barre d'outils accepte n'importe quel numéro de mot ; les valeurs négatives deviennent 0.
Le plein écran fonctionne différemment selon les navigateurs et les enveloppes d'applicationEssayer les Fullscreen API standard et préfixées, puis un plugin Cordova Fullscreen si la page en trouve un
enterFullscreen() et exitFullscreen() parcourent les variantes standard, moz, webkit et ms. Lorsqu'un objet global Fullscreen existe, comme avec un plugin plein écran de Cordova, Fullscreen.show() est aussi appelé. Le bouton et la touche F partagent la même vérification des quatre variantes de fullscreenElement.
Chiffres
du produit- Rythme par défaut 500 ms par mot 120 mots par minute.
- Rythme le plus rapide 50 ms par mot Jusqu'à 1,200 mots par minute depuis le clavier.
- Pas de vitesse 10 ms Touches fléchées Haut et Bas.