代码之家  ›  专栏  ›  技术社区  ›  tig

文件扩展名到文件类型/语言映射的数据库

  •  0
  • tig  · 技术社区  · 6 年前

    vscode使用了一个很好的模式来进行文件扩展名到语言的映射:

    https://code.visualstudio.com/docs/languages/identifiers

       "files.associations": {
            "*.myphp": "php"
        }
    
        "languages": [{
            "id": "java",
            "extensions": [ ".java", ".jav" ],
            "aliases": [ "Java", "java" ]
        }]
    

    像prismjs这样的工具内置了对数百种语言的支持。

    我搜索了vscode,找到了处理它处理的映射的代码( /src/vs/editor/common/services/languagesRegistry.ts )但它似乎从安装的扩展加载映射。

    瞧,我想生成(或查找!)一个JSON文档,使用上面的模式和prismjs支持的所有199种语言。

    0 回复  |  直到 6 年前
        1
  •  0
  •   tig    6 年前

    lang-map ,nodejs模块使得从文件扩展名到语言或从语言到支持的扩展名都变得很容易。

    https://github.com/jonschlinkert/lang-map

    我已经成功地使用它使用vscode模式生成了一个JSON文档。

    // Imports file-extension to langauge mapping from both
    // prismjs and lang-map and outputs a JSDON document that
    // follows the vscode schema for extension mapping.
    // PrismJS language definitions trump for my solution.
    const fs = require('fs');
    var map = require('lang-map');
    var components = require('prismjs/components.js');
    
    // vscode files.associations is not an array. Use a dictionary instead.
    var assocDict = {};
    var languages = [];
    
    for (var key in components.languages) {
        if (components.languages.hasOwnProperty(key) && key != 'meta') {
            var language = components.languages[key];
            var langTemp = {
              id : key
            };
    
            // vscode doesn't support title, but I want to use it
            if (typeof language.title != 'undefined')
                langTemp.title = language.title;
    
            if (typeof language.alias != 'undefined'){
                if (Array.isArray(language.alias)){
                    langTemp.aliases = language.alias;
                }
                else{
                    langTemp.aliases = ['.' + language.alias];
                }
            }
            var extensions = [];
            map.extensions(key).forEach(ext =>{
                // Add it to the extnsions for this langauge defn
                extensions.push('.' + ext);
    
                // also add it to the files.associations dictionary
                var pattern = '*.' + ext;
                var assoc = { 
                    pattern : key
                };
                assocDict[pattern] = key;
            });
            langTemp.extensions = extensions;
            languages.push(langTemp);
        }
    }
    
    // create JSON doc conforming to vscode spec. associations is not an array
    // languages is
    var output = { 
        'files.associations' : assocDict,
        'languages' : languages
    };
    
    var file = "../winforms/WinPrint.Core/Properties/languages.json";
    fs.writeFile(file, JSON.stringify(output, null, '  '), function (err) {
        if (err) {
            return console.log(err);
        }
        console.log("Wrote " + Object.keys(assocDict).length + " file-type associations and " + languages.length + " language defs to " + file);
    });
    
    
    

    https://github.com/blakeembrey/language-map

    推荐文章