提交 824743d7 编写于 作者: J Joao Moreno

refactor getReadme()

上级 79187508
...@@ -242,15 +242,9 @@ export class ExtensionEditor extends BaseEditor { ...@@ -242,15 +242,9 @@ export class ExtensionEditor extends BaseEditor {
} }
private openReadme(extension: IExtension) { private openReadme(extension: IExtension) {
if (!extension.readmeUrl) {
const p = append(this.content, $('p'));
p.textContent = localize('noReadme', "No README available.");
return;
}
addClass(this.content, 'loading'); addClass(this.content, 'loading');
const promise = this.extensionsWorkbenchService.getReadmeContents(extension) const promise = extension.getReadme()
.then(marked.parse) .then(marked.parse)
.then<void>(body => { .then<void>(body => {
const webview = new WebView( const webview = new WebView(
...@@ -265,6 +259,10 @@ export class ExtensionEditor extends BaseEditor { ...@@ -265,6 +259,10 @@ export class ExtensionEditor extends BaseEditor {
const themeListener = this.themeService.onDidColorThemeChange(themeId => webview.style(themeId)); const themeListener = this.themeService.onDidColorThemeChange(themeId => webview.style(themeId));
this.contentDisposables.push(webview, linkListener, themeListener); this.contentDisposables.push(webview, linkListener, themeListener);
}) })
.then(null, () => {
const p = append(this.content, $('p'));
p.textContent = localize('noReadme', "No README available.");
})
.then(null, () => null) .then(null, () => null)
.then(() => removeClass(this.content, 'loading')); .then(() => removeClass(this.content, 'loading'));
......
...@@ -8,7 +8,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' ...@@ -8,7 +8,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'
import Event from 'vs/base/common/event'; import Event from 'vs/base/common/event';
import { TPromise } from 'vs/base/common/winjs.base'; import { TPromise } from 'vs/base/common/winjs.base';
import { IPager } from 'vs/base/common/paging'; import { IPager } from 'vs/base/common/paging';
import { IQueryOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IQueryOptions, IExtensionManifest } from 'vs/platform/extensionManagement/common/extensionManagement';
export const VIEWLET_ID = 'workbench.view.extensions'; export const VIEWLET_ID = 'workbench.view.extensions';
...@@ -32,7 +32,6 @@ export interface IExtension { ...@@ -32,7 +32,6 @@ export interface IExtension {
version: string; version: string;
latestVersion: string; latestVersion: string;
description: string; description: string;
readmeUrl: string;
iconUrl: string; iconUrl: string;
licenseUrl: string; licenseUrl: string;
installCount: number; installCount: number;
...@@ -40,6 +39,8 @@ export interface IExtension { ...@@ -40,6 +39,8 @@ export interface IExtension {
ratingCount: number; ratingCount: number;
outdated: boolean; outdated: boolean;
telemetryData: any; telemetryData: any;
getManifest(): TPromise<IExtensionManifest>;
getReadme(): TPromise<string>;
} }
export const SERVICE_ID = 'extensionsWorkbenchService'; export const SERVICE_ID = 'extensionsWorkbenchService';
...@@ -56,5 +57,4 @@ export interface IExtensionsWorkbenchService { ...@@ -56,5 +57,4 @@ export interface IExtensionsWorkbenchService {
canInstall(extension: IExtension): boolean; canInstall(extension: IExtension): boolean;
install(extension: IExtension): TPromise<void>; install(extension: IExtension): TPromise<void>;
uninstall(extension: IExtension): TPromise<void>; uninstall(extension: IExtension): TPromise<void>;
getReadmeContents(extension: IExtension): TPromise<string>;
} }
\ No newline at end of file
...@@ -14,7 +14,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; ...@@ -14,7 +14,7 @@ import { TPromise } from 'vs/base/common/winjs.base';
import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { IPager, mapPager, singlePagePager } from 'vs/base/common/paging'; import { IPager, mapPager, singlePagePager } from 'vs/base/common/paging';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { IExtensionManagementService, IExtensionGalleryService, IExtensionTipsService, ILocalExtension, IGalleryExtension, IQueryOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IExtensionManagementService, IExtensionGalleryService, IExtensionTipsService, ILocalExtension, IGalleryExtension, IQueryOptions, IExtensionManifest } from 'vs/platform/extensionManagement/common/extensionManagement';
import { getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData } from 'vs/platform/extensionManagement/common/extensionTelemetry'; import { getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData } from 'vs/platform/extensionManagement/common/extensionTelemetry';
import * as semver from 'semver'; import * as semver from 'semver';
import * as path from 'path'; import * as path from 'path';
...@@ -32,6 +32,7 @@ class Extension implements IExtension { ...@@ -32,6 +32,7 @@ class Extension implements IExtension {
public needsRestart = false; public needsRestart = false;
constructor( constructor(
private galleryService: IExtensionGalleryService,
private stateProvider: IExtensionStateProvider, private stateProvider: IExtensionStateProvider,
public local: ILocalExtension, public local: ILocalExtension,
public gallery: IGalleryExtension = null public gallery: IGalleryExtension = null
...@@ -126,6 +127,32 @@ class Extension implements IExtension { ...@@ -126,6 +127,32 @@ class Extension implements IExtension {
return getLocalExtensionTelemetryData(local); return getLocalExtensionTelemetryData(local);
} }
} }
getManifest(): TPromise<IExtensionManifest> {
if (this.local) {
return TPromise.as(this.local.manifest);
}
return this.galleryService.getAsset(this.gallery.assets.manifest)
.then(asText)
.then(raw => JSON.parse(raw) as IExtensionManifest);
}
getReadme(): TPromise<string> {
const readmeUrl = this.local && this.local.readmeUrl ? this.local.readmeUrl : this.gallery && this.gallery.assets.readme;
if (!readmeUrl) {
return TPromise.wrapError('not available');
}
const uri = URI.parse(readmeUrl);
if (uri.scheme === 'file') {
return readFile(uri.fsPath, 'utf8');
}
return this.galleryService.getAsset(readmeUrl).then(asText);
}
} }
function stripVersion(id: string): string { function stripVersion(id: string): string {
...@@ -201,7 +228,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { ...@@ -201,7 +228,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
const installedById = index(this.installed, e => e.local.id); const installedById = index(this.installed, e => e.local.id);
this.installed = result.map(local => { this.installed = result.map(local => {
const extension = installedById[local.id] || new Extension(this.stateProvider, local); const extension = installedById[local.id] || new Extension(this.galleryService, this.stateProvider, local);
extension.local = local; extension.local = local;
return extension; return extension;
}); });
...@@ -242,7 +269,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { ...@@ -242,7 +269,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
return installed; return installed;
} }
return new Extension(this.stateProvider, null, gallery); return new Extension(this.galleryService, this.stateProvider, null, gallery);
} }
private syncWithGallery(immediate = false): void { private syncWithGallery(immediate = false): void {
...@@ -310,7 +337,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { ...@@ -310,7 +337,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
let extension = this.installed.filter(e => (e.local.metadata && e.local.metadata.id) === gallery.id)[0]; let extension = this.installed.filter(e => (e.local.metadata && e.local.metadata.id) === gallery.id)[0];
if (!extension) { if (!extension) {
extension = new Extension(this.stateProvider, null, gallery); extension = new Extension(this.galleryService, this.stateProvider, null, gallery);
} }
extension.gallery = gallery; extension.gallery = gallery;
...@@ -404,21 +431,6 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { ...@@ -404,21 +431,6 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
this.telemetryService.publicLog(eventName, assign(data, { success, duration })); this.telemetryService.publicLog(eventName, assign(data, { success, duration }));
} }
getReadmeContents(extension: IExtension): TPromise<string> {
if (!extension.readmeUrl) {
return TPromise.as('');
}
const uri = URI.parse(extension.readmeUrl);
if (uri.scheme === 'file') {
return readFile(uri.fsPath, 'utf8');
}
return this.galleryService.getAsset(extension.readmeUrl)
.then(asText);
}
dispose(): void { dispose(): void {
this.disposables = dispose(this.disposables); this.disposables = dispose(this.disposables);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册