Преглед изворни кода

Merge pull request #283 from sharelatex/ho-cdn

Ho cdn
Henry Oswald пре 10 година
родитељ
комит
a3e40adbaf

+ 55 - 7
services/web/app/coffee/infrastructure/ExpressLocals.coffee

@@ -7,15 +7,19 @@ querystring = require('querystring')
 SystemMessageManager = require("../Features/SystemMessages/SystemMessageManager")
 _ = require("underscore")
 Modules = require "./Modules"
+url = require "url"
 
 fingerprints = {}
 Path = require 'path'
+
+
 jsPath =
 	if Settings.useMinifiedJs
 		"/minjs/"
 	else
 		"/js/"
 
+
 logger.log "Generating file fingerprints..."
 for path in [
 	"#{jsPath}libs/require.js",
@@ -37,7 +41,21 @@ for path in [
 		fingerprints[path] = hash
 	else
 		logger.log filePath:filePath, "file does not exist for fingerprints"
-	
+
+getFingerprint = (path) ->
+	if fingerprints[path]?
+		return fingerprints[path]
+	else
+		logger.err "No fingerprint for file: #{path}"
+		return ""
+
+logger.log "Finished generating file fingerprints"
+
+
+staticFilesBase = ""
+if Settings.cdn?.web?.host?
+	staticFilesBase = Settings.cdn?.web?.host
+
 
 module.exports = (app, webRouter, apiRouter)->
 	webRouter.use (req, res, next)->
@@ -46,8 +64,43 @@ module.exports = (app, webRouter, apiRouter)->
 
 	webRouter.use (req, res, next)-> 
 		res.locals.jsPath = jsPath
+		res.locals.fullJsPath = url.resolve(staticFilesBase, jsPath)
+
+		imgPath = "/img/"
+		cssPath = "/stylesheets/"
+
+		res.locals.buildJsPath = (jsFile, opts = {})->
+			p = Path.join(jsPath, jsFile)
+			doFingerPrint = opts.fingerprint != false
+
+			if !opts.qs?
+				opts.qs = {}
+
+			if !opts.fingerprint? and doFingerPrint
+				opts.fingerprint = getFingerprint(p)
+			else if doFingerPrint
+				opts.qs.fingerprint = opts.fingerprint
+
+			p = url.resolve(staticFilesBase, p)
+			qs = querystring.stringify(opts.qs)
+
+			if qs? and qs.length > 0
+				p = p + "?" + qs
+			return p
+
+
+		res.locals.buildCssPath = (cssFile)->
+			p = Path.join(cssPath, cssFile)
+			return url.resolve(staticFilesBase, p) + "?fingerprint=" + getFingerprint(p)
+
+		res.locals.buildImgPath = (imgFile)->
+			p = Path.join(imgPath, imgFile)
+			return url.resolve(staticFilesBase, p)
+
 		next()
 
+
+
 	webRouter.use (req, res, next)-> 
 		res.locals.settings = Settings
 		next()
@@ -113,12 +166,7 @@ module.exports = (app, webRouter, apiRouter)->
 		next()
 
 	webRouter.use (req, res, next)-> 
-		res.locals.fingerprint = (path) ->
-			if fingerprints[path]?
-				return fingerprints[path]
-			else
-				logger.err "No fingerprint for file: #{path}"
-				return ""
+		res.locals.fingerprint = getFingerprint
 		next()
 
 	webRouter.use (req, res, next)-> 

+ 2 - 2
services/web/app/views/general/500.jade

@@ -3,7 +3,7 @@ html(itemscope, itemtype='http://schema.org/Product')
 	head
 		title Something went wrong
 		link(rel="icon", href="/favicon.ico")
-		link(rel='stylesheet', href='/stylesheets/style.css')
+		link(rel='stylesheet', href=buildCssPath('/style.css'))
 		link(href="//netdna.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css",rel="stylesheet")
 	body
 		.content
@@ -12,7 +12,7 @@ html(itemscope, itemtype='http://schema.org/Product')
 					.col-md-8.col-md-offset-2.text-center
 						.page-header
 							h2 Oh dear, something went wrong.
-						p: img(src="/img/lion-sad-128.png", alt="Sad Lion")
+						p: img(src=buildImgPath("lion-sad-128.png"), alt="Sad Lion")
 						p
 							| Something went wrong with your request, sorry. Our staff are probably looking into this, but if it continues, please contact us at #{settings.adminEmail}
 						p

+ 7 - 7
services/web/app/views/layout.jade

@@ -15,10 +15,10 @@ html(itemscope, itemtype='http://schema.org/Product')
 		-if (typeof(title) == "undefined")
 			title= 'ShareLaTeX, '+ translate("online_latex_editor") 
 		-else
-			title= translate(title) + ' - ShareLaTeX, '+translate("online_latex_editor") 
+			title= translate(title) + ' - ShareLaTeX, ' + translate("online_latex_editor") 
 
 		link(rel="icon", href="/favicon.ico")
-		link(rel='stylesheet', href='/stylesheets/style.css?fingerprint='+fingerprint('/stylesheets/style.css'))
+		link(rel='stylesheet', href=buildCssPath('/style.css'))
 
 		if settings.i18n.subdomainLang
 			each subdomainDetails in settings.i18n.subdomainLang
@@ -124,8 +124,8 @@ html(itemscope, itemtype='http://schema.org/Product')
 			window.csrfToken = "#{csrfToken}";
 			
 		block scripts
-		script(src="#{jsPath}libs/jquery-1.11.1.min.js")
-		script(src="#{jsPath}libs/angular-1.3.15.min.js")
+		script(src=buildJsPath("libs/jquery-1.11.1.min.js", {fingerprint:false}))
+		script(src=buildJsPath("libs/angular-1.3.15.min.js", {fingerprint:false}))
 		script.
 			window.sharelatex = {
 				siteUrl: '#{settings.siteUrl}',
@@ -194,9 +194,9 @@ html(itemscope, itemtype='http://schema.org/Product')
 					}
 				};
 			script(
-				data-main=jsPath+'main.js',
-				baseurl=jsPath,
-				src=jsPath+'libs/require.js?fingerprint='+fingerprint(jsPath + 'libs/require.js')
+				data-main=buildJsPath('main.js'),
+				baseurl=fullJsPath,
+				src=buildJsPath('libs/require.js')
 			)
 
 		include contact-us-modal

+ 9 - 6
services/web/app/views/project/editor.jade

@@ -100,7 +100,7 @@ block content
 		window.wikiEnabled = #{!!(settings.apis.wiki && settings.apis.wiki.url)};
 		window.requirejs = {
 			"paths" : {
-				"mathjax": "/js/libs/mathjax/MathJax.js?config=TeX-AMS_HTML",
+				"mathjax": "#{buildJsPath('/libs/mathjax/MathJax.js', {qs:{config:'TeX-AMS_HTML', fingerprint:false}})}",
 				"moment": "libs/moment-2.7.0",
 				"libs/pdf": "libs/pdfjs-1.3.91/pdf"
 			},
@@ -129,15 +129,18 @@ block content
 
 	- var pdfPath = 'libs/pdfjs-1.3.91/pdf.worker.js'
 	- var fingerprintedPath = fingerprint(jsPath+pdfPath)
-	- var pdfJsWorkerPath = jsPath+pdfPath+'?fingerprint='+fingerprintedPath
+	- var pdfJsWorkerPath = buildJsPath(pdfPath, {fingerprint:fingerprintedPath})
+
+
 	script(type='text/javascript').
 		window.pdfJsWorkerPath = "#{pdfJsWorkerPath}";
 
 	script(
-		data-main=jsPath+"ide.js",
-		baseurl=jsPath,
-		data-ace-base=jsPath+'ace',
-		src=jsPath+'libs/require.js?fingerprint='+fingerprint(jsPath + 'libs/require.js')
+		data-main=buildJsPath("ide.js"),
+		baseurl=fullJsPath,
+		data-ace-base=buildJsPath('ace', {fingerprint:false}),
+		src=buildJsPath('libs/require.js')
 	)
+
 		
 

+ 2 - 2
services/web/app/views/project/list/side-bar.jade

@@ -135,7 +135,7 @@
 						p
 							span Get Dropbox Sync
 						p
-							img(src="/img/dropbox/simple_logo.png")
+							img(src=buildImgPath("dropbox/simple_logo.png"))
 						p
 							a(href="/user/subscription/plans", sixpack-convert="left-menu-upgraed-rotation").btn.btn-primary #{translate("upgrade")}
 						p.small.text-centered
@@ -148,7 +148,7 @@
 						p
 							span Get Github Sync
 						p
-							img(src="/img/github/octocat.jpg")
+							img(src=buildImgPath("github/octocat.jpg"))
 						p
 							a(href="/user/subscription/plans", sixpack-convert="left-menu-upgraed-rotation").btn.btn-primary #{translate("upgrade")}
 						p.small.text-centered

+ 1 - 1
services/web/app/views/sentry.jade

@@ -2,7 +2,7 @@
 	- if (sentrySrc.match(/^([a-z]+:)?\/\//i))
 		script(src="#{sentrySrc}")
 	- else
-		script(src="#{jsPath}libs/#{sentrySrc}")
+		script(src=buildJsPath("libs/#{sentrySrc}"))
 - if (typeof(sentrySrc) != "undefined")
 	script(type="text/javascript").
 		if (typeof(Raven) != "undefined" && Raven.config) {

+ 1 - 1
services/web/app/views/subscriptions/edit-billing-details.jade

@@ -3,7 +3,7 @@ extends ../layout
 block content
 	- locals.supressDefaultJs = true
 	script(data-main=jsPath+'main.js', src=jsPath+'libs/require.js', baseurl=jsPath)
-	script(src=jsPath+'libs/recurly.min.js')
+	script(src=buildJsPath('libs/recurly.min.js'))
 
 	.content.content-alt
 		.container

+ 2 - 2
services/web/app/views/subscriptions/successful_subscription.jade

@@ -30,10 +30,10 @@ block content
 								| Henry and James
 							.portraits
 								span.img-circle
-									img(src="/img/about/henry_oswald.jpg") 
+									img(src=buildImgPath("about/henry_oswald.jpg"))
 								|  
 								span.img-circle
-									img(src="/img/about/james_allen.jpg") 
+									img(src=buildImgPath("about/james_allen.jpg"))
 						p
 							a.btn.btn-primary(href="/project") < #{translate("back_to_your_projects")}
 

+ 1 - 1
services/web/app/views/translations/translation_message.jade

@@ -2,7 +2,7 @@
 	span(ng-controller="TranslationsPopupController", ng-cloak)
 		.translations-message(ng-hide="hidei18nNotification")
 			a(href=recomendSubdomain.url+currentUrl) !{translate("click_here_to_view_sl_in_lng", {lngName:"<strong>" + translate(recomendSubdomain.lngCode) + "</strong>"})} 
-				img(src="/img/flags/24/#{recomendSubdomain.lngCode}.png")
+				img(src=buildImgPath("flags/24/#{recomendSubdomain.lngCode}.png"))
 			button(ng-click="dismiss()").close.pull-right
 				span(aria-hidden="true") &times;
 				span.sr-only #{translate("close")}

+ 4 - 0
services/web/config/settings.defaults.coffee

@@ -114,6 +114,10 @@ module.exports = settings =
 		showSocialButtons: false
 		showComments: false
 
+	# cdn:
+	# 	web:
+	# 		host:"http://www.sharelatex.dev:3000"
+
 	# Where your instance of ShareLaTeX can be found publically. Used in emails
 	# that are sent out, generated links, etc.
 	siteUrl : siteUrl = 'http://localhost:3000'

+ 1 - 10
services/web/public/coffee/ide/pdfng/directives/pdfJs.coffee

@@ -1,23 +1,14 @@
 define [
 	"base"
 	"ide/pdfng/directives/pdfViewer"
-	"text!libs/pdfListView/TextLayer.css"
-	"text!libs/pdfListView/AnnotationsLayer.css"
-	"text!libs/pdfListView/HighlightsLayer.css"
 ], (
 	App
 	pdfViewer
-	textLayerCss
-	annotationsLayerCss
-	highlightsLayerCss
+
 ) ->
 	if PDFJS?
 		PDFJS.workerSrc = window.pdfJsWorkerPath
 
-	style = $("<style/>")
-	style.text(textLayerCss + "\n" + annotationsLayerCss + "\n" + highlightsLayerCss)
-	$("body").append(style)
-
 	App.directive "pdfng", ["$timeout", "localStorage", ($timeout, localStorage) ->
 		return {
 			scope: {

+ 5 - 0
services/web/public/stylesheets/style.less

@@ -76,3 +76,8 @@
 @import "app/translations.less";
 @import "app/contact-us.less";
 @import "app/sprites.less";
+
+@import	"../js/libs/pdfListView/TextLayer.css";
+@import	"../js/libs/pdfListView/AnnotationsLayer.css";
+@import	"../js/libs/pdfListView/HighlightsLayer.css";
+