提交 eb2daf67 编写于 作者: J Johannes Rieken

don't use prefix but filenamePatterns

上级 a5a6fe21
......@@ -7,6 +7,7 @@
import paths = require('vs/base/common/paths');
import types = require('vs/base/common/types');
import strings = require('vs/base/common/strings');
import {match} from 'vs/base/common/glob';
export let MIME_TEXT = 'text/plain';
export let MIME_BINARY = 'application/octet-stream';
......@@ -71,12 +72,12 @@ export function generateKnownFilenames(onlyExtensions: boolean = true): any {
/**
* Allow to register extra text mimes dynamically based on filename
*/
export function registerTextMimeByFilename(nameOrExtensionOrPrefix: string, mime: string): void {
if (nameOrExtensionOrPrefix && mime) {
if (registeredTextMimesByFilename[nameOrExtensionOrPrefix] && registeredTextMimesByFilename[nameOrExtensionOrPrefix] !== mime) {
console.warn('Overwriting filename <<' + nameOrExtensionOrPrefix + '>> to now point to mime <<' + mime + '>>');
export function registerTextMimeByFilename(nameOrPatternOrPrefix: string, mime: string): void {
if (nameOrPatternOrPrefix && mime) {
if (registeredTextMimesByFilename[nameOrPatternOrPrefix] && registeredTextMimesByFilename[nameOrPatternOrPrefix] !== mime) {
console.warn('Overwriting filename <<' + nameOrPatternOrPrefix + '>> to now point to mime <<' + mime + '>>');
}
registeredTextMimesByFilename[nameOrExtensionOrPrefix] = mime;
registeredTextMimesByFilename[nameOrPatternOrPrefix] = mime;
}
}
......@@ -142,29 +143,29 @@ export function guessMimeTypes(path: string, firstLine?: string): string[] {
let exactNameMatch: string;
let extensionMatch: string;
let prefixMatch: string;
let patternNameMatch: string;
// Check for dynamically registered match based on filename and extension
for (let nameOrExtensionOrPrefix in registeredTextMimesByFilename) {
let nameOrExtensionOrPrefixLower: string = nameOrExtensionOrPrefix.toLowerCase();
for (let nameOrPatternOrPrefix in registeredTextMimesByFilename) {
let nameOrPatternOrExtensionLower: string = nameOrPatternOrPrefix.toLowerCase();
// First exact name match
if (!exactNameMatch && filename === nameOrExtensionOrPrefixLower) {
exactNameMatch = nameOrExtensionOrPrefix;
if (!exactNameMatch && filename === nameOrPatternOrExtensionLower) {
exactNameMatch = nameOrPatternOrPrefix;
break; // take it!
}
// Longest extension match
if (nameOrExtensionOrPrefix[0] === '.' && strings.endsWith(filename, nameOrExtensionOrPrefixLower)) {
if (!extensionMatch || nameOrExtensionOrPrefixLower.length > extensionMatch.length) {
extensionMatch = nameOrExtensionOrPrefix;
// Longest pattern match
if (match(nameOrPatternOrExtensionLower, filename)) {
if (!patternNameMatch || nameOrPatternOrExtensionLower.length > patternNameMatch.length) {
patternNameMatch = nameOrPatternOrPrefix;
}
}
// Longest prefix match
if (nameOrExtensionOrPrefixLower.slice(-1) === '*' && strings.startsWith(filename, nameOrExtensionOrPrefixLower.slice(0, -1))) {
if (!prefixMatch || nameOrExtensionOrPrefixLower.length > prefixMatch.length) {
prefixMatch = nameOrExtensionOrPrefix;
// Longest extension match
if (nameOrPatternOrPrefix[0] === '.' && strings.endsWith(filename, nameOrPatternOrExtensionLower)) {
if (!extensionMatch || nameOrPatternOrExtensionLower.length > extensionMatch.length) {
extensionMatch = nameOrPatternOrPrefix;
}
}
}
......@@ -174,14 +175,14 @@ export function guessMimeTypes(path: string, firstLine?: string): string[] {
return [registeredTextMimesByFilename[exactNameMatch], MIME_TEXT];
}
// 3.) Match on extension comes next
if (extensionMatch) {
return [registeredTextMimesByFilename[extensionMatch], MIME_TEXT];
// 3.) Match on pattern
if (patternNameMatch) {
return [registeredTextMimesByFilename[patternNameMatch], MIME_TEXT];
}
// 4.) Match on prefix
if (prefixMatch) {
return [registeredTextMimesByFilename[prefixMatch], MIME_TEXT];
// 4.) Match on extension comes next
if (extensionMatch) {
return [registeredTextMimesByFilename[extensionMatch], MIME_TEXT];
}
return [MIME_UNKNOWN];
......
......@@ -62,9 +62,9 @@ let languagesExtPoint = PluginsRegistry.registerExtensionPoint<ILanguageExtensio
type: 'string'
}
},
prefixes: {
description: nls.localize('vscode.extension.contributes.languages.prefixes', 'File name prefixes associated to the language.'),
default: ['foo*'],
filenamePatterns: {
description: nls.localize('vscode.extension.contributes.languages.filenamePatterns', 'File name glob patterns associated to the language.'),
default: ['bar*foo.txt'],
type: 'array',
item: {
type: 'string'
......@@ -93,7 +93,7 @@ export interface ILanguageExtensionPoint {
id: string;
extensions?: string[];
filenames?: string[];
prefixes?: string[];
filenamePatterns?: string[];
firstLine?: string;
aliases?: string[];
mimetypes?: string[];
......@@ -341,9 +341,9 @@ class LanguageExtensionPointHandler implements IThreadSynchronizableObject<ILang
}
}
if (Array.isArray(lang.prefixes)) {
for (let prefix of lang.prefixes) {
Mime.registerTextMimeByFilename(prefix, primaryMime);
if (Array.isArray(lang.filenamePatterns)) {
for (let filenamePattern of lang.filenamePatterns) {
Mime.registerTextMimeByFilename(filenamePattern, primaryMime);
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册