First pass at spriting in IE.

Reviewed by me.
This commit is contained in:
Francisco Ryan Tolmasky I
2009-11-04 21:38:24 -08:00
parent 848828222b
commit cb18896137
15 changed files with 429 additions and 166 deletions
-1
View File
@@ -19,7 +19,6 @@ appKitTask = framework ("AppKit", function(appKitTask)
appKitTask.setLicense(BundleTask.License.LGPL_v2_1);
appKitTask.setSources(AppKitFiles);
appKitTask.setResources(new FileList("Resources/**/*"));
appKitTask.setPlatforms([BundleTask.Platform.Browser, BundleTask.Platform.CommonJS]);
appKitTask.setFlattensSources(true);
appKitTask.setInfoPlistPath("Info.plist");
-1
View File
@@ -8,7 +8,6 @@ blend ("Aristo.blend", function(aristoTask)
aristoTask.setBuildPath(FILE.join($BUILD_DIR, $CONFIGURATION));
aristoTask.setThemeDescriptors(new FileList("ThemeDescriptors.j"));
aristoTask.setPlatforms([BundleTask.Platform.Browser, BundleTask.Platform.CommonJS]);
aristoTask.setIdentifier("com.280n.blend.Aristo");
aristoTask.setResources(new FileList("Resources/*"));
});
+48 -44
View File
@@ -14,7 +14,7 @@ var FILE = require("file"),
function BlendTask(aName)
{
BundleTask.apply(this, arguments);
this._themeDescriptors = [];
this._keyedThemes = [];
}
@@ -31,7 +31,7 @@ BlendTask.prototype.infoPlist = function()
{
var infoPlist = BundleTask.prototype.infoPlist.apply(this, arguments);
infoPlist.setValue("CPKeyedThemes", this._keyedThemes);
infoPlist.setValue("CPKeyedThemes", require("util").unique(this._keyedThemes));
return infoPlist;
}
@@ -54,52 +54,56 @@ BlendTask.prototype.defineTasks = function()
}
BlendTask.prototype.defineSourceTasks = function()
{
{
}
BlendTask.prototype.defineThemeDescriptorTasks = function()
{
var themeDescriptors = this.themeDescriptors(),
resourcesPath = this.resourcesPath(),
intermediatesPath = FILE.join(this.buildIntermediatesProductPath(), "Browser" + ".platform", "Resources"),
staticPath = this.buildProductStaticPathForPlatform("Browser"),
keyedThemes = this._keyedThemes,
themesTaskName = this.name() + ":themes";
this.enhance(themesTaskName);
objj_import(themeDescriptors.toArray(), YES, function()
this.flattenedEnvironments().forEach(function(anEnvironment)
{
[BKThemeDescriptor allThemeDescriptorClasses].forEach(function(aClass)
var folder = anEnvironment.name() + ".environment",
themeDescriptors = this.themeDescriptors(),
resourcesPath = this.resourcesPath(),
intermediatesPath = FILE.join(this.buildIntermediatesProductPath(), folder, "Resources"),
staticPath = this.buildProductStaticPathForEnvironment(anEnvironment),
keyedThemes = this._keyedThemes,
themesTaskName = this.name() + ":themes";
this.enhance(themesTaskName);
objj_import(themeDescriptors.toArray(), YES, function()
{
var keyedThemePath = FILE.join(intermediatesPath, [aClass themeName] + ".keyedtheme");
[BKThemeDescriptor allThemeDescriptorClasses].forEach(function(aClass)
{
var keyedThemePath = FILE.join(intermediatesPath, [aClass themeName] + ".keyedtheme");
filedir (keyedThemePath, themesTaskName);
filedir (staticPath, [keyedThemePath]);
filedir (keyedThemePath, themesTaskName);
filedir (staticPath, [keyedThemePath]);
keyedThemes.push([aClass themeName] + ".keyedtheme");
keyedThemes.push([aClass themeName] + ".keyedtheme");
});
});
});
require("browser/timeout").serviceTimeouts();
require("browser/timeout").serviceTimeouts();
task (themesTaskName, function()
{
[BKThemeDescriptor allThemeDescriptorClasses].forEach(function(aClass)
task (themesTaskName, function()
{
var themeTemplate = [[BKThemeTemplate alloc] init];
[BKThemeDescriptor allThemeDescriptorClasses].forEach(function(aClass)
{
var themeTemplate = [[BKThemeTemplate alloc] init];
[themeTemplate setValue:[aClass themeName] forKey:@"name"];
[themeTemplate setValue:[aClass themeName] forKey:@"name"];
var objectTemplates = [aClass themedObjectTemplates],
data = cibDataFromTopLevelObjects(objectTemplates.concat([themeTemplate])),
fileContents = themeFromCibData(data);
var objectTemplates = [aClass themedObjectTemplates],
data = cibDataFromTopLevelObjects(objectTemplates.concat([themeTemplate])),
fileContents = themeFromCibData(data);
// No filedir in this case, so we have to make it ourselves.
FILE.mkdirs(intermediatesPath);
FILE.write(FILE.join(intermediatesPath, [aClass themeName] + ".keyedtheme"), MARKER_TEXT + ";" + fileContents.length + ";" + fileContents, { charset:"UTF-8" });
// No filedir in this case, so we have to make it ourselves.
FILE.mkdirs(intermediatesPath);
FILE.write(FILE.join(intermediatesPath, [aClass themeName] + ".keyedtheme"), MARKER_TEXT + ";" + fileContents.length + ";" + fileContents, { charset:"UTF-8" });
});
});
});
}, this);
}
function cibDataFromTopLevelObjects(objects)
@@ -113,7 +117,7 @@ function cibDataFromTopLevelObjects(objects)
var index = 0,
count = objects.length;
for (; index < count; ++index)
{
objectData._objectsValues[index] = objectData._fileOwner;
@@ -131,7 +135,7 @@ function themeFromCibData(data)
{
var cib = [[CPCib alloc] initWithData:data],
topLevelObjects = [];
[cib _setAwakenCustomResources:NO];
[cib instantiateCibWithExternalNameTable:[CPDictionary dictionaryWithObject:topLevelObjects forKey:CPCibTopLevelObjects]];
@@ -142,7 +146,7 @@ function themeFromCibData(data)
while (count--)
{
var object = topLevelObjects[count];
templates = templates.concat([object blendThemeObjectTemplates]);
if ([object isKindOfClass:[BKThemeTemplate class]])
@@ -175,22 +179,22 @@ function themeFromCibData(data)
- (CPArray)blendThemeObjectTemplates
{
var theClass = [self class];
if ([theClass isKindOfClass:[BKThemedObjectTemplate class]])
return [self];
if ([theClass isKindOfClass:[CPView class]])
{
var templates = [],
subviews = [self subviews],
count = [subviews count];
while (count--)
templates = templates.concat([subviews[count] blendThemeObjectTemplates]);
return templates;
}
return [];
}
@@ -201,19 +205,19 @@ function themeFromCibData(data)
- (void)blendAddThemedObjectAttributesToTheme:(CPTheme)aTheme
{
var themedObject = [self valueForKey:@"themedObject"];
if (!themedObject)
{
var subviews = [self subviews];
if ([subviews count] > 0)
themedObject = subviews[0];
}
if (themedObject)
{
print(" Recording themed properties for " + [themedObject className] + ".");
[aTheme takeThemeFromObject:themedObject];
}
}
+13 -10
View File
@@ -98,9 +98,9 @@
return className ? CPClassFromString(className) : Nil;
}
+ (CPString)firstCompatibleEngineFromArray:(CPArray)engines
+ (CPString)mostEligibleEnvironmentFromArray:(CPArray)environments
{
return objj_firstCompatibleEngineFromArray(engines);
return objj_mostEligibleEnvironmentFromArray(environments);
}
- (CPString)pathForResource:(CPString)aFilename
@@ -132,11 +132,14 @@
self._infoConnection = [CPURLConnection connectionWithRequest:[CPURLRequest requestWithURL:[self bundlePath] + "/Info.plist"] delegate:self];
}
- (CPString)firstEligiblePlatform
- (CPArray)supportedEnvironments
{
var platforms = [self objectForInfoDictionaryKey:"CPBundlePlatforms"];
return [self objectForInfoDictionaryKey:"CPBundleEnvironments"] || ["ObjJ"];
}
return [platforms firstObjectCommonWithArray:OBJJ_PLATFORMS] || nil;
- (CPString)mostEligibleEnvironment
{
return [[self class] mostEligibleEnvironmentFromArray:[self supportedEnvironments]];
}
- (void)connection:(CPURLConnection)aConnection didReceiveData:(CPString)data
@@ -145,12 +148,12 @@
{
info = CPPropertyListCreateFromData([CPData dataWithString:data]);
var platform = [self firstEligiblePlatform];
var environment = [self mostEligibleEnvironment];
if (!platform)
throw "Engine not supported for " + [self bundlePath] + ". Supported engines: " + [self objectForInfoDictionaryKey:"CPBundlePlatforms"] + ".";
if (!environment)
throw "Environment not supported for " + [self bundlePath] + ". Supported environments: " + [self objectForInfoDictionaryKey:"CPBundleEnvironments"] + ".";
[CPURLConnection connectionWithRequest:[CPURLRequest requestWithURL:[self bundlePath] + '/' + platform + ".platform/" + [self objectForInfoDictionaryKey:"CPBundleExecutable"]] delegate:self];
[CPURLConnection connectionWithRequest:[CPURLRequest requestWithURL:[self bundlePath] + '/' + environment + ".environment/" + [self objectForInfoDictionaryKey:"CPBundleExecutable"]] delegate:self];
}
else
{
@@ -161,7 +164,7 @@
if ([_delegate respondsToSelector:@selector(bundleDidFinishLoading:)])
context.didCompleteCallback = function() { [_delegate bundleDidFinishLoading:self]; };
var files = [[self objectForInfoDictionaryKey:@"CPBundleReplacedFiles"] objectForKey:[self firstEligiblePlatform]],
var files = [[self objectForInfoDictionaryKey:@"CPBundleReplacedFiles"] objectForKey:[self mostEligibleEnvironment]],
count = files ? files.length : 0, // Perhaps no files? Be liberal in what you accept...
bundlePath = [self bundlePath];
+1
View File
@@ -38,6 +38,7 @@ foundationTask = framework ("Foundation", function(foundationTask)
foundationTask.setResources(new FileList("Resources/**/*"));
foundationTask.setFlattensSources(true);
foundationTask.setInfoPlistPath("Info.plist");
foundationTask.setEnvironments(require("objective-j/jake/environment").ObjJ);
if ($CONFIGURATION === "Release")
foundationTask.setCompilerFlags("-O");
+1 -1
View File
@@ -13,7 +13,7 @@ if (system.engine === "rhino")
window.OBJJ_HOME = exports.OBJJ_HOME = FILE.resolve(module.path, "..");
var frameworksPath = FILE.resolve(window.OBJJ_HOME, "Frameworks/"),
objectivejPath = FILE.resolve(frameworksPath, "Objective-J/", "CommonJS.platform/", "Objective-J.js");
objectivejPath = FILE.resolve(frameworksPath, "Objective-J/", "CommonJS.environment/", "Objective-J.js");
var OBJJ_INCLUDE_PATHS = window.OBJJ_INCLUDE_PATHS = exports.OBJJ_INCLUDE_PATHS = [];
@@ -42,7 +42,7 @@ ApplicationTask.prototype.indexFilePath = function()
ApplicationTask.prototype.defineFrameworksTask = function()
{
// FIXME: platform requires...
if (this.platforms().indexOf(BundleTask.Platform.Browser) === -1)
if (this.flattenedEnvironments().indexOf(require("objective-j/jake/environment").Browsers) === -1)
return;
var frameworks = FILE.join(this.buildProductPath(), "Frameworks"),
@@ -5,21 +5,41 @@ var FILE = require("file"),
Jake = require("jake"),
CLEAN = require("jake/clean").CLEAN,
CLOBBER = require("jake/clean").CLOBBER,
base64 = require("base64");
base64 = require("base64"),
environment = require("objective-j/jake/environment");
var Task = Jake.Task,
filedir = Jake.filedir;
function isImage(/*String*/ aFilename)
{
return FILE.isFile(aFilename) &&
UTIL.has([".png", ".jpg", ".jpeg", ".gif", ".tif", ".tiff"], FILE.extension(aFilename).toLowerCase());
}
function mimeType(/*String*/ aFilename)
{
return {
".png" : "image/png",
".jpg" : "image/jpeg",
".jpeg" : "image/jpeg",
".gif" : "image/gif",
".tif" : "image/tiff",
".tiff" : "image/tiff"
}[FILE.extension(aFilename).toLowerCase()];
}
function BundleTask(aName, anApplication)
{
Task.apply(this, arguments);
this.setEnvironments([environment.Browsers, environment.CommonJS]);
this._author = null;
this._email = null;
this._summary = null;
this._license = null;
this._platforms = [BundleTask.Platform.ObjJ];
this._sources = null;
this._resources = null;
this._spritesResources = true;
@@ -57,17 +77,32 @@ BundleTask.defineTask = function(/*String*/ aName, /*Function*/ aFunction)
return bundleTask;
}
BundleTask.Platform = {
"ObjJ" : "ObjJ",
"CommonJS" : "CommonJS",
"Browser" : "Browser"
};
BundleTask.prototype.setEnvironments = function(environments)
{
if (arguments.length < 1)
this._environments = [];
BundleTask.PLATFORM_DEFAULT_FLAGS = {
"ObjJ" : [],
"CommonJS" : ['-DPLATFORM_RHINO -DPLATFORM_COMMONJS'],
"Browser" : ['-DPLATFORM_BROWSER', '-DPLATFORM_DOM']
};
else if (arguments.length > 1)
this._environments = Array.prototype.slice.apply(environments);
else if (typeof environments.slice === "function")
this._environments = environments.slice();
else
this._environments = [environments];
this._flattenedEnvironments = environment.Environment.flattenedEnvironments(this._environments);
}
BundleTask.prototype.environments = function()
{
return this._environments;
}
BundleTask.prototype.flattenedEnvironments = function()
{
return this._flattenedEnvironments;
}
BundleTask.prototype.setAuthor = function(anAuthor)
{
@@ -119,16 +154,6 @@ BundleTask.prototype.version = function()
return this._version;
}
BundleTask.prototype.setPlatforms = function(platforms)
{
this._platforms = platforms;
}
BundleTask.prototype.platforms = function()
{
return this._platforms;
}
BundleTask.prototype.setSources = function(sources)
{
this._sources = sources;
@@ -271,9 +296,14 @@ BundleTask.prototype.buildIntermediatesProductPath = function()
return this.buildIntermediatesPath() || FILE.join(this.buildPath(), this.productName() + ".build");
}
BundleTask.prototype.buildProductStaticPathForPlatform = function(aPlatform)
BundleTask.prototype.buildProductStaticPathForEnvironment = function(anEnvironment)
{
return FILE.join(this.buildProductPath(), aPlatform + ".platform", this.productName() + ".sj");
return FILE.join(this.buildProductPath(), anEnvironment.name() + ".environment", this.productName() + ".sj");
}
BundleTask.prototype.buildProductMHTMLPathForEnvironment = function(anEnvironment)
{
return FILE.join(this.buildProductPath(), anEnvironment.name() + ".environment", this.productName() + ".mhtml");
}
BundleTask.prototype.defineTasks = function()
@@ -283,6 +313,7 @@ BundleTask.prototype.defineTasks = function()
this.defineInfoPlistTask();
this.defineLicenseTask();
this.defineStaticTask();
this.defineMHTMLTask();
CLEAN.include(this.buildIntermediatesProductPath());
CLOBBER.include(this.buildProductPath());
@@ -309,7 +340,10 @@ BundleTask.prototype.infoPlist = function()
infoPlist.setValue("CPBundleIdentifier", this.identifier());
infoPlist.setValue("CPBundleVersion", this.version());
infoPlist.setValue("CPBundlePackageType", this.packageType());
infoPlist.setValue("CPBundlePlatforms", this.platforms());
infoPlist.setValue("CPBundleEnvironments", this.flattenedEnvironments().map(function(anEnvironment)
{
return anEnvironment.name();
}));
infoPlist.setValue("CPBundleExecutable", this.productName() + ".sj");
var principalClass = this.principalClass();
@@ -376,36 +410,34 @@ BundleTask.prototype.resourcesPath = function()
return FILE.join(this.buildProductPath(), "Resources", "");
}
var IMAGE_EXTENSIONS = [ ".png", ".jpg", ".jpeg", ".gif", ".tif", ".tiff"];
var MIME_TYPES = {
".png" : "image/png",
".jpg" : "image/jpeg",
".jpeg" : "image/jpeg",
".gif" : "image/gif",
".tif" : "image/tiff",
".tiff" : "image/tiff"
};
BundleTask.prototype.defineResourceTask = function(aResourcePath, aDestinationPath)
{
var extension = FILE.extension(aResourcePath).toLowerCase(),
extensionless = aResourcePath.substr(0, aResourcePath.length - extension.length);
// Don't sprite images larger than 32KB, IE 8 doesn't like it.
if (this.spritesResources() && IMAGE_EXTENSIONS.indexOf(extension) !== -1 && FILE.size(aResourcePath) < 32768)
if (this.spritesResources() && isImage(aResourcePath) && FILE.size(aResourcePath) < 32768)
{
var spritedDestinationPath = FILE.join(this.buildIntermediatesProductPath(), "Browser" + ".platform", "Resources", FILE.relative(this.resourcesPath(), aDestinationPath));
filedir (spritedDestinationPath, function()
this.flattenedEnvironments().forEach(function(/*Environment*/ anEnvironment)
{
var dataURI = "data:" + MIME_TYPES[extension] + ";base64," + base64.encode(FILE.read(aResourcePath, { mode : 'b'}));
FILE.write(spritedDestinationPath, dataURI.length + ";" + dataURI, { charset:"UTF-8" });
});
if (!anEnvironment.spritesImages())
return;
filedir (this.buildProductStaticPathForPlatform("Browser"), [spritedDestinationPath]);
var folder = anEnvironment.name() + ".environment",
spritedDestinationPath = FILE.join(this.buildIntermediatesProductPath(), folder, "Resources", FILE.relative(this.resourcesPath(), aDestinationPath));
filedir (spritedDestinationPath, function()
{
FILE.write(spritedDestinationPath, base64.encode(FILE.read(aResourcePath, { mode : 'b'})), { charset:"UTF-8" });
});
if (anEnvironment.spritesImagesToMHTMLFile())
filedir (this.buildProductMHTMLPathForEnvironment(anEnvironment), [spritedDestinationPath]);
// Add this as a dependency unconditionally because we need to set up the URL map either way.
filedir (this.buildProductStaticPathForEnvironment(anEnvironment), [spritedDestinationPath]);
}, this);
}
var extension = FILE.extension(aResourcePath),
extensionless = aResourcePath.substr(0, aResourcePath.length - extension.length);
// NOT:
// (extname === ".cib" && (FILE.exists(extensionless + '.xib') || FILE.exists(extensionless + '.nib')) ||
// (extname === ".xib" || extname === ".nib") && !this.shouldIncludeNibsAndXibs())
@@ -457,18 +489,18 @@ function directoryInCommon(filenames)
if (!aCommonDirectory)
aCommonDirectory = directory;
else
{
var index = 0,
count = Math.min(directory.length, aFilename.length);
for (; index < count && aCommonDirectory.charAt(index) === directory.charAt(index); ++index) ;
aCommonDirectory = directory.substr(0, index);
}
});
print("DIRECTORY IN COMMON IS " + aCommonDirectory);
return aCommonDirectory;
}
@@ -508,12 +540,14 @@ BundleTask.prototype.defineResourceTasks = function()
BundleTask.prototype.defineStaticTask = function()
{
this.platforms().forEach(function(/*String*/ aPlatform)
this.flattenedEnvironments().forEach(function(/*Environment*/ anEnvironment)
{
var sourcesPath = FILE.join(this.buildIntermediatesProductPath(), aPlatform + ".platform", "Sources", ""),
resourcesPath = FILE.join(this.buildIntermediatesProductPath(), aPlatform + ".platform", "Resources", ""),
staticPath = this.buildProductStaticPathForPlatform(aPlatform),
flattensSources = this.flattensSources();
var folder = anEnvironment.name() + ".environment",
sourcesPath = FILE.join(this.buildIntermediatesProductPath(), folder, "Sources", ""),
resourcesPath = FILE.join(this.buildIntermediatesProductPath(), folder, "Resources", ""),
staticPath = this.buildProductStaticPathForEnvironment(anEnvironment),
flattensSources = this.flattensSources(),
productName = this.productName();
filedir (staticPath, function(aTask)
{
@@ -536,23 +570,36 @@ BundleTask.prototype.defineStaticTask = function()
var relativePath = flattensSources ? FILE.basename(aFilename) : FILE.relative(sourcesPath, aFilename);
fileStream.write("p;" + relativePath.length + ";" + relativePath);
// FIXME: We need to do this for now due to file.read adding newlines. Revert when fixed.
//fileStream.write(FILE.read(aFilename, { charset:"UTF-8" }));
fileStream.write(FILE.read(aFilename, { mode:"b" }).decodeToString("UTF-8"));
}
else if (aFilename.indexOf(resourcesPath) === 0)
{
var resourcePath = "Resources/" + FILE.relative(resourcesPath, aFilename);
var contents = "",
resourcePath = "Resources/" + FILE.relative(resourcesPath, aFilename);
if (IMAGE_EXTENSIONS.indexOf(FILE.extension(aFilename)) !== -1)
if (isImage(aFilename))
{
fileStream.write("u;");
if (anEnvironment.spritesImagesToStaticFile())
contents += "data:" + mimeType(aFilename) + ";base64," + FILE.read(aFilename, { charset:"UTF-8" });
else if (anEnvironment.spritesImagesToMHTMLFile())
contents = "mhtml:" + FILE.join(folder, productName + ".mhtml!") + resourcePath;
contents = contents.length + ";" + contents;
}
else
{
fileStream.write("p;");
contents = FILE.read(aFilename, { charset:"UTF-8" });
}
fileStream.write(resourcePath.length + ";" + resourcePath);
fileStream.write(resourcePath.length + ";" + resourcePath + contents);
}
// FIXME: We need to do this for now due to file.read adding newlines. Revert when fixed.
//fileStream.write(FILE.read(aFilename, { charset:"UTF-8" }));
fileStream.write(FILE.read(aFilename, { mode:"b" }).decodeToString("UTF-8"));
}, this);
fileStream.close();
@@ -562,6 +609,59 @@ BundleTask.prototype.defineStaticTask = function()
}, this);
}
BundleTask.prototype.defineMHTMLTask = function()
{
var environments = this.flattenedEnvironments();
if (!environments.some(function(anEnvironment)
{
return anEnvironment.spritesImagesToMHTMLFile();
}))
return;
environments.filter(function(/*Environment*/ anEnvironment)
{
return anEnvironment.spritesImagesToMHTMLFile();
}).forEach(function(/*Environment*/ anEnvironment)
{
var folder = anEnvironment.name() + ".environment",
resourcesPath = FILE.join(this.buildIntermediatesProductPath(), folder, "Resources", ""),
MHTMLPath = this.buildProductMHTMLPathForEnvironment(anEnvironment);
filedir (MHTMLPath, function(aTask)
{
print("Creating MHTML file... " + MHTMLPath);
var fileStream = FILE.open(MHTMLPath, "w+", { charset:"UTF-8" });
fileStream.write("/*\r\nContent-Type: multipart/related; boundary=\"_ANY_STRING_WILL_DO_AS_A_SEPARATOR\"\r\n\r\n");
aTask.prerequisites().forEach(function(aFilename)
{
// Our prerequisites will contain directories due to filedir.
if (!isImage(aFilename))
return;
var resourcePath = "Resources/" + FILE.relative(resourcesPath, aFilename);
fileStream.write("--_ANY_STRING_WILL_DO_AS_A_SEPARATOR\r\n");
fileStream.write("Content-Location:" + resourcePath + "\r\nContent-Transfer-Encoding:base64\r\n\r\n");
var contents = FILE.read(aFilename, { charset:"UTF-8" });
fileStream.write(contents);
fileStream.write("\r\n");
}, this);
fileStream.write("*/");
fileStream.close();
});
this.enhance([MHTMLPath]);
}, this);
}
BundleTask.prototype.defineSourceTasks = function()
{
var sources = this.sources();
@@ -578,40 +678,43 @@ BundleTask.prototype.defineSourceTasks = function()
else if (compilerFlags.join)
compilerFlags = compilerFlags.join(" ");
this.platforms().forEach(function(/*String*/ aPlatform)
var environments = this.flattenedEnvironments();
environments.forEach(function(/*Environment*/ anEnvironment)
{
var platformSources = sources,
sourcesPath = FILE.join(this.buildIntermediatesProductPath(), aPlatform + ".platform", "Sources", ""),
staticPath = this.buildProductStaticPathForPlatform(aPlatform),
flags = BundleTask.PLATFORM_DEFAULT_FLAGS[aPlatform].join(" ");
var environmentSources = sources,
folder = anEnvironment.name() + ".environment",
sourcesPath = FILE.join(this.buildIntermediatesProductPath(), folder, "Sources", ""),
staticPath = this.buildProductStaticPathForEnvironment(anEnvironment);
if (!Array.isArray(platformSources) && platformSources.constructor !== Jake.FileList)
platformSources = platformSources[aPlatform];
if (!Array.isArray(environmentSources) && environmentSources.constructor !== Jake.FileList)
environmentSources = environmentSources[anEnvironment];
var replacedFiles = [];
var replacedFiles = [],
environmentCompilerFlags = anEnvironment.compilerFlags().join(" ") + " " + compilerFlags;
platformSources.forEach(function(/*String*/ aFilename)
environmentSources.forEach(function(/*String*/ aFilename)
{
// if this file doesn't exist or isn't a .j file, don't preprocess it.
if (!FILE.exists(aFilename) || FILE.extension(aFilename) !== '.j')
return;
var compiledPlatformSource = FILE.join(sourcesPath, FILE.basename(aFilename));
var compiledEnvironmentSource = FILE.join(sourcesPath, FILE.basename(aFilename));
filedir (compiledPlatformSource, [aFilename], function()
filedir (compiledEnvironmentSource, [aFilename], function()
{
print("Compiling " + aFilename + "...");
FILE.write(compiledPlatformSource, require("objective-j/compiler").compile(aFilename, flags + " " + compilerFlags), { charset:"UTF-8" });
print("Compiling [" + anEnvironment + "] " + aFilename + "...");
FILE.write(compiledEnvironmentSource, require("objective-j/compiler").compile(aFilename, environmentCompilerFlags), { charset:"UTF-8" });
});
filedir (staticPath, [compiledPlatformSource]);
filedir (staticPath, [compiledEnvironmentSource]);
// FIXME: how do we non flatten?
// dir in common
replacedFiles.push(flattensSources ? FILE.basename(aFilename) : FILE.relative(sourcesPath, aFilename));
}, this);
this._replacedFiles[aPlatform] = replacedFiles;
this._replacedFiles[anEnvironment] = replacedFiles;
}, this);
}
@@ -0,0 +1,143 @@
var environments = { };
function Environment(/*String*/ aName)
{
this._name = aName;
this._compilerFlags = [];
this._spritesImagesToMHTMLFile = false;
this._spritesImagesToStaticFile = false;
environments[aName] = this;
}
Environment.environmentWithName = function(/*String*/ aName)
{
return environments[aName];
}
Environment.flattenedEnvironments = function(/*Array*/ environments)
{
var flattenedEnvironments = [];
environments.forEach(function(/*Environment*/ anEnvironment)
{
Array.prototype.push.apply(flattenedEnvironments, anEnvironment.flattenedEnvironments());
});
return flattenedEnvironments;
}
Environment.prototype.name = function()
{
return this._name;
}
Environment.prototype.toString = function()
{
return this._name;
}
Environment.prototype.flattenedEnvironments = function()
{
return [this];
}
Environment.prototype.compilerFlags = function()
{
return this._compilerFlags;
}
Environment.prototype.setCompilerFlags = function(flags)
{
this._compilerFlags = flags;
}
Environment.prototype.setSpritesImagesToMHTMLFile = function(/*Boolean*/ shouldSpriteImagesToMHTMLFile)
{
this._spritesImagesToMHTMLFile = !!shouldSpriteImagesToMHTMLFile;
}
Environment.prototype.spritesImagesToMHTMLFile = function()
{
return this._spritesImagesToMHTMLFile;
}
Environment.prototype.setSpritesImagesToStaticFile = function(/*Boolean*/ shouldSpriteImagesToStaticFile)
{
this._spritesImagesToStaticFile = !!shouldSpriteImagesToStaticFile;
}
Environment.prototype.spritesImagesToStaticFile = function()
{
return this._spritesImagesToStaticFile;
}
Environment.prototype.spritesImages = function()
{
return this.spritesImagesToMHTMLFile() || this.spritesImagesToStaticFile();
}
exports.Environment = Environment;
exports.ObjJ = new Environment("ObjJ");
var CommonJS = new Environment("CommonJS");
CommonJS.setCompilerFlags(["-DPLATFORM_COMMONJS"]);
exports.CommonJS = CommonJS;
var W3C = new Environment("W3C");
W3C.setCompilerFlags(["-DPLATFORM_BROWSER", "-DPLATFORM_DOM"]);
W3C.setSpritesImagesToStaticFile(true);
exports.W3C = W3C;
var IE7 = new Environment("IE7");
IE7.setCompilerFlags(["-DPLATFORM_BROWSER", "-DPLATFORM_DOM"]);
IE7.setSpritesImagesToMHTMLFile(true);
exports.IE7 = IE7;
var IE8 = new Environment("IE8");
IE8.setCompilerFlags(["-DPLATFORM_BROWSER", "-DPLATFORM_DOM"]);
IE8.setSpritesImagesToStaticFile(true);
exports.IE8 = IE8;
function EnvironmentCollection(/*String*/ aName, /*Array*/ environments)
{
this._name = aName;
this._environments = environments;
environments[aName] = this;
}
EnvironmentCollection.prototype.name = function()
{
return this._name;
}
EnvironmentCollection.prototype.toString = function()
{
return this._name;
}
EnvironmentCollection.prototype.flattenedEnvironments = function()
{
var environments = [];
this._environments.forEach(function(anEnvironment)
{
Array.prototype.push.apply(environments, anEnvironment.flattenedEnvironments());
});
return environments;
}
exports.Browsers = new EnvironmentCollection("Browsers", [W3C, IE7, IE8]);
+6 -6
View File
@@ -34,16 +34,16 @@ if ($CONFIGURATION === "Debug")
Files.include("Runtime/debug.js");
$BUILD_BROWSER_FILE = FILE.join($BUILD_OBJECTIVE_J, "Objective-J.js");
$BUILD_CJS_FILE = FILE.join($BUILD_OBJECTIVE_J, "CommonJS.platform", "Objective-J.js");
$BUILD_CJS_FILE = FILE.join($BUILD_OBJECTIVE_J, "CommonJS.environment", "Objective-J.js");
filedir ($BUILD_BROWSER_FILE, Files, function(aTask)
{
build_product(aTask.name(), platform_flags('Browser', 'ObjJ'));
build_product(aTask.name(), environmentFlags("ObjJ") + " -DPLATFORM_USERAGENT");
});
filedir ($BUILD_CJS_FILE, Files, function(aTask)
{
flags = platform_flags('CommonJS', 'ObjJ');
flags = environmentFlags("CommonJS", "ObjJ");
flags += ' -DRHINO'
build_product(aTask.name(), flags)
@@ -90,11 +90,11 @@ filedir ($BUILD_CJS_OBJECTIVE_J_FRAMEWORK, function()
CLOBBER.include($BUILD_OBJECTIVE_J);
function platform_flags()
function environmentFlags()
{
return "-DPLATFORMS=\"[" + Array.prototype.map.apply(arguments, [function(aPlatform)
return "-DENVIRONMENTS=\"[" + Array.prototype.map.apply(arguments, [function(anEnvironment)
{
return "\\\"" + aPlatform + "\\\"";
return "\\\"" + anEnvironment + "\\\"";
}]).join(", ") + "]\"";
}
+29 -17
View File
@@ -27,31 +27,39 @@
// Look inside bundleResponseCallback.
var OBJJ_PLATFORMS = PLATFORMS;
var OBJJ_ENVIRONMENTS = ENVIRONMENTS;
#ifdef PLATFORM_USERAGENT
var userAgent = window.navigator.userAgent;
if (userAgent.indexOf("MSIE 7") !== -1)
OBJJ_ENVIRONMENTS.unshift("IE7");
if (userAgent.indexOf("MSIE 8") !== -1)
OBJJ_ENVIRONMENTS.unshift("IE8");
else
OBJJ_ENVIRONMENTS.unshift("W3C");
#endif
#define DIRECTORY(aPath) (aPath).substr(0, (aPath).lastIndexOf('/') + 1)
function objj_firstCompatibleEngineFromArray(engines)
function objj_mostEligibleEnvironmentFromArray(environments)
{
var engine = NULL,
index = 0,
count = OBJJ_PLATFORMS.length,
innerCount = engines.length;
var index = 0,
count = OBJJ_ENVIRONMENTS.length,
innerCount = environments.length;
// Ugh, no indexOf, no objects-in-common.
for(; index < count; ++index)
{
var innerIndex = 0,
currentEngine = OBJJ_PLATFORMS[index];
environment = OBJJ_ENVIRONMENTS[index];
for (; innerIndex < innerCount; ++innerIndex)
if(currentEngine=== engines[innerIndex])
{
engine = currentEngine;
break;
}
if(environment === environments[innerIndex])
return environment;
}
return engine;
return NULL;
}
var OBJJFileNotFoundException = "OBJJFileNotFoundException",
@@ -393,16 +401,16 @@ objj_search.prototype.didReceiveBundleResponse = function(aResponse)
if (executablePath)
{
var platform = objj_firstCompatibleEngineFromArray(dictionary_getValue(bundle.info, "CPBundlePlatforms"));
var environment = objj_mostEligibleEnvironmentFromArray(dictionary_getValue(bundle.info, "CPBundleEnvironments"));
executablePath = platform + ".platform/" + executablePath;
executablePath = environment + ".environment/" + executablePath;
this.request(DIRECTORY(aResponse.filePath) + executablePath, this.didReceiveExecutableResponse);
// FIXME: Is this the right approach?
// Request the compiled file regardless of whether our current inquiry
var directory = DIRECTORY(aResponse.filePath),
replacedFiles = dictionary_getValue(dictionary_getValue(bundle.info, "CPBundleReplacedFiles"), platform),
replacedFiles = dictionary_getValue(dictionary_getValue(bundle.info, "CPBundleReplacedFiles"), environment),
index = 0,
count = replacedFiles.length;
@@ -628,7 +636,11 @@ function objj_decompile(aString, bundle)
break;
case MARKER_URI: bundle._URIMap[text] = stream.getString();
case MARKER_URI: var URI = stream.getString();
if (URI.toLowerCase().indexOf("mhtml:") === 0)
URI = "mhtml:" + DIRECTORY(window.location.href) + '/' + DIRECTORY(bundle.path) + '/' + URI.substr("mhtml:".length);
bundle._URIMap[text] = URI;
break;
case MARKER_BUNDLE: var bundlePath = DIRECTORY(bundle.path) + '/' + text;
+1 -1
View File
@@ -17,7 +17,7 @@ app ("capp", function(cappTask)
cappTask.setSources(new FileList("*.j"));
cappTask.setResources(new FileList("Resources/*"));
cappTask.setIncludesNibsAndXibs(true);
cappTask.setPlatforms([BundleTask.Platform.CommonJS]);
cappTask.setEnvironments(require("objective-j/jake/environment").CommonJS);
cappTask.setFlattensSources(true);
cappTask.setSpritesResources(false);
+2 -2
View File
@@ -16,9 +16,9 @@ app ("nib2cib", function(nib2cibTask)
nib2cibTask.setAuthor("280 North, Inc.");
nib2cibTask.setEmail("feedback @nospam@ 280north.com");
nib2cibTask.setSummary("nib2cib converts Cocoa nib and xibs to Cappuccino cibs");
nib2cibTask.setSources(FILE.glob("*.j"));// t.sources = FileList['**/*.j']
nib2cibTask.setSources(FILE.glob("**/*.j"));
nib2cibTask.setResources(FILE.glob("Resources/*"));
nib2cibTask.setPlatforms([BundleTask.Platform.CommonJS]);
nib2cibTask.setEnvironments(require("objective-j/jake/environment").CommonJS);
nib2cibTask.setFlattensSources(true);
if ($CONFIGURATION === "Release")
+2 -1
View File
@@ -16,7 +16,8 @@ app ("press", function(pressTask)
pressTask.setVersion("0.7.9");
pressTask.setSources(FILE.glob("*.j"));
pressTask.setResources(FILE.glob("Resources/*"));
pressTask.setPlatforms([BundleTask.Platform.CommonJS]);
pressTask.setEnvironments(require("objective-j/jake/environment").CommonJS);
pressTask.setFlattensSources(true);
if ($CONFIGURATION === "Release")
pressTask.setCompilerFlags("-O");
+1 -3
View File
@@ -115,7 +115,7 @@ function partial_require(path, exports)
global.setupEnvironment = function()
{
if (partial_require(FILE.join($BUILD_CONFIGURATION_DIR, "CommonJS", "objective-j")) ||
partial_require(FILE.join($HOME_DIR, "Objective-J", "CommonJS", "objective-j")))
partial_require(FILE.join($HOME_DIR, "Objective-J", "CommonJS")))
{
var OBJECTIVE_J_JAKE = require("objective-j/jake");
@@ -174,8 +174,6 @@ global.mv = function(/*String*/ from, /*String*/ to)
FILE.move(from, to);
}
//require 'objective-j'
function serializedENV()
{
var serialized = "";