Improving Windows support. #2

Merged
Offray merged 2 commits from Windows into master 2020-12-18 18:54:40 +00:00
14 changed files with 698 additions and 1674 deletions
Showing only changes of commit 1044fb4997 - Show all commits

View File

@ -1,31 +0,0 @@
Class {
#name : #BreaDataSource,
#superclass : #Object,
#instVars : [
'source',
'queries'
],
#category : #Brea
}
{ #category : #accessing }
BreaDataSource >> queries [
^ queries
]
{ #category : #accessing }
BreaDataSource >> queries: anObject [
queries := anObject
]
{ #category : #accessing }
BreaDataSource >> source [
^ source
]
{ #category : #accessing }
BreaDataSource >> source: aDictionary [
"Key, value pair in aDictionary contain a short name and a url pointing to a local or a remote
resource. If is local a FileLocator should be provided."
source := aDictionary
]

View File

@ -43,6 +43,13 @@ BreaFile >> contents [
(self name endsWith: '.json') ifTrue: [ ^ NeoJSONObject fromString: file contents ] (self name endsWith: '.json') ifTrue: [ ^ NeoJSONObject fromString: file contents ]
] ]
{ #category : #accessing }
BreaFile >> file [
self folder ifNil: [ ^ self ].
self name ifNil: [ ^ self ].
^ self folder / self name.
]
{ #category : #accessing } { #category : #accessing }
BreaFile >> folder [ BreaFile >> folder [
^ folder ^ folder
@ -57,7 +64,7 @@ BreaFile >> folder: anObject [
BreaFile >> metadata [ BreaFile >> metadata [
self name ifNil: [ ^ nil ]. self name ifNil: [ ^ nil ].
(self name endsWith: '.md') ifTrue: [ ^ self contents metadata ]. (self name endsWith: '.md') ifTrue: [ ^ self contents metadata ].
(self name endsWith: '.json') ifTrue: [ ^ self contents ]. (self name endsWith: '.json') ifTrue: [ ^ self contents asDictionary ].
] ]
{ #category : #accessing } { #category : #accessing }

View File

@ -1,489 +0,0 @@
"
I model a member of a Brea site, usually a human.
"
Class {
#name : #BreaMember,
#superclass : #Object,
#instVars : [
'givenName',
'familyName',
'picture',
'country',
'tags',
'email',
'password',
'webPresence',
'organizations'
],
#category : #Brea
}
{ #category : #converting }
BreaMember >> asStonModified [
"asSton is generated a core dumped now. This renaming is trying to solve that. Maybe
in the offical release it will be solved"
^ STON toStringPretty: self
]
{ #category : #accessing }
BreaMember >> country [
^ country
]
{ #category : #accessing }
BreaMember >> country: anObject [
country := anObject
]
{ #category : #public }
BreaMember >> countryTemplate [
^ '{{#country}}
<tr>
<td class="mdl-data-table__cell--non-numeric"><b>Country</b></td>
<td class="mdl-data-table__cell--non-numeric">{{.}}</td>
</tr>
{{/country}}' asMustacheTemplate value: self
]
{ #category : #helpers }
BreaMember >> createTestUser [
^ self class new
givenName: 'Test';
familyName: 'User';
country: 'Neverland';
memberOf: 'HackBo' withWebsite: 'http://hackbo.co/';
memberOf: 'mutabiT' withWebsite: 'http://mutabit.com/';
website: 'http://test.user';
twitter: '@offrayLC';
email: 'iam@test.user';
tags: 'just, a lot, of words, separated, by commas'.
]
{ #category : #accessing }
BreaMember >> email [
^ email
]
{ #category : #accessing }
BreaMember >> email: anEmailAddress [
email := (SHA1 new hashMessage: anEmailAddress) hex
]
{ #category : #accessing }
BreaMember >> facebook [
^ self webPresence facebook.
]
{ #category : #accessing }
BreaMember >> facebook: aProfileName [
aProfileName = ''
ifTrue: [ self webPresence facebook: nil ]
ifFalse: [ self webPresence facebook: aProfileName ]
]
{ #category : #public }
BreaMember >> facebookTemplate [
^ '{{#facebook}}
<tr>
<td class="mdl-data-table__cell--non-numeric">
<b>Facebook</b></td>
<td class="mdl-data-table__cell--non-numeric">
<a href="https://facebook.com/{{.}}">
{{.}}</a></td>
</tr>
{{/facebook}}' asMustacheTemplate value: self
]
{ #category : #accessing }
BreaMember >> familyName [
^ familyName
]
{ #category : #accessing }
BreaMember >> familyName: anObject [
familyName := anObject
]
{ #category : #helpers }
BreaMember >> fullName [
^ self givenName asLowercase, '-', self familyName asLowercase
]
{ #category : #accessing }
BreaMember >> getGenericProfilePicture [
"Other considered avatars where:
'https://upload.wikimedia.org/wikipedia/commons/1/1e/Default-avatar.jpg'"
self picture: 'https://www.jamf.com/jamf-nation/img/default-avatars/generic-user.png'.
^ picture
]
{ #category : #accessing }
BreaMember >> givenName [
^ givenName
]
{ #category : #accessing }
BreaMember >> givenName: anObject [
givenName := anObject
]
{ #category : #public }
BreaMember >> head [
^ '<head>', self headMeta, self headTitle, self headStyles,'</head>'
]
{ #category : #utility }
BreaMember >> headMeta [
^ '<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="description" content="A portfolio template that uses Material Design Lite.">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">'
]
{ #category : #utility }
BreaMember >> headStyles [
^ '
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:regular,bold,italic,thin,light,bolditalic,black,medium&amp;lang=en">
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.grey-pink.min.css" />
<link rel="stylesheet" href="http://mutabit.com/repos.fossil/gig/doc/tip/styles.css" />
<link rel="stylesheet" href="styles.css" />
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
'
]
{ #category : #utility }
BreaMember >> headTitle [
^ self headTitled: 'GIG: Network'
]
{ #category : #utility }
BreaMember >> headTitled: aString [
^ '<title>', aString ,'</title>'
]
{ #category : #public }
BreaMember >> html [
"I show the member profile as HTML"
^ self head, self htmlOutput
]
{ #category : #public }
BreaMember >> htmlInput [
"I capture data in a HTML Form and use it to create a new BreaMember"
^ '
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="description" content="A portfolio template that uses Material Design Lite.">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<title>Add Member | GIG Network</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:regular,bold,italic,thin,light,bolditalic,black,medium&amp;lang=en">
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.grey-pink.min.css" />
<link rel="stylesheet" href="styles.css" />
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
</head>
<body>
<div class="mdl-layout mdl-js-layout mdl-layout--fixed-header">
<div class="mdl-layout__drawer mdl-layout--small-screen-only">
<nav class="mdl-navigation mdl-typography--body-1-force-preferred-font">
<a class="mdl-navigation__link is-active" href="index.html">Portfolio</a>
<a class="mdl-navigation__link" href="blog.html">Blog</a>
<a class="mdl-navigation__link" href="about.html">About</a>
<a class="mdl-navigation__link" href="contact.html">Contact</a>
</nav>
</div>
<main class="mdl-layout__content">
<div class="mdl-grid portfolio-max-width portfolio-contact">
<div class="mdl-cell mdl-cell--12-col mdl-card mdl-shadow--4dp">
<div class="mdl-card__title">
<h2 class="mdl-card__title-text">Add new member</h2>
</div>
<div class="mdl-card__supporting-text">
<p>
Fill out the form.
The fields preceded by [*] are obligatory.
</p>
<form enctype="application/x-www-form-urlencoded" action="summit" method="POST" class="">
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
<input class="mdl-textfield__input" pattern="[A-Z,a-z, ]*" type="text" name="givenName">
<label class="mdl-textfield__label" for="givenName">[*]Given Name...</label>
<span class="mdl-textfield__error">Letters and spaces only</span>
</div>
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
<input class="mdl-textfield__input" pattern="[A-Z,a-z, ]*" type="text" name="familyName">
<label class="mdl-textfield__label" for="familyName">[*]Family Name...</label>
<span class="mdl-textfield__error">Letters and spaces only</span>
</div><br>
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
<input class="mdl-textfield__input" type="text" name="email">
<label class="mdl-textfield__label" for="email">[*]Email...</label>
</div>
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
<input class="mdl-textfield__input" pattern="[A-Z,a-z, ]*" type="text" name="country">
<label class="mdl-textfield__label" for="country">[*]Country...</label>
<span class="mdl-textfield__error">Letters and spaces only</span>
</div><br>
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
<input class="mdl-textfield__input" pattern="[A-Z,a-z, ]*" type="text" name="organizations">
<label class="mdl-textfield__label" for="organizations">
[*]Organization(s) (separated with commas)</label>
<span class="mdl-textfield__error">Letters and spaces only</span>
</div><br>
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
<input class="mdl-textfield__input" type="text" name="picture">
<label class="mdl-textfield__label" for="website">Profile picture url...</label>
</div>
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
<input class="mdl-textfield__input" type="text" name="website">
<label class="mdl-textfield__label" for="website">Personal website...</label>
</div><br>
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
<input class="mdl-textfield__input" type="text" name="twitter">
<label class="mdl-textfield__label" for="twitter">Twitter...</label>
</div>
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
<input class="mdl-textfield__input" type="text" name="facebook">
<label class="mdl-textfield__label" for="facebook">Facebook...</label>
</div><br>
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
<textarea class="mdl-textfield__input" type="text" rows="5" name="tags"></textarea>
<label class="mdl-textfield__label" for="tags">Tags (separated with commas)...</label>
</div>
<p>
<button class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect
mdl-button--accent" type="submit" value="Submit">
Submit
</button>
</p>
</form>
</div>
</div>
</div>
<footer class="mdl-mini-footer">
<div class="mdl-mini-footer__left-section">
<div class="mdl-logo">Simple portfolio website</div>
</div>
<div class="mdl-mini-footer__right-section">
<ul class="mdl-mini-footer__link-list">
<li><a href="#">Help</a></li>
<li><a href="#">Privacy & Terms</a></li>
</ul>
</div>
</footer>
</main>
</div>
<script src="https://code.getmdl.io/1.3.0/material.min.js"></script>
</body>
</html>
'
]
{ #category : #public }
BreaMember >> htmlOutput [
^ self htmlOutputTemplate asMustacheTemplate value: self
]
{ #category : #public }
BreaMember >> htmlOutputTemplate [
"I show the member profile as HTML"
^ '<div class="mdl-grid portfolio-max-width">
<div class="mdl-cell mdl-card mdl-shadow--4dp portfolio-card">
<div class="mdl-card__title">
<h2 class="mdl-card__title-text">{{givenName}} {{familyName}}</h2>
</div>
<div class="mdl-card__media">
<img class="article-image"
src="{{picture}}"
border="0" alt="">
</div>
<div class="mdl-card__supporting-text">
<table class="mdl-data-table mdl-js-data-table">
<tbody>
<tr>
<td class="mdl-data-table__cell--non-numeric"><b>Name</b></td>
<td class="mdl-data-table__cell--non-numeric">{{givenName}} {{familyName}}</td>
</tr>',
self countryTemplate,
self organizationsTemplate,
self websiteTemplate,
self twitterTemplate,
self facebookTemplate,
self tagsTemplate,
'
</tbody>
</table>
</div>
<div class="mdl-card__actions mdl-card--border">
<a class="mdl-button mdl-button--colored mdl-js-button
mdl-js-ripple-effect mdl-button--accent"
href="portfolio-example01.html">Read more</a>
</div>
</div>
</div>
'
]
{ #category : #accessing }
BreaMember >> instagram [
^ self webPresence instagram.
]
{ #category : #accessing }
BreaMember >> instagram: aProfileName [
self webPresence instagram: aProfileName
]
{ #category : #accessing }
BreaMember >> memberOf: anOrgName [
self organizations add:
(BreaOrganization new name: anOrgName)
]
{ #category : #accessing }
BreaMember >> memberOf: anOrgName withWebsite: aUrl [
self organizations add:
(BreaOrganization new
name: anOrgName;
website: aUrl)
]
{ #category : #accessing }
BreaMember >> organizations [
^ organizations ifNil: [ organizations := OrderedCollection new ]
]
{ #category : #accessing }
BreaMember >> organizations: anOrgListOrName [
anOrgListOrName splitOn: ',' do: [ :each | self memberOf: each ]
]
{ #category : #public }
BreaMember >> organizationsTemplate [
^ '
<tr>
<td class="mdl-data-table__cell--non-numeric"><b>Organization(s)</b></td>
<td class="mdl-data-table__cell--non-numeric">
{{#organizations}}
<a href="{{website}}">{{name}}</a>
{{/organizations}}
</td>
</tr>' asMustacheTemplate value: self
]
{ #category : #accessing }
BreaMember >> password [
^ password
]
{ #category : #accessing }
BreaMember >> password: anObject [
password := anObject
]
{ #category : #accessing }
BreaMember >> picture [
^ picture ifNil: [ ^ self getGenericProfilePicture ]
]
{ #category : #accessing }
BreaMember >> picture: anImageFilePath [
picture := anImageFilePath
]
{ #category : #helpers }
BreaMember >> renderTestUserAsHtml [
^ self class new createTestUser html
]
{ #category : #'server handling' }
BreaMember >> storeInto: aFileDirectory [
| folder file |
folder := (aFileDirectory asFileReference / self fullName) ensureCreateDirectory.
file := (folder / 'info.ston') ensureCreateFile.
file writeStreamDo: [:stream |
(STON writer on: stream)
newLine: String crlf;
prettyPrint: true;
nextPut: self]
]
{ #category : #accessing }
BreaMember >> tags [
^ tags
]
{ #category : #accessing }
BreaMember >> tags: anObject [
tags := anObject
]
{ #category : #public }
BreaMember >> tagsTemplate [
^ '{{#tags}}
<tr>
<td colspan="2"; style="text-align:left">
<b>Tags</b><br>
{{.}}
</td>
</tr>
{{/tags}}' asMustacheTemplate value: self
]
{ #category : #accessing }
BreaMember >> twitter [
^ self webPresence twitter.
]
{ #category : #accessing }
BreaMember >> twitter: aProfileName [
aProfileName = ''
ifTrue: [ self webPresence twitter: nil ]
ifFalse: [ self webPresence twitter: aProfileName ]
]
{ #category : #public }
BreaMember >> twitterTemplate [
^ '{{#twitter}}
<tr>
<td class="mdl-data-table__cell--non-numeric">
<b>Twitter</b></td>
<td class="mdl-data-table__cell--non-numeric">
<a href="https://twitter.com/{{.}}">
{{.}}</a></td>
</tr>
{{/twitter}}' asMustacheTemplate value: self
]
{ #category : #accessing }
BreaMember >> webPresence [
^ webPresence ifNil: [ webPresence := BreaWebPresence new ]
]
{ #category : #accessing }
BreaMember >> webPresence: anObject [
webPresence := anObject
]
{ #category : #accessing }
BreaMember >> website [
^ self webPresence website.
]
{ #category : #accessing }
BreaMember >> website: anUrl [
self webPresence website: anUrl
]
{ #category : #public }
BreaMember >> websiteTemplate [
^ '{{#website}}
<tr>
<td class="mdl-data-table__cell--non-numeric"><b>Website</b></td>
<td class="mdl-data-table__cell--non-numeric">
<a href="{{.}}">{{.}}</a>
</td>
{{/website}}' asMustacheTemplate value: self
]

View File

@ -1,8 +0,0 @@
"
A BreaMemberTest is a test class for testing the behavior of BreaMember
"
Class {
#name : #BreaMemberTest,
#superclass : #TestCase,
#category : #'Brea-Tests'
}

View File

@ -1,32 +0,0 @@
"
I store the places a BreaMember is affiliated to.
"
Class {
#name : #BreaOrganization,
#superclass : #Object,
#instVars : [
'name',
'website'
],
#category : #Brea
}
{ #category : #accessing }
BreaOrganization >> name [
^ name
]
{ #category : #accessing }
BreaOrganization >> name: anObject [
name := anObject
]
{ #category : #accessing }
BreaOrganization >> website [
^ website
]
{ #category : #accessing }
BreaOrganization >> website: anObject [
website := anObject
]

View File

@ -26,6 +26,9 @@ Class {
BreaPage >> bodyContentsAsHTML [ BreaPage >> bodyContentsAsHTML [
| sourcePage | | sourcePage |
self contentsFile ifNil: [ ^ self ]. self contentsFile ifNil: [ ^ self ].
Smalltalk os isWindows ifTrue: [
^ Pandoc markdownToHtml: self file file
].
sourcePage := FileLocator temp / 'wikiPage.md'. sourcePage := FileLocator temp / 'wikiPage.md'.
MarkupFile exportAsFileOn: sourcePage containing: self contents. MarkupFile exportAsFileOn: sourcePage containing: self contents.
^ Pandoc markdownToHtml: sourcePage ^ Pandoc markdownToHtml: sourcePage
@ -76,8 +79,10 @@ BreaPage >> exportAsHTML [
| htmlContents allActions actionsArray semaphore result | | htmlContents allActions actionsArray semaphore result |
self shortName ifNil: [ ^ self ]. self shortName ifNil: [ ^ self ].
self template ifNil: [ ^ self ]. self template ifNil: [ ^ self ].
actionsArray := { [ self populateMetadata ] future. [ self split ] future. }. actionsArray := { [ self populateMetadata ] future. }.
self bodyTag ifNotNil: [ actionsArray := actionsArray copyWith: [ self populateBodyAs: self bodyTag ] future ]. self splitters ifNotEmpty: [ actionsArray := actionsArray copyWith: [ self split ] future ].
self bodyTag ifNotNil: [
actionsArray := actionsArray copyWith: [ self populateBodyAs: self bodyTag ] future ].
allActions := TKTFuture all: actionsArray. allActions := TKTFuture all: actionsArray.
semaphore := Semaphore new. semaphore := Semaphore new.
allActions onSuccessDo: [ :values | allActions onSuccessDo: [ :values |
@ -119,7 +124,7 @@ BreaPage >> htmlContents [
{ #category : #accessing } { #category : #accessing }
BreaPage >> metadata [ BreaPage >> metadata [
^ metadata ^ metadata ifNil: [ self contentsFile metadata ]
] ]
{ #category : #accessing } { #category : #accessing }
@ -132,7 +137,7 @@ BreaPage >> metadata: aDictionary [
{ #category : #'as yet unclassified' } { #category : #'as yet unclassified' }
BreaPage >> populateBodyAs: key [ BreaPage >> populateBodyAs: key [
| allActions result semaphore | | allActions result semaphore |
"(self file isMarkdown and: [ self bodyTag isNil ]) ifTrue: [ ^ self ]".
allActions := TKTFuture all: { allActions := TKTFuture all: {
[ self bodyContentsAsHTML ] future. [ self bodyContentsAsHTML ] future.
}. }.
@ -162,6 +167,12 @@ BreaPage >> populateMetadata [
^ templateData ^ templateData
] ]
{ #category : #operation }
BreaPage >> populateTaggedBody [
self bodyTag ifNil: [ ^ self ].
^ self populateBodyAs: self bodyTag.
]
{ #category : #accessing } { #category : #accessing }
BreaPage >> shortName [ BreaPage >> shortName [
^ shortName ^ shortName
@ -176,6 +187,7 @@ BreaPage >> shortName: aString [
{ #category : #'as yet unclassified' } { #category : #'as yet unclassified' }
BreaPage >> split [ BreaPage >> split [
self splitters ifEmpty: [ ^ self ].
self splitters keysAndValuesDo: [ :key :value | self split: key with: value ]. self splitters keysAndValuesDo: [ :key :value | self split: key with: value ].
] ]

View File

@ -1,89 +0,0 @@
"
I define a [Mustache][1] template and how it is used to create
derivate output files combining it with particular data sources.
[1]: https://mustache.github.io/
"
Class {
#name : #BreaTemplate,
#superclass : #Object,
#instVars : [
'template',
'data',
'location',
'queries',
'outputs'
],
#category : #Brea
}
{ #category : #adding }
BreaTemplate >> addDataSourceNamed: name with: source [
self
data at: name put: source.
self data.
]
{ #category : #accessing }
BreaTemplate >> data [
^ data ifNil: [ data := Dictionary new ]
]
{ #category : #accessing }
BreaTemplate >> data: aDictionary [
"Each item in the dictionary is a unique alias (as key) and a data location (as value),
usually on the web.
Alias and locations are used later to define data queries to feed into templates."
data := aDictionary
]
{ #category : #accessing }
BreaTemplate >> location [
^ location
]
{ #category : #accessing }
BreaTemplate >> location: aFolderPath [
"This is the place where a template and its derivate files are located.
A shared location is an easy approach to start with and creates more explicit
relation between derived files and templates.
Eventually some re-mapping or re-routing could be used so templates and their outputs
could be further apart."
location := aFolderPath
]
{ #category : #accessing }
BreaTemplate >> outputs [
^ outputs
]
{ #category : #accessing }
BreaTemplate >> outputs: fileNamesList [
"fileNamesList contain the files which are derived from the template."
outputs := fileNamesList
]
{ #category : #accessing }
BreaTemplate >> queries [
^ queries ifNil: [ queries := Dictionary new ]
]
{ #category : #accessing }
BreaTemplate >> queries: aDictionary [
"aDictionary contains the alias for the query as key and a block that will be executed
on a particular data source, as value."
queries := aDictionary
]
{ #category : #accessing }
BreaTemplate >> template [
^ template
]
{ #category : #accessing }
BreaTemplate >> template: aFileName [
"I provide the name of the mustache base template.
The file can have any name, but by convention they end in '.mus.html' 'mus.md' and
so on."
template := aFileName
]

View File

@ -133,7 +133,7 @@ BreaTheme >> folder: anObject [
BreaTheme >> installInto: aFolder [ BreaTheme >> installInto: aFolder [
| zippedFile | | zippedFile |
self url ifNil: [ ^ self ]. self url ifNil: [ ^ self ].
zippedFile := self downloadInto: aFolder. zippedFile := self downloadInto: FileLocator temp.
(ZipArchive new readFrom: zippedFile) extractAllTo: aFolder. (ZipArchive new readFrom: zippedFile) extractAllTo: aFolder.
^ aFolder ^ aFolder
] ]

View File

@ -1,54 +0,0 @@
"
I store the common forms of web presence a BreaMember can have online.
"
Class {
#name : #BreaWebPresence,
#superclass : #Object,
#instVars : [
'website',
'twitter',
'facebook',
'instagram'
],
#category : #Brea
}
{ #category : #accessing }
BreaWebPresence >> facebook [
^ facebook
]
{ #category : #accessing }
BreaWebPresence >> facebook: anObject [
facebook := anObject
]
{ #category : #accessing }
BreaWebPresence >> instagram [
^ instagram
]
{ #category : #accessing }
BreaWebPresence >> instagram: anObject [
instagram := anObject
]
{ #category : #accessing }
BreaWebPresence >> twitter [
^ twitter
]
{ #category : #accessing }
BreaWebPresence >> twitter: anObject [
twitter := anObject
]
{ #category : #accessing }
BreaWebPresence >> website [
^ website
]
{ #category : #accessing }
BreaWebPresence >> website: anObject [
website := anObject
]

View File

@ -1,292 +0,0 @@
"
I model the fossil repository where public data is stored for the
building of this web site.
"
Class {
#name : #BreaWebsite,
#superclass : #Object,
#instVars : [
'fossilRepo',
'server',
'template',
'title'
],
#category : #Brea
}
{ #category : #utility }
BreaWebsite class >> availableTemplates [
self templates keys.
]
{ #category : #utility }
BreaWebsite class >> demoFolder [
^ FileLocator temp asFileReference / 'BreaDemo'.
]
{ #category : #example }
BreaWebsite class >> example [
"I run an example mockup of a website using Brea.
After runing me, go to:
- http://localhost:8080/demo
- http://localhost:8080/members/test
- http://localhost:8080/members/add "
self new
local: FileLocator temp asFileReference / 'BreaDemo';
template: 'portafolio';
downloadTemplate;
modifyTemplate;
start
]
{ #category : #example }
BreaWebsite class >> exampleDashboard [
"I run an example mockup of a website using Brea.
After runing me, go to: http://localhost:8080/demo "
self new
local: FileLocator temp asFileReference / 'BreaDemo';
template: 'dashboard';
downloadTemplate;
modifyTemplate;
start
]
{ #category : #'server handling' }
BreaWebsite class >> stopAll [
"I stop the server"
Teapot stopAll
]
{ #category : #utility }
BreaWebsite class >> templates [
"I provide the supported MDL templates taken from: https://getmdl.io/templates/"
^ Dictionary new
at: 'portafolio' put: 'https://code.getmdl.io/1.3.0/mdl-template-portfolio.zip';
at: 'dashboard' put: 'https://code.getmdl.io/1.3.0/mdl-template-dashboard.zip';
yourself.
]
{ #category : #utility }
BreaWebsite >> defaultTemplate [
self template
ifNil: [
self template: 'portafolio' ].
^ self template.
]
{ #category : #utility }
BreaWebsite >> downloadDefaultTemplate [
self downloadTemplateNamed: self defaultTemplate Into: self local.
]
{ #category : #utility }
BreaWebsite >> downloadDefaultTemplateInto: aDirectory [
| remoteUrl templatesFile |
aDirectory ensureDeleteAll.
aDirectory ensureCreateDirectory.
remoteUrl := self class templates at: self template.
GrafoscopioUtils
downloadingFrom: remoteUrl
withMessage: 'Downloading templates'
into: FileLocator temp asFileReference.
templatesFile := FileLocator temp asFileReference / (remoteUrl splitOn: '/') last.
ZipArchive new
readFrom: templatesFile;
extractAllTo: aDirectory
]
{ #category : #utility }
BreaWebsite >> downloadTemplate [
self downloadTemplateNamed: self template Into: self local.
]
{ #category : #utility }
BreaWebsite >> downloadTemplateNamed: aName Into: aDirectory [
"aName: String aDirectory: aFileLocation"
| remoteUrl templatesFile localDirectory |
localDirectory := aDirectory asFileReference.
localDirectory ensureDeleteAll.
localDirectory ensureCreateDirectory.
remoteUrl := self class templates at: aName.
GrafoscopioUtils
downloadingFrom: remoteUrl
withMessage: 'Downloading templates'
into: FileLocator temp asFileReference.
templatesFile := FileLocator temp asFileReference / (remoteUrl splitOn: '/') last.
ZipArchive new
readFrom: templatesFile;
extractAllTo: localDirectory
]
{ #category : #accessing }
BreaWebsite >> fossilRepo [
^ fossilRepo ifNil: [ fossilRepo := FossilRepo new ]
]
{ #category : #accessing }
BreaWebsite >> fossilRepo: aFossilRepo [
fossilRepo := aFossilRepo
]
{ #category : #utility }
BreaWebsite >> local [
^ self fossilRepo local
]
{ #category : #'server handling' }
BreaWebsite >> local: aFilePath [
"I define the local storage of the Fossil repository.
For the moment aFilePath must be an absolute "
| localSite |
aFilePath asFileReference exists
ifFalse: [
localSite := (FileLocator temp / 'breaSite') ensureCreateDirectory.
self fossilRepo local: localSite fullName ]
ifTrue: [ self fossilRepo local: aFilePath ].
]
{ #category : #'server handling' }
BreaWebsite >> local: aFilePath remote: anUrl [
"I define the local and remote storages of the Fossil repository"
self remote: anUrl.
self local: aFilePath
]
{ #category : #utility }
BreaWebsite >> modifyDashboardTemplate [
"I replace default templates with versioned files, that contains Mustache tags used
for examples."
"This part should be factorized and integrated into a single method tha modifies any
template, instead of repeated the code of modifyPortafolioTemplate."
| remoteRepoUrl files |
remoteRepoUrl := 'http://mutabit.com/repos.fossil/brea/templates/portaforlio'.
files := #('index.html' 'styles.css').
"files do: [ :file |
GrafoscopioUtils
downloadingFrom: remoteRepoUrl, 'doc/tip/', file
withMessage: 'Replacing ', file
into: self local ]"
]
{ #category : #utility }
BreaWebsite >> modifyPortafolioTemplate [
"I replace default templates with versioned files, that contains Mustache tags used
for examples."
| remoteRepoUrl files |
remoteRepoUrl := 'http://mutabit.com/repos.fossil/gig/'.
files := #('index.html' 'styles.css').
files do: [ :file |
GrafoscopioUtils
downloadingFrom: remoteRepoUrl, 'doc/tip/', file
withMessage: 'Replacing ', file
into: self local ]
]
{ #category : #utility }
BreaWebsite >> modifyTemplate [
"I replace default templates with versioned files, that contains Mustache tags used
for examples."
self template = 'portafolio' ifTrue: [ self modifyPortafolioTemplate ].
self template = 'dashboard' ifTrue: [ self modifyDashboardTemplate ]
]
{ #category : #'input processing' }
BreaWebsite >> processNewMember: request [
| member badRequest |
badRequest := [ ^ ZnResponse badRequest: request ].
(request hasEntity
and: [ request contentType matches: ZnMimeType applicationFormUrlEncoded ])
ifFalse: [ badRequest ].
member := BreaMember new
givenName: (request at: #givenName);
familyName: (request at: #familyName);
email: (request at: #email);
country: (request at: #country);
organizations: (request at: #organizations);
picture: (request at: #picture);
website: (request at: #website);
twitter: (request at: #twitter);
facebook: (request at: #facebook);
tags: (request at: #tags).
self store: member.
^ 'New member stored!'
]
{ #category : #'server handling' }
BreaWebsite >> remote: anUrl [
"I define the remote storage of the Fossil repository"
self remote: anUrl.
]
{ #category : #'server handling' }
BreaWebsite >> routes [
"I define how the website behaves accordingly to particular routes."
self server
serveStatic: 'demo' from: (self local);
GET: 'members/test' -> [ :req | BreaMember new renderTestUserAsHtml ];
GET: 'members/add' -> [ :req | BreaMember new htmlInput ];
POST: 'members/summit' -> [ :req | self processNewMember: req ]
]
{ #category : #accessing }
BreaWebsite >> server [
^ server ifNil: [ self setup ]
]
{ #category : #accessing }
BreaWebsite >> server: anObject [
server := anObject
]
{ #category : #accessing }
BreaWebsite >> setup [
^ server := Teapot
configure:
{(#port -> 8080).
(#debugMode -> true)}
]
{ #category : #'server handling' }
BreaWebsite >> start [
"I define the config and start the server"
self routes.
self server start
]
{ #category : #'server handling' }
BreaWebsite >> storageFor: anObject [
"I define the places where local storage is done for several types of objects"
anObject class = BreaMember
ifTrue: [ ^ self local asFileReference / 'members' ].
^ self
]
{ #category : #'server handling' }
BreaWebsite >> store: anObject [
"I store different kind of objects in the website repository.
For the moment I will only store BreaMembers, but as long as new
objects will emerge, I will specialize other ways of storage."
anObject storeInto: (self storageFor: anObject)
]
{ #category : #accessing }
BreaWebsite >> template [
^ template
]
{ #category : #accessing }
BreaWebsite >> template: aTemplateName [
"I define the default template to be used for the Brea website.
Available options are at self class templates."
template := aTemplateName
]
{ #category : #accessing }
BreaWebsite >> title [
^ title
]
{ #category : #accessing }
BreaWebsite >> title: anObject [
title := anObject
]