diff --git a/WebServer/AppLoader.js b/WebServer/AppLoader.js index f8f02c142..8ef1b92ae 100644 --- a/WebServer/AppLoader.js +++ b/WebServer/AppLoader.js @@ -19,14 +19,14 @@ function newAppLoader() { let plotters let modulesArray = [] - + plotters = defaultPlotters() - + modulesArray = modulesArray.concat([ 'ChartingSpace/Viewport.js', - + 'Globals.js', - + 'AppSchema.js', 'Workspace.js', @@ -44,22 +44,23 @@ function newAppLoader() { 'DesignSpace/Workspace/FunctionLibraries/NodeDeleter.js', 'DesignSpace/Workspace/FunctionLibraries/ProtocolNode.js', 'DesignSpace/Workspace/FunctionLibraries/NodeCloning.js', - 'DesignSpace/Workspace/FunctionLibraries/NodeChildren.js', + 'DesignSpace/Workspace/FunctionLibraries/NodeChildren.js', 'DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js', 'DesignSpace/Workspace/FunctionLibraries/SessionFunctions.js', 'DesignSpace/Workspace/FunctionLibraries/ShortcutKeys.js', 'DesignSpace/Workspace/FunctionLibraries/OnFocus.js', 'DesignSpace/Workspace/FunctionLibraries/SuperScripts.js', 'DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js', - 'DesignSpace/Workspace/FunctionLibraries/WebhookFunctions.js', + 'DesignSpace/Workspace/FunctionLibraries/WebhookFunctions.js', 'DesignSpace/Workspace/FunctionLibraries/DependenciesFilter.js', - + 'Utilities/CoordinateTransformations.js', 'Utilities/DateRateTransformations.js', 'Utilities/Download.js', 'Utilities/DrawPrint.js', 'Utilities/LoadSaveFrame.js', 'Utilities/NodeConfig.js', + 'Utilities/HiriarchyMap.js', 'Panels/LayersPanel.js', 'Panels/UpDownButton.js', @@ -67,7 +68,7 @@ function newAppLoader() { 'Panels/Layer.js', 'Panels/PlotterPanel.js', 'Panels/PanelsVisibleButton.js', - + 'SideSpace/SidePanelTab.js', 'SideSpace/ListView.js', 'SideSpace/ListItem.js', @@ -97,7 +98,7 @@ function newAppLoader() { 'FloatingSpace/CircularMenuItem.js', 'FloatingSpace/CircularProgressBar.js', 'FloatingSpace/BusyProgressBar.js', - 'FloatingSpace/CodeEditor.js', + 'FloatingSpace/CodeEditor.js', 'FloatingSpace/ConfigEditor.js', 'FloatingSpace/ConditionEditor.js', 'FloatingSpace/FormulaEditor.js', @@ -108,29 +109,34 @@ function newAppLoader() { 'Scales/TimeFrameScale.js', 'Scales/Commons.js', 'Scales/AutoScaleButton.js', - + 'CockpitSpace/AssetBalances.js', 'CockpitSpace/Speedometer.js', 'CockpitSpace/FullScreen.js', 'EventsServerClient.js', - 'VideoRecorder.js', - 'Plotter.js', + 'Plotting/Plotter.js', + 'Plotting/NodesHighlights.js', + 'Plotting/NodesErrors.js', + 'Plotting/NodesValues.js', + 'Plotting/NodesStatus.js', + 'Plotting/NodesProgress.js', + 'Plotting/NodesRunning.js', + 'Plotting/NodesAnnouncements.js', + 'Plotting/RecordValues.js', + 'LegacyPlotter.js', 'PlotterPanel.js', + 'VideoRecorder.js', 'ProductStorage.js', - 'SplashScreen.js', 'Canvas.js', 'EventHandler.js', 'Frame.js', - 'Animation.js', - 'Container.js', - 'Utilities.js', 'PostLoader.js' ]) @@ -181,23 +187,14 @@ function newAppLoader() { } function defaultPlotters() { - return [ + return [ 'Plotters/Masters/Plotters-Candles-Volumes/Candles.js', 'Plotters/Masters/Plotters-Candles-Volumes/CandlePanel.js', 'Plotters/Masters/Plotters-Candles-Volumes/Volumes.js', 'Plotters/Masters/Plotters-Candles-Volumes/VolumePanel.js', 'Plotters/Masters/Plotters-Bollinger-Bands/BollingerBands.js', 'Plotters/Masters/Plotters-Bollinger-Bands/BollingerBandsPanel.js', - 'Plotters/Masters/Plotters-Bollinger-Bands/PercentageBandwidth.js', - 'Plotters/TradingEngines/Plotters-Trading-Simulation/TradingSimulation.js', - 'Plotters/TradingEngines/Plotters-Trading-Simulation/TradingSimulationAssetBalancesPanel.js', - 'Plotters/TradingEngines/Plotters-Trading-Simulation/TradingSimulationCurrentPositionPanel.js', - 'Plotters/TradingEngines/Plotters-Trading-Simulation/TradingSimulationEpisodePanel.js', - 'Plotters/TradingEngines/Plotters-Trading-Simulation/Conditions.js', - 'Plotters/TradingEngines/Plotters-Trading-Simulation/Strategies.js', - 'Plotters/TradingEngines/Plotters-Trading-Simulation/Trades.js', - 'Plotters/TradingEngines/Plotters-Trading-Simulation/SimulationExecution.js', - 'Plotters/TradingEngines/Plotters-Trading-Simulation/SimulationExecutionPanel.js' + 'Plotters/Masters/Plotters-Bollinger-Bands/PercentageBandwidth.js' ] } diff --git a/WebServer/Fonts/Kit/generator_config.txt b/WebServer/Fonts/Kit/generator_config.txt new file mode 100644 index 000000000..81e64f6b8 --- /dev/null +++ b/WebServer/Fonts/Kit/generator_config.txt @@ -0,0 +1,5 @@ +# Font Squirrel Font-face Generator Configuration File +# Upload this file to the generator to recreate the settings +# you used to create these fonts. + +{"mode":"optimal","formats":["woff","woff2"],"tt_instructor":"default","fix_gasp":"xy","fix_vertical_metrics":"Y","metrics_ascent":"","metrics_descent":"","metrics_linegap":"","add_spaces":"Y","add_hyphens":"Y","fallback":"none","fallback_custom":"100","options_subset":"basic","subset_custom":"","subset_custom_range":"","subset_ot_features_list":"","css_stylesheet":"stylesheet.css","filename_suffix":"-webfont","emsquare":"2048","spacing_adjustment":"0"} \ No newline at end of file diff --git a/WebServer/Fonts/Kit/sairacondensed-regular-demo - Copy.html b/WebServer/Fonts/Kit/sairacondensed-regular-demo - Copy.html new file mode 100644 index 000000000..1caecbc5c --- /dev/null +++ b/WebServer/Fonts/Kit/sairacondensed-regular-demo - Copy.html @@ -0,0 +1,1316 @@ + + + + + + + + + + + + + + Saira Condensed Regular Specimen + + + + + + +
+ + + +
+ + +
+ +
+
+
AaBb
+
+
+ +
+
+ A​B​C​D​E​F​G​H​I​J​K​L​M​N​O​P​Q​R​S​T​U​V​W​X​Y​Z​a​b​c​d​e​f​g​h​i​j​k​l​m​n​o​p​q​r​s​t​u​v​w​x​y​z​1​2​3​4​5​6​7​8​9​0​&​.​,​?​!​@​(​)​#​$​%​*​+​-​=​:​; +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
10 + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
11 + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
12 + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
13 + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
14 + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
16 + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
18 + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
20 + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
24 + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
30 + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
36 + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
48 + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
60 + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
72 + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
90 + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
+ +
+ +
+ + + +
+ + +
+
+ ◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼body +
+
body
+
body
+
body
+
+
+ bodySaira Condensed Regular +
+
+ bodyArial +
+
+ bodyVerdana +
+
+ bodyGeorgia +
+ + + +
+ + +
+ +
+

10.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+ +
+
+

11.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+ +
+
+

12.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+ +
+
+

13.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+ +
+
+ +
+
+
+

14.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+ +
+
+

16.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+ +
+
+

18.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+ +
+ +
+ +
+ +
+
+

20.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+
+
+

24.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+
+ +
+ +
+ +
+
+

30.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+
+
+ +
+ + + +
+
+

10.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+ +
+
+

11.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+ +
+
+

12.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+ +
+
+

13.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+ +
+
+ +
+ +
+
+

14.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+ +
+
+

16.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+ +
+
+

18.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+ +
+
+ +
+ +
+
+

20.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+
+
+

24.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+
+ +
+ +
+ +
+
+

30.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, + tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet + risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus + et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra + augue.

+
+
+ +
+ + + + +
+ +
+ +
+ +
+

Lorem Ipsum Dolor

+

Etiam porta sem malesuada magna mollis euismod

+ + +
+
+
+
+

Donec sed odio dui. Morbi leo risus, porta ac consectetur ac, vestibulum at + eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum + massa justo sit amet risus.

+ + +

Pellentesque ornare sem

+ +

Maecenas sed diam eget risus varius blandit sit amet non magna. Maecenas faucibus mollis + interdum. Donec ullamcorper nulla non metus auctor fringilla. Nullam id dolor id nibh + ultricies vehicula ut id elit. Nullam id dolor id nibh ultricies vehicula ut id elit.

+ +

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Lorem ipsum + dolor sit amet, consectetur adipiscing elit. Cum sociis natoque penatibus et magnis dis + parturient montes, nascetur ridiculus mus.

+ +

Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna, vel scelerisque + nisl consectetur et. Aenean lacinia bibendum nulla sed consectetur.

+ +

Nullam quis risus eget urna mollis ornare vel eu leo. Nullam quis risus eget urna mollis + ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec + ullamcorper nulla non metus auctor fringilla.

+ +

Cras mattis consectetur

+ +

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean lacinia + bibendum nulla sed consectetur. Integer posuere erat a ante venenatis dapibus posuere velit + aliquet. Cras mattis consectetur purus sit amet fermentum.

+ +

Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam quis risus eget urna mollis + ornare vel eu leo. Cras mattis consectetur purus sit amet fermentum.

+
+ + +
+ +
+ + + + + + +
+
+
+ +

Language Support

+

The subset of Saira Condensed Regular in this kit supports the following languages:
+ + Albanian, Basque, Breton, Chamorro, Danish, Dutch, English, Faroese, Finnish, French, + Frisian, Galician, German, Icelandic, Italian, Malagasy, Norwegian, Portuguese, Spanish, + Alsatian, Aragonese, Arapaho, Arrernte, Asturian, Aymara, Bislama, Cebuano, Corsican, + Fijian, French_creole, Genoese, Gilbertese, Greenlandic, Haitian_creole, Hiligaynon, Hmong, + Hopi, Ibanag, Iloko_ilokano, Indonesian, Interglossa_glosa, Interlingua, Irish_gaelic, + Jerriais, Lojban, Lombard, Luxembourgeois, Manx, Mohawk, Norfolk_pitcairnese, Occitan, + Oromo, Pangasinan, Papiamento, Piedmontese, Potawatomi, Rhaeto-romance, Romansh, Rotokas, + Sami_lule, Samoan, Sardinian, Scots_gaelic, Seychelles_creole, Shona, Sicilian, Somali, + Southern_ndebele, Swahili, Swati_swazi, Tagalog_filipino_pilipino, Tetum, Tok_pisin, + Uyghur_latinized, Volapuk, Walloon, Warlpiri, Xhosa, Yapese, Zulu, Latinbasic, Ubasic, Demo +

+

Glyph Chart

+

The subset of Saira Condensed Regular in this kit includes all the glyphs listed below. + Unicode entities are included above each glyph to help you insert individual characters into + your layout.

+
+ +
+



+
+
+

 

+
+
+

!

! +
+
+

"

" +
+
+

#

# +
+
+

$

$ +
+
+

%

% +
+
+

&

& +
+
+

'

' +
+
+

(

( +
+
+

)

) +
+
+

*

* +
+
+

+

+ +
+
+

,

, +
+
+

-

- +
+
+

.

. +
+
+

/

/ +
+
+

0

0 +
+
+

1

1 +
+
+

2

2 +
+
+

3

3 +
+
+

4

4 +
+
+

5

5 +
+
+

6

6 +
+
+

7

7 +
+
+

8

8 +
+
+

9

9 +
+
+

:

: +
+
+

&#59;

; +
+
+

<

< +
+
+

&#61;

= +
+
+

&#62;

> +
+
+

&#63;

? +
+
+

&#64;

@ +
+
+

&#65;

A +
+
+

&#66;

B +
+
+

&#67;

C +
+
+

&#68;

D +
+
+

&#69;

E +
+
+

&#70;

F +
+
+

&#71;

G +
+
+

&#72;

H +
+
+

&#73;

I +
+
+

&#74;

J +
+
+

&#75;

K +
+
+

&#76;

L +
+
+

&#77;

M +
+
+

&#78;

N +
+
+

&#79;

O +
+
+

&#80;

P +
+
+

&#81;

Q +
+
+

&#82;

R +
+
+

&#83;

S +
+
+

&#84;

T +
+
+

&#85;

U +
+
+

&#86;

V +
+
+

&#87;

W +
+
+

&#88;

X +
+
+

&#89;

Y +
+
+

&#90;

Z +
+
+

&#91;

[ +
+
+

&#92;

\ +
+
+

&#93;

] +
+
+

&#94;

^ +
+
+

&#95;

_ +
+
+

&#96;

` +
+
+

&#97;

a +
+
+

&#98;

b +
+
+

&#99;

c +
+
+

&#100;

d +
+
+

&#101;

e +
+
+

&#102;

f +
+
+

&#103;

g +
+
+

&#104;

h +
+
+

&#105;

i +
+
+

&#106;

j +
+
+

&#107;

k +
+
+

&#108;

l +
+
+

&#109;

m +
+
+

&#110;

n +
+
+

&#111;

o +
+
+

&#112;

p +
+
+

&#113;

q +
+
+

&#114;

r +
+
+

&#115;

s +
+
+

&#116;

t +
+
+

&#117;

u +
+
+

&#118;

v +
+
+

&#119;

w +
+
+

&#120;

x +
+
+

&#121;

y +
+
+

&#122;

z +
+
+

&#123;

{ +
+
+

&#124;

| +
+
+

&#125;

} +
+
+

&#126;

~ +
+
+

&#160;

  +
+
+

&#161;

¡ +
+
+

&#162;

¢ +
+
+

&#163;

£ +
+
+

&#164;

¤ +
+
+

&#165;

¥ +
+
+

&#166;

¦ +
+
+

&#167;

§ +
+
+

&#168;

¨ +
+
+

&#169;

© +
+
+

&#170;

ª +
+
+

&#171;

« +
+
+

&#172;

¬ +
+
+

&#173;

­ +
+
+

&#174;

® +
+
+

&#175;

¯ +
+
+

&#176;

° +
+
+

&#177;

± +
+
+

&#178;

² +
+
+

&#179;

³ +
+
+

&#180;

´ +
+
+

&#181;

µ +
+
+

&#182;

¶ +
+
+

&#183;

· +
+
+

&#184;

¸ +
+
+

&#185;

¹ +
+
+

&#186;

º +
+
+

&#187;

» +
+
+

&#188;

¼ +
+
+

&#189;

½ +
+
+

&#190;

¾ +
+
+

&#191;

¿ +
+
+

&#192;

À +
+
+

&#193;

Á +
+
+

&#194;

 +
+
+

&#195;

à +
+
+

&#196;

Ä +
+
+

&#197;

Å +
+
+

&#198;

Æ +
+
+

&#199;

Ç +
+
+

&#200;

È +
+
+

&#201;

É +
+
+

&#202;

Ê +
+
+

&#203;

Ë +
+
+

&#204;

Ì +
+
+

&#205;

Í +
+
+

&#206;

Î +
+
+

&#207;

Ï +
+
+

&#208;

Ð +
+
+

&#209;

Ñ +
+
+

&#210;

Ò +
+
+

&#211;

Ó +
+
+

&#212;

Ô +
+
+

&#213;

Õ +
+
+

&#214;

Ö +
+
+

&#215;

× +
+
+

&#216;

Ø +
+
+

&#217;

Ù +
+
+

&#218;

Ú +
+
+

&#219;

Û +
+
+

&#220;

Ü +
+
+

&#221;

Ý +
+
+

&#222;

Þ +
+
+

&#223;

ß +
+
+

&#224;

à +
+
+

&#225;

á +
+
+

&#226;

â +
+
+

&#227;

ã +
+
+

&#228;

ä +
+
+

&#229;

å +
+
+

&#230;

æ +
+
+

&#231;

ç +
+
+

&#232;

è +
+
+

&#233;

é +
+
+

&#234;

ê +
+
+

&#235;

ë +
+
+

&#236;

ì +
+
+

&#237;

í +
+
+

&#238;

î +
+
+

&#239;

ï +
+
+

&#240;

ð +
+
+

&#241;

ñ +
+
+

&#242;

ò +
+
+

&#243;

ó +
+
+

&#244;

ô +
+
+

&#245;

õ +
+
+

&#246;

ö +
+
+

&#247;

÷ +
+
+

&#248;

ø +
+
+

&#249;

ù +
+
+

&#250;

ú +
+
+

&#251;

û +
+
+

&#252;

ü +
+
+

&#253;

ý +
+
+

&#254;

þ +
+
+

&#255;

ÿ +
+
+

&#338;

Œ +
+
+

&#339;

œ +
+
+

&#376;

Ÿ +
+
+

&#710;

ˆ +
+
+

&#732;

˜ +
+
+

&#8192;

  +
+
+

&#8193;

  +
+
+

&#8194;

  +
+
+

&#8195;

  +
+
+

&#8196;

  +
+
+

&#8197;

  +
+
+

&#8198;

  +
+
+

&#8199;

  +
+
+

&#8200;

  +
+
+

&#8201;

  +
+
+

&#8202;

  +
+
+

&#8208;

‐ +
+
+

&#8209;

‑ +
+
+

&#8210;

‒ +
+
+

&#8211;

– +
+
+

&#8212;

— +
+
+

&#8216;

‘ +
+
+

&#8217;

’ +
+
+

&#8218;

‚ +
+
+

&#8220;

“ +
+
+

&#8221;

” +
+
+

&#8222;

„ +
+
+

&#8226;

• +
+
+

&#8230;

… +
+
+

&#8239;

  +
+
+

&#8249;

‹ +
+
+

&#8250;

› +
+
+

&#8287;

  +
+
+

&#8364;

€ +
+
+

&#8482;

™ +
+
+

&#9724;

◼ +
+
+

&#64257;

fi +
+
+

&#64258;

fl +
+
+
+ + +
+
+ + +
+ +
+ +
+
+
+

Installing Webfonts

+ +

Webfonts are supported by all major browser platforms but not all in the same way. There are + currently four different font formats that must be included in order to target all browsers. + This includes TTF, WOFF, EOT and SVG.

+ +

1. Upload your webfonts

+

You must upload your webfont kit to your website. They should be in or near the same + directory as your CSS files.

+ +

2. Include the webfont stylesheet

+

A special CSS @font-face declaration helps the various browsers select the appropriate font + it needs without causing you a bunch of headaches. Learn more about this syntax by reading + the Fontspring + blog post about it. The code for it is as follows:

+ + + +@font-face{ + font-family: 'MyWebFont'; + src: url('WebFont.eot'); + src: url('WebFont.eot?#iefix') format('embedded-opentype'), + url('WebFont.woff') format('woff'), + url('WebFont.ttf') format('truetype'), + url('WebFont.svg#webfont') format('svg'); +} + + +

We've already gone ahead and generated the code for you. All you have to do is link to the + stylesheet in your HTML, like this:

+ <link rel="stylesheet" href="stylesheet.css" type="text/css" charset="utf-8" /> + +

3. Modify your own stylesheet

+

To take advantage of your new fonts, you must tell your stylesheet to use them. Look at the + original @font-face declaration above and find the property called "font-family." The name + linked there will be what you use to reference the font. Prepend that webfont name to the + font stack in the "font-family" property, inside the selector you want to change. For + example:

+ p { font-family: 'WebFont', Arial, sans-serif; } + +

4. Test

+

Getting webfonts to work cross-browser can be tricky. Use the information in the + sidebar to help you if you find that fonts aren't loading in a particular browser.

+
+ + +
+ +
+ +
+ +
+ + + \ No newline at end of file diff --git a/WebServer/Fonts/Kit/sairacondensed-regular-demo.html b/WebServer/Fonts/Kit/sairacondensed-regular-demo.html new file mode 100644 index 000000000..140baf086 --- /dev/null +++ b/WebServer/Fonts/Kit/sairacondensed-regular-demo.html @@ -0,0 +1,27 @@ + + + + + + + + +
+ + + +
+ + + \ No newline at end of file diff --git a/WebServer/Fonts/Kit/sairacondensed-regular-webfont.woff b/WebServer/Fonts/Kit/sairacondensed-regular-webfont.woff new file mode 100644 index 000000000..15e6a364d Binary files /dev/null and b/WebServer/Fonts/Kit/sairacondensed-regular-webfont.woff differ diff --git a/WebServer/Fonts/Kit/sairacondensed-regular-webfont.woff2 b/WebServer/Fonts/Kit/sairacondensed-regular-webfont.woff2 new file mode 100644 index 000000000..3a60a7af2 Binary files /dev/null and b/WebServer/Fonts/Kit/sairacondensed-regular-webfont.woff2 differ diff --git a/WebServer/Fonts/Kit/specimen_files/grid_12-825-55-15.css b/WebServer/Fonts/Kit/specimen_files/grid_12-825-55-15.css new file mode 100644 index 000000000..3d6aef783 --- /dev/null +++ b/WebServer/Fonts/Kit/specimen_files/grid_12-825-55-15.css @@ -0,0 +1,129 @@ +/*Notes about grid: +Columns: 12 +Grid Width: 825px +Column Width: 55px +Gutter Width: 15px +-------------------------------*/ + + + +.section {margin-bottom: 18px; +} +.section:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;} +.section {*zoom: 1;} + +.section .firstcolumn, +.section .firstcol {margin-left: 0;} + + +/* Border on left hand side of a column. */ +.border { + padding-left: 7px; + margin-left: 7px; + border-left: 1px solid #eee; +} + +/* Border with more whitespace, spans one column. */ +.colborder { + padding-left: 42px; + margin-left: 42px; + border-left: 1px solid #eee; +} + + + +/* The Grid Classes */ +.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12 +{margin-left: 15px;float: left;display: inline; overflow: hidden;} + + +.width1, .grid1, .span-1 {width: 55px;} +.width1_2cols,.grid1_2cols {width: 20px;} +.width1_3cols,.grid1_3cols {width: 8px;} +.width1_4cols,.grid1_4cols {width: 2px;} +.input_width1 {width: 49px;} + +.width2, .grid2, .span-2 {width: 125px;} +.width2_3cols,.grid2_3cols {width: 31px;} +.width2_4cols,.grid2_4cols {width: 20px;} +.input_width2 {width: 119px;} + +.width3, .grid3, .span-3 {width: 195px;} +.width3_2cols,.grid3_2cols {width: 90px;} +.width3_4cols,.grid3_4cols {width: 37px;} +.input_width3 {width: 189px;} + +.width4, .grid4, .span-4 {width: 265px;} +.width4_3cols,.grid4_3cols {width: 78px;} +.input_width4 {width: 259px;} + +.width5, .grid5, .span-5 {width: 335px;} +.width5_2cols,.grid5_2cols {width: 160px;} +.width5_3cols,.grid5_3cols {width: 101px;} +.width5_4cols,.grid5_4cols {width: 72px;} +.input_width5 {width: 329px;} + +.width6, .grid6, .span-6 {width: 405px;} +.width6_4cols,.grid6_4cols {width: 90px;} +.input_width6 {width: 399px;} + +.width7, .grid7, .span-7 {width: 475px;} +.width7_2cols,.grid7_2cols {width: 230px;} +.width7_3cols,.grid7_3cols {width: 148px;} +.width7_4cols,.grid7_4cols {width: 107px;} +.input_width7 {width: 469px;} + +.width8, .grid8, .span-8 {width: 545px;} +.width8_3cols,.grid8_3cols {width: 171px;} +.input_width8 {width: 539px;} + +.width9, .grid9, .span-9 {width: 615px;} +.width9_2cols,.grid9_2cols {width: 300px;} +.width9_4cols,.grid9_4cols {width: 142px;} +.input_width9 {width: 609px;} + +.width10, .grid10, .span-10 {width: 685px;} +.width10_3cols,.grid10_3cols {width: 218px;} +.width10_4cols,.grid10_4cols {width: 160px;} +.input_width10 {width: 679px;} + +.width11, .grid11, .span-11 {width: 755px;} +.width11_2cols,.grid11_2cols {width: 370px;} +.width11_3cols,.grid11_3cols {width: 241px;} +.width11_4cols,.grid11_4cols {width: 177px;} +.input_width11 {width: 749px;} + +.width12, .grid12, .span-12 {width: 825px;} +.input_width12 {width: 819px;} + +/* Subdivided grid spaces */ +.emptycols_left1, .prepend-1 {padding-left: 70px;} +.emptycols_right1, .append-1 {padding-right: 70px;} +.emptycols_left2, .prepend-2 {padding-left: 140px;} +.emptycols_right2, .append-2 {padding-right: 140px;} +.emptycols_left3, .prepend-3 {padding-left: 210px;} +.emptycols_right3, .append-3 {padding-right: 210px;} +.emptycols_left4, .prepend-4 {padding-left: 280px;} +.emptycols_right4, .append-4 {padding-right: 280px;} +.emptycols_left5, .prepend-5 {padding-left: 350px;} +.emptycols_right5, .append-5 {padding-right: 350px;} +.emptycols_left6, .prepend-6 {padding-left: 420px;} +.emptycols_right6, .append-6 {padding-right: 420px;} +.emptycols_left7, .prepend-7 {padding-left: 490px;} +.emptycols_right7, .append-7 {padding-right: 490px;} +.emptycols_left8, .prepend-8 {padding-left: 560px;} +.emptycols_right8, .append-8 {padding-right: 560px;} +.emptycols_left9, .prepend-9 {padding-left: 630px;} +.emptycols_right9, .append-9 {padding-right: 630px;} +.emptycols_left10, .prepend-10 {padding-left: 700px;} +.emptycols_right10, .append-10 {padding-right: 700px;} +.emptycols_left11, .prepend-11 {padding-left: 770px;} +.emptycols_right11, .append-11 {padding-right: 770px;} +.pull-1 {margin-left: -70px;} +.push-1 {margin-right: -70px;margin-left: 18px;float: right;} +.pull-2 {margin-left: -140px;} +.push-2 {margin-right: -140px;margin-left: 18px;float: right;} +.pull-3 {margin-left: -210px;} +.push-3 {margin-right: -210px;margin-left: 18px;float: right;} +.pull-4 {margin-left: -280px;} +.push-4 {margin-right: -280px;margin-left: 18px;float: right;} \ No newline at end of file diff --git a/WebServer/Fonts/Kit/specimen_files/specimen_stylesheet.css b/WebServer/Fonts/Kit/specimen_files/specimen_stylesheet.css new file mode 100644 index 000000000..aecc43c32 --- /dev/null +++ b/WebServer/Fonts/Kit/specimen_files/specimen_stylesheet.css @@ -0,0 +1,396 @@ +@import url('grid_12-825-55-15.css'); + +/* + CSS Reset by Eric Meyer - Released under Public Domain + http://meyerweb.com/eric/tools/css/reset/ +*/ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, table, +caption, tbody, tfoot, thead, tr, th, td + {margin: 0;padding: 0;border: 0;outline: 0; + font-size: 100%;vertical-align: baseline; + background: transparent;} +body {line-height: 1;} +ol, ul {list-style: none;} +blockquote, q {quotes: none;} +blockquote:before, blockquote:after, +q:before, q:after {content: ''; content: none;} +:focus {outline: 0;} +ins {text-decoration: none;} +del {text-decoration: line-through;} +table {border-collapse: collapse;border-spacing: 0;} + + + + +body { + color: #000; + background-color: #dcdcdc; +} + +a { + text-decoration: none; + color: #1883ba; +} + +h1{ + font-size: 32px; + font-weight: normal; + font-style: normal; + margin-bottom: 18px; +} + +h2{ + font-size: 18px; +} + +#container { + width: 865px; + margin: 0px auto; +} + + +#header { + padding: 20px; + font-size: 36px; + background-color: #000; + color: #fff; +} + +#header span { + color: #666; +} +#main_content { + background-color: #fff; + padding: 60px 20px 20px; +} + + +#footer p { + margin: 0; + padding-top: 10px; + padding-bottom: 50px; + color: #333; + font: 10px Arial, sans-serif; +} + +.tabs { + width: 100%; + height: 31px; + background-color: #444; +} +.tabs li { + float: left; + margin: 0; + overflow: hidden; + background-color: #444; +} +.tabs li a { + display: block; + color: #fff; + text-decoration: none; + font: bold 11px/11px 'Arial'; + text-transform: uppercase; + padding: 10px 15px; + border-right: 1px solid #fff; +} + +.tabs li a:hover { + background-color: #00b3ff; + +} + +.tabs li.active a { + color: #000; + background-color: #fff; +} + + + +div.huge { + + font-size: 300px; + line-height: 1em; + padding: 0; + letter-spacing: -.02em; + overflow: hidden; +} +div.glyph_range { + font-size: 72px; + line-height: 1.1em; +} + +.size10{ font-size: 10px; } +.size11{ font-size: 11px; } +.size12{ font-size: 12px; } +.size13{ font-size: 13px; } +.size14{ font-size: 14px; } +.size16{ font-size: 16px; } +.size18{ font-size: 18px; } +.size20{ font-size: 20px; } +.size24{ font-size: 24px; } +.size30{ font-size: 30px; } +.size36{ font-size: 36px; } +.size48{ font-size: 48px; } +.size60{ font-size: 60px; } +.size72{ font-size: 72px; } +.size90{ font-size: 90px; } + + +.psample_row1 { height: 120px;} +.psample_row1 { height: 120px;} +.psample_row2 { height: 160px;} +.psample_row3 { height: 160px;} +.psample_row4 { height: 160px;} + +.psample { + overflow: hidden; + position: relative; +} +.psample p { + line-height: 1.3em; + display: block; + overflow: hidden; + margin: 0; +} + +.psample span { + margin-right: .5em; +} + +.white_blend { + width: 100%; + height: 61px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==); + position: absolute; + bottom: 0; +} +.black_blend { + width: 100%; + height: 61px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC); + position: absolute; + bottom: 0; +} +.fullreverse { + background: #000 !important; + color: #fff !important; + margin-left: -20px; + padding-left: 20px; + margin-right: -20px; + padding-right: 20px; + padding: 20px; + margin-bottom:0; +} + + +.sample_table td { + padding-top: 3px; + padding-bottom:5px; + padding-left: 5px; + vertical-align: middle; + line-height: 1.2em; +} + +.sample_table td:first-child { + background-color: #eee; + text-align: right; + padding-right: 5px; + padding-left: 0; + padding: 5px; + font: 11px/12px "Courier New", Courier, mono; +} + +code { + white-space: pre; + background-color: #eee; + display: block; + padding: 10px; + margin-bottom: 18px; + overflow: auto; +} + + +.bottom,.last {margin-bottom:0 !important; padding-bottom:0 !important;} + +.box { + padding: 18px; + margin-bottom: 18px; + background: #eee; +} + +.reverse,.reversed { background: #000 !important;color: #fff !important; border: none !important;} + +#bodycomparison { + position: relative; + overflow: hidden; + font-size: 72px; + height: 90px; + white-space: nowrap; +} + +#bodycomparison div{ + font-size: 72px; + line-height: 90px; + display: inline; + margin: 0 15px 0 0; + padding: 0; +} + +#bodycomparison div span{ + font: 10px Arial; + position: absolute; + left: 0; +} +#xheight { + float: none; + position: absolute; + color: #d9f3ff; + font-size: 72px; + line-height: 90px; +} + +.fontbody { + position: relative; +} +.arialbody{ + font-family: Arial; + position: relative; +} +.verdanabody{ + font-family: Verdana; + position: relative; +} +.georgiabody{ + font-family: Georgia; + position: relative; +} + +/* @group Layout page + */ + +#layout h1 { + font-size: 36px; + line-height: 42px; + font-weight: normal; + font-style: normal; +} + +#layout h2 { + font-size: 24px; + line-height: 23px; + font-weight: normal; + font-style: normal; +} + +#layout h3 { + font-size: 22px; + line-height: 1.4em; + margin-top: 1em; + font-weight: normal; + font-style: normal; +} + + +#layout p.byline { + font-size: 12px; + margin-top: 18px; + line-height: 12px; + margin-bottom: 0; +} +#layout p { + font-size: 14px; + line-height: 21px; + margin-bottom: .5em; +} + +#layout p.large{ + font-size: 18px; + line-height: 26px; +} + +#layout .sidebar p{ + font-size: 12px; + line-height: 1.4em; +} + +#layout p.caption { + font-size: 10px; + margin-top: -16px; + margin-bottom: 18px; +} + +/* @end */ + +/* @group Glyphs */ + +#glyph_chart div{ + background-color: #d9f3ff; + color: black; + float: left; + font-size: 36px; + height: 1.2em; + line-height: 1.2em; + margin-bottom: 1px; + margin-right: 1px; + text-align: center; + width: 1.2em; + position: relative; + padding: .6em .2em .2em; +} + +#glyph_chart div p { + position: absolute; + left: 0; + top: 0; + display: block; + text-align: center; + font: bold 9px Arial, sans-serif; + background-color: #3a768f; + width: 100%; + color: #fff; + padding: 2px 0; +} + + +#glyphs h1 { + font-family: Arial, sans-serif; +} +/* @end */ + +/* @group Installing */ + +#installing { + font: 13px Arial, sans-serif; +} + +#installing p, +#glyphs p{ + line-height: 1.2em; + margin-bottom: 18px; + font: 13px Arial, sans-serif; +} + + + +#installing h3{ + font-size: 15px; + margin-top: 18px; +} + +/* @end */ + +#rendering h1 { + font-family: Arial, sans-serif; +} +.render_table td { + font: 11px "Courier New", Courier, mono; + vertical-align: middle; +} + + diff --git a/WebServer/Fonts/Kit/stylesheet.css b/WebServer/Fonts/Kit/stylesheet.css new file mode 100644 index 000000000..7a63be7cd --- /dev/null +++ b/WebServer/Fonts/Kit/stylesheet.css @@ -0,0 +1,12 @@ +/*! Generated by Font Squirrel (https://www.fontsquirrel.com) on July 24, 2020 */ + + + +@font-face { + font-family: 'saira_condensedregular'; + src: url('sairacondensed-regular-webfont.woff2') format('woff2'), + url('sairacondensed-regular-webfont.woff') format('woff'); + font-weight: normal; + font-style: normal; + +} \ No newline at end of file diff --git a/WebServer/Fonts/Saira-Condensed.woff2 b/WebServer/Fonts/Saira-Condensed.woff2 new file mode 100644 index 000000000..8a7ff57d0 Binary files /dev/null and b/WebServer/Fonts/Saira-Condensed.woff2 differ diff --git a/WebServer/Fonts/Saira.woff2 b/WebServer/Fonts/Saira.woff2 new file mode 100644 index 000000000..5c1b242e1 Binary files /dev/null and b/WebServer/Fonts/Saira.woff2 differ diff --git a/WebServer/index.html b/WebServer/index.html index 40277d726..4ef127a80 100644 --- a/WebServer/index.html +++ b/WebServer/index.html @@ -1,45 +1,25 @@ - - + Superalgos - - - - - - - + + - - + style="overflow:hidden; background: url(Images/superalgos-platform.jpg); background-size: cover;" + onresize="onResize()">
 
- + \ No newline at end of file diff --git a/WebServer/main.css b/WebServer/main.css new file mode 100644 index 000000000..ade4c347a --- /dev/null +++ b/WebServer/main.css @@ -0,0 +1,16 @@ +/* latin */ +@font-face { + font-family: 'Saira'; + font-style: normal; + font-weight: 300; + src: local('Saira Light'), local('Saira-Light'), url(http://localhost:WEB_SERVER_PORT/Fonts/Saira.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin */ +@font-face { + font-family: 'Saira Condensed'; + font-style: normal; + font-weight: 300; + src: local('Saira Condensed Light'), local('SairaCondensed-Light'), url(http://localhost:WEB_SERVER_PORT/Fonts/Saira-Condensed.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} \ No newline at end of file diff --git a/server.js b/server.js index 4a9cf0c44..7878b134f 100644 --- a/server.js +++ b/server.js @@ -65,6 +65,8 @@ try { WEB_SERVER.initialize() WEB_SERVER.run() + console.log("You are running Superalgos Backend Beta 6.") + } catch (err) { console.log('[ERROR] BackendServers -> Task Manager -> server -> Error = ' + err.stack) } diff --git a/webServer.js b/webServer.js index a1463db4b..2506ccb84 100644 --- a/webServer.js +++ b/webServer.js @@ -83,22 +83,6 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { let requestParameters = request.url.split('/') - if (requestParameters[1].indexOf('index.html') >= 0) { - /* - We use this to solve the problem when someone is arriving to the site with a sessionToken in the queryString. We extract here that - token, that will be sent later embedded into the HTML code, so that it can enter into the stardard circuit where any site can put - the sessionToken into their HTML code and from there the Browser app will log the user in. - */ - - let queryString = requestParameters[1].split('?') - - requestParameters[1] = '' - requestParameters[2] = queryString[1] - homePage() - - return - } - requestParameters = request.url.split('?') // Remove version information requestParameters = requestParameters[0].split('/') @@ -185,58 +169,19 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { case 'Webhook': { - switch (requestParameters[2]) { // switch by command - case 'Fetch-Messages': { - let exchange = requestParameters[3] - let market = requestParameters[4] - - /* Some validations */ - if (exchange === undefined) { - console.log('[WARN] webServer -> Webhook -> Fetch-Messages -> Message with no Exchange received -> messageReceived = ' + messageReceived) - respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), response) - return - } - if (market === undefined) { - console.log('[WARN] webServer -> Webhook -> Fetch-Messages -> Message with no market received -> messageReceived = ' + messageReceived) - respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), response) - return - } - - let key = exchange + '-' + market - - let webhookMessages = webhook.get(key) - if (webhookMessages === undefined) { - webhookMessages = [] - } - - respondWithContent(JSON.stringify(webhookMessages), response) - webhookMessages = [] - - webhook.set(key, webhookMessages) - break - } - case 'New-Message': { - getBody(processRequest) - - function processRequest(messageReceived) { - let timestamp = (new Date()).valueOf() - let source = requestParameters[3] - let exchange = requestParameters[4] - let market = requestParameters[5] + switch (requestParameters[2]) { // switch by command + case 'Fetch-Messages': { + let exchange = requestParameters[3] + let market = requestParameters[4] /* Some validations */ - if (source === undefined) { - console.log('[WARN] webServer -> Webhook -> New-Message -> Message with no Source received -> messageReceived = ' + messageReceived) - respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), response) - return - } if (exchange === undefined) { - console.log('[WARN] webServer -> Webhook -> New-Message -> Message with no Exchange received -> messageReceived = ' + messageReceived) + console.log('[WARN] webServer -> Webhook -> Fetch-Messages -> Message with no Exchange received -> messageReceived = ' + messageReceived) respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), response) return } if (market === undefined) { - console.log('[WARN] webServer -> Webhook -> New-Message -> Message with no market received -> messageReceived = ' + messageReceived) + console.log('[WARN] webServer -> Webhook -> Fetch-Messages -> Message with no market received -> messageReceived = ' + messageReceived) respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), response) return } @@ -248,17 +193,56 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { webhookMessages = [] } - webhookMessages.push([timestamp, source, messageReceived]) - webhook.set(key, webhookMessages) + respondWithContent(JSON.stringify(webhookMessages), response) + webhookMessages = [] - respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), response) + webhook.set(key, webhookMessages) + break + } + case 'New-Message': { + getBody(processRequest) + + function processRequest(messageReceived) { + let timestamp = (new Date()).valueOf() + let source = requestParameters[3] + let exchange = requestParameters[4] + let market = requestParameters[5] + + /* Some validations */ + if (source === undefined) { + console.log('[WARN] webServer -> Webhook -> New-Message -> Message with no Source received -> messageReceived = ' + messageReceived) + respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), response) + return + } + if (exchange === undefined) { + console.log('[WARN] webServer -> Webhook -> New-Message -> Message with no Exchange received -> messageReceived = ' + messageReceived) + respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), response) + return + } + if (market === undefined) { + console.log('[WARN] webServer -> Webhook -> New-Message -> Message with no market received -> messageReceived = ' + messageReceived) + respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), response) + return + } + + let key = exchange + '-' + market + + let webhookMessages = webhook.get(key) + if (webhookMessages === undefined) { + webhookMessages = [] + } + + webhookMessages.push([timestamp, source, messageReceived]) + webhook.set(key, webhookMessages) + + respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), response) + } + break } - break } + break } break - } - break case 'ResetLogsAndData': { @@ -325,6 +309,12 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { } break + case 'Plotting': // This means the Plotting folder. + { + respondWithFile(process.env.PATH_TO_CANVAS_APP + '/Plotting/' + requestParameters[2], response) + } + break + case 'TopSpace': // This means the TopSpace folder. { respondWithFile(process.env.PATH_TO_CANVAS_APP + '/TopSpace/' + requestParameters[2], response) @@ -423,6 +413,12 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { } break + case 'Fonts': + { + respondWithFont(process.env.PATH_TO_FONTS + '/' + requestParameters[2], response) + } + break + case 'FloatingSpace': { respondWithFile(process.env.PATH_TO_CANVAS_APP + '/' + requestParameters[1] + '/' + requestParameters[2], response) @@ -487,7 +483,7 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { case 'ListWorkspaces': { - let dirPath = process.env.MY_WORKSPACES_PATH + let dirPath = process.env.MY_WORKSPACES_PATH try { let fs = require('fs') @@ -510,7 +506,7 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), response) return } - + } break @@ -584,12 +580,41 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { } break + case 'main.css': + { + mainCSS() + } + break + default: { homePage() } } + function mainCSS() { + let fs = require('fs') + try { + let fileName = process.env.PATH_TO_WEB_SERVER + 'WebServer/main.css' + fs.readFile(fileName, onFileRead) + + function onFileRead(err, file) { + try { + let fileContent = file.toString() + + fileContent = fileContent.replace('WEB_SERVER_PORT', process.env.WEB_SERVER_PORT) + fileContent = fileContent.replace('WEB_SERVER_PORT', process.env.WEB_SERVER_PORT) + fileContent = fileContent.replace('WEB_SERVER_PORT', process.env.WEB_SERVER_PORT) + respondWithContent(fileContent, response) + } catch (err) { + console.log('[ERROR] webServer -> mainCSS -> File Not Found: ' + fileName + ' or Error = ' + err.stack) + } + } + } catch (err) { + console.log(err) + } + } + function homePage() { if (requestParameters[1] === '') { let fs = require('fs') @@ -598,15 +623,13 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { fs.readFile(fileName, onFileRead) function onFileRead(err, file) { - if (CONSOLE_LOG === true) { console.log('[INFO] webServer -> onBrowserRequest -> onFileRead -> Entering function.') } - try { let fileContent = file.toString() fileContent = fileContent.replace('WEB_SERVER_PORT', process.env.WEB_SERVER_PORT) respondWithContent(fileContent, response) } catch (err) { - console.log('[ERROR] webServer -> onBrowserRequest -> File Not Found: ' + fileName + ' or Error = ' + err.stack) + console.log('[ERROR] webServer -> homePage -> File Not Found: ' + fileName + ' or Error = ' + err.stack) } } } catch (err) { @@ -673,8 +696,10 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { fs.readFile(fileName, onFileRead) function onFileRead(err, file) { - if (CONSOLE_LOG === true) { console.log('[INFO] webServer -> respondWithImage -> onFileRead -> Entering function.') } - + if (err) { + console.log('[ERROR] webServer -> respondWithImage -> onFileRead -> File Not Found: ' + fileName + ' or Error = ' + err.stack) + return + } try { response.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1. response.setHeader('Pragma', 'no-cache') // HTTP 1.0. @@ -692,6 +717,41 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { } } + function respondWithFont(fileName, response) { + if (CONSOLE_LOG === true) { console.log('[INFO] webServer -> respondWithBinary -> Entering function.') } + + let fs = require('fs') + try { + fs.readFile(fileName, onFileRead) + + function onFileRead(err, file) { + if (CONSOLE_LOG === true) { console.log('[INFO] webServer -> respondWithBinary -> onFileRead -> Entering function.') } + + try { + if (err) { + console.log('[ERROR] webServer -> respondWithBinary -> onFileRead -> File Not Found: ' + fileName + ' or Error = ' + err.stack) + return + } + response.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1. + response.setHeader('Pragma', 'no-cache') // HTTP 1.0. + response.setHeader('Expires', '0') // Proxies. + response.setHeader('Access-Control-Allow-Origin', '*') // Allows to access data from other domains. + + if (fileName.indexOf('2') < 0) { + response.writeHead(200, { 'Content-Type': 'font/woff' }) + } else { + response.writeHead(200, { 'Content-Type': 'font/woff2' }) + } + response.end(file, 'binary') + } catch (err) { + console.log('[ERROR] webServer -> respondWithBinary -> onFileRead -> File Not Found: ' + fileName + ' or Error = ' + err.stack) + } + } + } catch (err) { + console.log('[ERROR] webServer -> respondWithBinary -> err = ' + err.stack) + } + } + function returnEmptyArray(response) { try { if (CONSOLE_LOG === true) { console.log('[INFO] webServer -> respondWithFile -> returnEmptyArray -> Entering function.') }