вторник, 10 сентября 2024 г.

Detect file encoding UTF-8 or Windows-1251

Install or copy: https://www.npmjs.com/package/detect-character-encoding

Code:

const fs = require('fs');

const path = require('path');

const languageEncoding = require('./Detect-File-Encoding-and-Language-main');


const folderPath = path.resolve('C:/path/to/folder/src');


function walkDirAndGetFileEncoding (folderPath) {

    fs.readdirSync(folderPath).forEach(function (filesOrFolder) {

        const fileOrFolderPath = path.join(folderPath, filesOrFolder);

        const stats = fs.statSync(fileOrFolderPath);

        if (stats.isDirectory()) {

            walkDirAndGetFileEncoding(fileOrFolderPath);

        } else if (stats.isFile()) {

            languageEncoding(fileOrFolderPath).then(function (fileInfo) {

                if (fileInfo.encoding !== 'UTF-8') {

                    console.log(fileInfo.encoding + ' ' + fileOrFolderPath);

                }

            });

        }

    });

}


walkDirAndGetFileEncoding(folderPath);

пятница, 5 июля 2024 г.

React Scroll to bottom

 export const configMenuInitialState: ConfigMenuStateInterface = {

    isConfirmMenuVisible: false

};


export function EventsHistoryConfigMenu (): JSX.Element {


    const {

        configMenu: {

            isConfirmMenuVisible

        }

    } = useReduxState('configMenu');

    

    const configMenuRef: React.MutableRefObject<HTMLDivElement> = useRef<HTMLDivElement>(null);


    return (

        <>

            <div ref={configMenuRef} className={styles['config-menu']}></div>

            {

                isConfirmMenuVisible && (

                    <div className={styles['confirm-menu']}></div>

                    <ScrollToBottom configMenuRef={configMenuRef} />

                )

            }

        </>

    );


}


export function openConfirmMenuAction () {

    return function (dispatch: Dispatch<any>): void {

        dispatch(setConfigConfirmMenuScrollToBottomActive(true));

        dispatch(setConfigConfirmMenuVisibility(true));

    };

}


interface ScrollToBottomProps {

    configMenuRef: React.MutableRefObject<HTMLDivElement>;

}


function ScrollToBottom (props: ScrollToBottomProps): null {


    const {

        configMenu: {

            isScrollToBottomActive

        }

    } = useReduxState('configMenu');


    const dispatch = useDispatch();


    useEffect(function (): () => void {

        if (isScrollToBottomActive) {

            const sectionElement: any = props.configMenuRef?.current?.parentNode?.parentNode?.parentNode?.parentNode?.parentNode;

            if (sectionElement) {

                sectionElement.scrollTop = sectionElement.scrollHeight;

            }

        }

        return function onUnmount (): void {

            dispatch(setScrollToBottomActive(false));

        };

    }, []);


    return null;


}

пятница, 19 апреля 2024 г.

Регулярное выражение - аналог \w с учетом русских символов

В JavaScript регулярное выражение \w соответствует только латинским буквам, цифрам и символу подчеркивания. Оно не включает в себя русские буквы или другие символы, не относящиеся к латинскому алфавиту.

Это связано с тем, что JavaScript использует стандартные регулярные выражения, основанные на стандарте Unicode Regular Expressions. В этом стандарте символ \w соответствует только латинским буквам, цифрам и символу подчеркивания.

Если вам нужно учитывать русские буквы в регулярных выражениях в JavaScript, вы можете использовать символьные классы Unicode. Например, вы можете использовать [\p{L}\p{N}_] для соответствия любой букве, цифре или символу подчеркивания, включая и русские буквы.

При этом буква "ё" на MacOS не равна букве ё в Windows.

MacOS сохраняет кириллическую "ё", как 2 символа.

Поэтому с учетом всех особенностей составляем регулярное выражение - аналог \w с учетом русских символов: 

/^[-_(),.\sa-zа-яЯ̆ёёЁ\d]+$/i