Drafts Action Directory

(Re)number lines

Last updated: 2018-07-04 09:12:36 UTC

(Re)number (selected, or all) lines
(right-justified line number followed by a colon and two spaces)

Aims to either update existing line numbers of this pattern,
or add numbering to lines which lack it.

Install

Steps

  • script

    (() => {
        'use strict';
    
        // MAIN ------------------------------------------------
        // Line numbering (followed by colon and space) updated.
        const main = () =>
            draftOrLinesUpdated(
                xs => {
                    const
                        iLast = xs.length - 1,
                        intDigits = iLast.toString().length,
                        rgxNum = /^(\s*\d+:\s*|)(.*)$/;
                    return map(
                        (x, i) => justifyRight(
                            intDigits, ' ',
                            (1 + i).toString(),
                        ) + ':  ' + rgxNum.exec(x)[2],
                        xs
                    );
                }
            );
    
        // REUSABLE FUNCTION FOR DRAFTS:
        //
        // Update the editor with selected (or otherwise all) lines
        // transformed by a function on a list of (line) strings
        // which returns another list of strings.
    
        // draftOrLinesUpdated :: IO () -> ([String] -> [String]) -> IO ()
        const draftOrLinesUpdated = f => {
            const
                functionName = f.name, // Used for logging.
                // Selected lines or whole of draft.
                [intStart, intLength] = editor.getSelectedLineRange(),
                [intFrom, intChars] = (
                    editor.getSelectedText()
                    .length > 0 ? (
                        [intStart, intLength]
                    ) : [0, editor.getText().length]
                ),
                // Concatenated result of applying f to the list of lines
                strUpdated = unlines(f(lines(
                    editor.getTextInRange(intFrom, intChars)
                )));
            return (
                // Various channels, for testing and use.
                editor.setTextInRange(intFrom, intChars, strUpdated),
                console.log(functionName, strUpdated),
                strUpdated
            );
        };
    
        // GENERIC FUNCTIONS -----------------------------
    
        // justifyRight :: Int -> Char -> String -> String
        const justifyRight = (n, cFiller, strText) =>
            n > strText.length ? (
                (cFiller.repeat(n) + strText)
                .slice(-n)
            ) : strText;
    
        // lines :: String -> [String]
        const lines = s => s.split(/[\r\n]/);
    
        // map :: (a -> b) -> [a] -> [b]
        const map = (f, xs) => xs.map(f);
    
        // unlines :: [String] -> String
        const unlines = xs => xs.join('\n');
    
        // MAIN ------------------------------
        return main();
    })();
    

Comments

Actions available in the Action Directory are uploaded by community members. Use appropriate caution reviewing downloaded actions before use.