npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

tokenizer.js

v1.3.2

Published

A modern runtime text tokenizer, for modern web.

Downloads

10

Readme

tokenizer.js

Build Status Coverage Status npm version

A modern async text tokenizer, for the modern web. Demo

Features

  • Pure Javascript (Uses No JQuery or Frameworks).
    • But can be used with any.
  • Based on Reactive Streams (RxJS).
  • Fully Async, get tokenization using REST calls.
  • Written in TypeScript (types bundled).
  • Battle tested on all modern browsers (and IE11).
  • Fully customizable using CSS.
  • Hooks and callbacks included.
  • Support for IME locales like (Hiragana, Kenji etc.)

Articles

Usage

<div id="input" contenteditable></div>
import {Tokenizer} from 'tokenizer.js';

let el = document.getElementById('input');
let tokenizer = new Tokenizer(el /* Target element */, {
        onChange: () => {
            // return a Promise resolving to 
            // tokens.
        }
    }
);

Demos

Config Options

 let tokenizer = new Tokenizer(el, {
    initialInput: [], //  Initial token state, when the Tokenizer is initialized, this shows up as initial tokens.

    isFocused: false, //Flag to indicate whether the tokenizer is in focus when initialized.


    // A callback called whenever the text in the tokenizer is changed. 
    //This should return a Promise resolving to the new tokenization state.
    onChange: (inputText: string, caretPosition: number, isCaretOnSeparator?: boolean) => {
        return new Promise<DisplayToken[]>();
    },

    // Callback called on each keydown inside the tokenizer.
    // Return `false` to stop propagation.
    onKeyDown: (event: KeyboardEvent) => true,

    // Callback called when focus state of the tokenizer is changed. 
    // The param `isFocused` indicates the new focus state.
    onFocusChanged: (isFocused: boolean) => void,

    // Callback called when wrapping state of the tokenizer changes. 
    // The param `isWrapped` represents whether the tokenizer is wrapping.
    onWrap: (isWrapped: boolean) => void,

    // Callback called when the caret position is changed. 
    // For eg. using arrow keys, backspace, click etc.
    onCaretPositionChanged: (inputText: string, caretPosiotion: number, isCaretOnSeparator: boolean) => void,

    // Callback called when a token is hovered over.
    onMouseOverToken: (tokenIndex: number, e: MouseEvent) => void,

    // Callback called when the user stop hovering over any tokens.
    onMouseOutTokenizer: () => void
 })

Public Methods

let tokenizer = new Tokenizer(el, config);

// Clear the tokenizer text.
tokenizer.clear();

// Blur the tokenizer (loose focus).
tokenizer.blur();

// Get coords of the token having the caret.
tokenizer.getCaretTokenPosition(); // {x: 50, y: 80} For eg.

// Gets the position of the token at [idx] index.
tokenizer.getTokenPosition(idx: number);

// Replace the text of the tokenizer with new text.
// This is followed by a automatic reTokenization.
tokenizer.updateText(text: string);

// Update the tokenizer display with a new set of `tokens`,
// puts the caret after `caretTokenIdx` token,
// if `reTokenization=true` reTokenization will follow.
tokenizer.updateDisplay(tokens: DisplayToken[], caretTokenIdx: number, reTokenization: bool);

// Gets the text equivalent of the tokenizer.
tokenizer.getInnerText() // 'Some string user entered'

// Whether the tokenizer has focus.
tokenizer.hasFocus() // true

// Gets the number of tokens.
tokenizer.getNumTokens() // 4

// Sets the caret at the start of the `idx` index token.
tokenizer.selectNodeByIdx(idx: number);

DisplayToken

This is a structure which represents a token. Its an object with these properties:

Prop name | type | description --- | --- | --- value | string | The text value of the token. className | string | The css class name to be applied to the token, the consumer can apply styles under this css class. isIncomplete | bool | Boolean flag to indicate whether the token is complete. isExtensible | bool | Flag to indicate whether the token is extensible, if true, cursor is not moved out of it on completion.