diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 9cc180f1..461535fe 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3,7 +3,7 @@ # All languages have an associated lexer for syntax highlighting. It # defaults to name.downcase, which covers most cases. # -# type - Either data, programming, markup, or nil +# type - Either data, programming, markup, prose, or nil # lexer - An explicit lexer String (defaults to name) # aliases - An Array of additional aliases (implicitly # includes name.downcase) @@ -787,8 +787,9 @@ HTML: primary_extension: .html extensions: - .htm - - .xhtml - .html.hl + - .st + - .xhtml HTML+Django: type: markup @@ -878,7 +879,7 @@ INI: - .prefs - .properties primary_extension: .ini - + Inno Setup: primary_extension: .iss lexer: Text only @@ -1017,7 +1018,7 @@ KRL: type: programming color: "#f5c800" primary_extension: .krl - + Kit: type: markup lexer: HTML @@ -1066,6 +1067,15 @@ LilyPond: extensions: - .ily +Liquid: + type: markup + lexer: Text only + primary_extension: .liquid + extensions: + - .html + - .json + - .xml + Literate Agda: type: programming group: Agda diff --git a/lib/linguist/samples.json b/lib/linguist/samples.json index 874fd829..676c2585 100644 --- a/lib/linguist/samples.json +++ b/lib/linguist/samples.json @@ -195,6 +195,10 @@ ".handlebars", ".hbs" ], + "HTML": [ + ".html", + ".st" + ], "Hy": [ ".hy" ], @@ -262,6 +266,12 @@ "LFE": [ ".lfe" ], + "Liquid": [ + ".html", + ".json", + ".liquid", + ".xml" + ], "Literate Agda": [ ".lagda" ], @@ -506,6 +516,9 @@ "Slash": [ ".sl" ], + "Smalltalk": [ + ".st" + ], "SourcePawn": [ ".sp" ], @@ -671,8 +684,8 @@ ".gemrc" ] }, - "tokens_total": 588287, - "languages_total": 706, + "tokens_total": 590357, + "languages_total": 716, "tokens": { "ABAP": { "*/**": 1, @@ -24907,6 +24920,204 @@ "": 1, "/each": 1 }, + "HTML": { + "": 2, + "HTML": 2, + "PUBLIC": 2, + "W3C": 2, + "DTD": 3, + "4": 1, + "0": 2, + "Frameset": 1, + "EN": 2, + "http": 3, + "www": 2, + "w3": 2, + "org": 2, + "TR": 2, + "REC": 1, + "html40": 1, + "frameset": 1, + "dtd": 2, + "": 2, + "": 2, + "Common_meta": 1, + "(": 14, + ")": 14, + "": 2, + "Android": 5, + "API": 7, + "Differences": 2, + "Report": 2, + "": 2, + "": 2, + "
": 10, + "class=": 22, + "Header": 1, + "

": 1, + "

": 1, + "

": 3, + "This": 1, + "document": 1, + "details": 1, + "the": 11, + "changes": 2, + "in": 4, + "framework": 2, + "API.": 3, + "It": 2, + "shows": 1, + "additions": 1, + "modifications": 1, + "and": 5, + "removals": 2, + "for": 2, + "packages": 1, + "classes": 1, + "methods": 1, + "fields.": 1, + "Each": 1, + "reference": 1, + "to": 3, + "an": 3, + "change": 2, + "includes": 1, + "a": 4, + "brief": 1, + "description": 1, + "of": 5, + "explanation": 1, + "suggested": 1, + "workaround": 1, + "where": 1, + "available.": 1, + "

": 3, + "The": 2, + "differences": 2, + "described": 1, + "this": 2, + "report": 1, + "are": 3, + "based": 1, + "comparison": 1, + "APIs": 1, + "whose": 1, + "versions": 1, + "specified": 1, + "upper": 1, + "-": 1, + "right": 1, + "corner": 1, + "page.": 1, + "compares": 1, + "newer": 1, + "older": 2, + "version": 1, + "noting": 1, + "any": 1, + "relative": 1, + "So": 1, + "example": 1, + "indicated": 1, + "no": 1, + "longer": 1, + "present": 1, + "For": 1, + "more": 1, + "information": 1, + "about": 1, + "SDK": 1, + "see": 1, + "": 8, + "href=": 9, + "target=": 3, + "product": 1, + "site": 1, + "": 8, + ".": 1, + "if": 4, + "no_delta": 1, + "

": 1, + "Congratulation": 1, + "

": 1, + "No": 1, + "were": 1, + "detected": 1, + "between": 1, + "two": 1, + "provided": 1, + "APIs.": 1, + "endif": 4, + "removed_packages": 2, + "Table": 3, + "name": 3, + "rows": 3, + "{": 3, + "it.from": 1, + "ModelElementRow": 1, + "}": 3, + "
": 3, + "added_packages": 2, + "it.to": 2, + "PackageAddedLink": 1, + "SimpleTableRow": 2, + "changed_packages": 2, + "PackageChangedLink": 1, + "
": 11, + "": 2, + "": 2, + "html": 1, + "XHTML": 1, + "1": 1, + "Transitional": 1, + "xhtml1": 2, + "transitional": 1, + "xmlns=": 1, + "": 1, + "equiv=": 1, + "content=": 1, + "Related": 2, + "Pages": 2, + "": 1, + "rel=": 1, + "type=": 1, + "": 1, + "Main": 1, + "Page": 1, + "&": 3, + "middot": 3, + ";": 3, + "Class": 2, + "Overview": 2, + "Hierarchy": 1, + "All": 1, + "Classes": 1, + "Here": 1, + "is": 1, + "list": 1, + "all": 1, + "related": 1, + "documentation": 1, + "pages": 1, + "": 1, + "": 2, + "id=": 2, + "": 4, + "": 2, + "16": 1, + "Layout": 1, + "System": 1, + "
": 4, + "": 2, + "src=": 2, + "alt=": 2, + "width=": 1, + "height=": 2, + "
": 1, + "Generated": 1, + "with": 1, + "Doxygen": 1 + }, "Hy": { ";": 4, "Fibonacci": 1, @@ -33947,6 +34158,347 @@ "info": 1, "reproduce": 1 }, + "Liquid": { + "": 1, + "version=": 2, + "encoding=": 1, + "": 1, + "xmlns": 6, + "content=": 2, + "wfw=": 1, + "dc=": 1, + "atom=": 1, + "sy=": 1, + "slash=": 1, + "": 1, + "": 4, + "xml": 2, + "lang=": 3, + "Jekyll": 6, + "Simple": 3, + "blog": 3, + "-": 17, + "aware": 3, + "static": 5, + "sites": 3, + "": 4, + "": 1, + "type=": 3, + "href=": 19, + "rel=": 3, + "": 3, + "http": 8, + "//jekyllrb.com/": 2, + "": 3, + "": 2, + "{": 119, + "site.time": 2, + "|": 39, + "date_to_rfc822": 3, + "}": 119, + "": 2, + "": 1, + "": 1, + "": 1, + "en": 1, + "US": 1, + "": 1, + "": 1, + "v": 1, + "jekyll.version": 1, + "": 1, + "": 3, + "Transform": 3, + "your": 7, + "plain": 3, + "text": 3, + "into": 3, + "websites": 3, + "and": 6, + "blogs.": 3, + "": 3, + "": 1, + "": 1, + "//jekyllrb.com/img/logo": 1, + "rss.png": 1, + "": 1, + "": 1, + "": 1, + "": 1, + "": 1, + "": 1, + "%": 58, + "for": 11, + "post": 1, + "in": 12, + "site.posts": 2, + "": 1, + "post.title": 1, + "xml_escape": 4, + "//jekyllrb.com": 2, + "post.url": 2, + "post.date": 1, + "": 1, + "post.author": 1, + "": 1, + "tag": 6, + "post.tags": 1, + "": 2, + "": 2, + "endfor": 9, + "cat": 2, + "post.categories": 1, + "": 1, + "isPermaLink=": 1, + "": 1, + "post.content": 1, + "": 1, + "": 1, + "": 1, + "
": 4, + "class=": 58, + "
": 41, + "

": 12, + "&": 10, + "nbsp": 4, + ";": 10, + "

": 12, + "
": 41, + "
": 4, + "

": 7, + "

": 7, + "No": 1, + "more": 2, + "databases": 1, + "comment": 1, + "moderation": 1, + "or": 2, + "pesky": 1, + "updates": 1, + "to": 3, + "install": 2, + "just": 1, + "": 3, + "content": 1, + "": 3, + ".": 5, + "": 18, + "How": 1, + "works": 1, + "rarr": 4, + "": 18, + "Static": 2, + "Markdown": 1, + "(": 2, + "Textile": 1, + ")": 2, + "Liquid": 1, + "HTML": 1, + "": 15, + "amp": 1, + "": 15, + "CSS": 1, + "go": 1, + "in.": 1, + "come": 1, + "out": 1, + "ready": 1, + "deployment.": 1, + "template": 1, + "guide": 1, + "Blog": 1, + "Permalinks": 1, + "categories": 1, + "pages": 1, + "posts": 1, + "custom": 2, + "layouts": 1, + "are": 3, + "all": 1, + "first": 1, + "class": 1, + "citizens": 1, + "here.": 1, + "Migrate": 1, + "

": 2, + "Get": 1, + "up": 1, + "running": 1, + "seconds": 1, + "

": 2, + "Quick": 1, + "start": 1, + "Instructions": 1, + "gem": 1, + "jekyll": 3, + "new": 1, + "my": 2, + "awesome": 3, + "site": 4, + "cd": 1, + "/my": 1, + "serve": 1, + "#": 1, + "Now": 1, + "browse": 1, + "//localhost": 1, + "": 5, + "src=": 6, + "width=": 1, + "height=": 1, + "alt=": 3, + "": 1, + "Free": 1, + "hosting": 2, + "": 1, + "with": 2, + "GitHub": 4, + "Pages": 3, + "Sick": 1, + "of": 1, + "dealing": 1, + "companies": 1, + "powered": 1, + "by": 2, + "so": 1, + "you": 1, + "can": 1, + "easily": 1, + "deploy": 1, + "using": 1, + "free": 1, + "mdash": 1, + "domain": 1, + "name": 1, + "all.": 1, + "Learn": 1, + "about": 1, + "": 1, + "html": 1, + "PUBLIC": 1, + "W3C": 1, + "DTD": 2, + "XHTML": 1, + "1": 1, + "0": 1, + "Transitional": 1, + "EN": 1, + "www": 1, + "w3": 1, + "org": 1, + "TR": 1, + "xhtml1": 2, + "transitional": 1, + "dtd": 1, + "": 1, + "xmlns=": 1, + "": 1, + "": 1, + "equiv=": 1, + "shop.name": 2, + "page_title": 1, + "global_asset_url": 5, + "stylesheet_tag": 3, + "script_tag": 5, + "shopify_asset_url": 1, + "asset_url": 2, + "content_for_header": 1, + "": 1, + "": 1, + "id=": 28, + "Skip": 1, + "navigation.": 1, + "if": 5, + "cart.item_count": 7, + "style=": 5, + "There": 1, + "pluralize": 3, + "title=": 3, + "cart": 1, + "Your": 1, + "subtotal": 1, + "is": 1, + "cart.total_price": 2, + "money": 5, + "item": 1, + "cart.items": 1, + "onMouseover=": 2, + "onMouseout=": 2, + "
": 2, + "endif": 5, + "

": 1, + "

": 1, + "onclick=": 1, + "View": 1, + "Mini": 1, + "Cart": 1, + "
": 3, + "content_for_layout": 1, + "": 5, + "tags": 1, + "collection.tags": 1, + "link_to_add_tag": 1, + "highlight_active_tag": 1, + "link_to_tag": 1, + "linklists.footer.links": 1, + "All": 1, + "prices": 1, + "shop.currency": 1, + "Powered": 1, + "Shopify": 1, + "": 1, + "": 1, + "jsonify": 1, + "

": 1, + "We": 1, + "have": 1, + "wonderful": 1, + "products": 1, + "

": 1, + "image": 1, + "product.images": 1, + "forloop.first": 1, + "else": 1, + "product.title": 1, + "Vendor": 1, + "product.vendor": 1, + "link_to_vendor": 1, + "Type": 1, + "product.type": 1, + "link_to_type": 1, + "": 1, + "product.price_min": 1, + "product.price_varies": 1, + "product.price_max": 1, + "": 1, + "
": 1, + "action=": 1, + "method=": 1, + "": 1, + "": 1, + "
": 1, + "product.description": 1, + "": 1 + }, "Literate Agda": { "documentclass": 1, "{": 35, @@ -56012,6 +56564,131 @@ "ast.eval": 1, "Env.new": 1 }, + "Smalltalk": { + "Object": 1, + "subclass": 2, + "#Philosophers": 1, + "instanceVariableNames": 1, + "classVariableNames": 1, + "poolDictionaries": 1, + "category": 1, + "Philosophers": 3, + "class": 1, + "methodsFor": 2, + "new": 4, + "self": 25, + "shouldNotImplement": 1, + "quantity": 2, + "super": 1, + "initialize": 3, + "dine": 4, + "seconds": 2, + "(": 19, + "Delay": 3, + "forSeconds": 1, + ")": 19, + "wait.": 5, + "philosophers": 2, + "do": 1, + "[": 18, + "each": 5, + "|": 18, + "terminate": 1, + "]": 18, + ".": 16, + "size": 4, + "leftFork": 6, + "n": 11, + "forks": 5, + "at": 3, + "rightFork": 6, + "ifTrue": 1, + "ifFalse": 1, + "+": 1, + "eating": 3, + "Semaphore": 2, + "new.": 2, + "-": 1, + "timesRepeat": 1, + "signal": 1, + "randy": 3, + "Random": 1, + "to": 2, + "collect": 2, + "forMutualExclusion": 1, + "philosopher": 2, + "philosopherCode": 3, + "status": 8, + "n.": 2, + "printString": 1, + "true": 2, + "whileTrue": 1, + "Transcript": 5, + "nextPutAll": 5, + ";": 8, + "nl.": 5, + "forMilliseconds": 2, + "next": 2, + "*": 2, + "critical": 1, + "signal.": 2, + "newProcess": 1, + "priority": 1, + "Processor": 1, + "userBackgroundPriority": 1, + "name": 1, + "resume": 1, + "yourself": 1, + "Koan": 1, + "TestBasic": 1, + "": 1, + "A": 1, + "collection": 1, + "of": 1, + "introductory": 1, + "tests": 2, + "testDeclarationAndAssignment": 1, + "declaration": 2, + "anotherDeclaration": 2, + "_": 1, + "expect": 10, + "fillMeIn": 10, + "toEqual": 10, + "declaration.": 1, + "anotherDeclaration.": 1, + "testEqualSignIsNotAnAssignmentOperator": 1, + "variableA": 6, + "variableB": 5, + "value": 2, + "variableB.": 2, + "testMultipleStatementsInASingleLine": 1, + "variableC": 2, + "variableA.": 1, + "variableC.": 1, + "testInequality": 1, + "testLogicalOr": 1, + "expression": 4, + "<": 2, + "expression.": 2, + "testLogicalAnd": 1, + "&": 1, + "testNot": 1, + "not.": 1, + "testSimpleChainMatches": 1, + "e": 11, + "eCtrl": 3, + "eventKey": 3, + "e.": 1, + "ctrl": 5, + "true.": 1, + "assert": 2, + "matches": 4, + "{": 4, + "}": 4, + "eCtrl.": 2, + "deny": 2, + "a": 1 + }, "SourcePawn": { "//#define": 1, "DEBUG": 2, @@ -61941,6 +62618,7 @@ "Groovy Server Pages": 91, "Haml": 4, "Handlebars": 69, + "HTML": 413, "Hy": 155, "IDL": 418, "Idris": 148, @@ -61962,6 +62640,7 @@ "Latte": 759, "Less": 39, "LFE": 1711, + "Liquid": 1234, "Literate Agda": 478, "Literate CoffeeScript": 275, "LiveScript": 123, @@ -62031,6 +62710,7 @@ "ShellSession": 233, "Shen": 3472, "Slash": 187, + "Smalltalk": 423, "SourcePawn": 2080, "SQL": 1485, "Squirrel": 130, @@ -62116,6 +62796,7 @@ "Groovy Server Pages": 4, "Haml": 1, "Handlebars": 2, + "HTML": 2, "Hy": 2, "IDL": 4, "Idris": 1, @@ -62137,6 +62818,7 @@ "Latte": 2, "Less": 1, "LFE": 4, + "Liquid": 5, "Literate Agda": 1, "Literate CoffeeScript": 1, "LiveScript": 1, @@ -62206,6 +62888,7 @@ "ShellSession": 3, "Shen": 3, "Slash": 1, + "Smalltalk": 3, "SourcePawn": 1, "SQL": 5, "Squirrel": 1, @@ -62236,5 +62919,5 @@ "YAML": 2, "Zephir": 2 }, - "md5": "9cc12f291dc1b2d049fb7696ac69c345" + "md5": "127e4abbd61c3dfa815c46752237e812" } \ No newline at end of file diff --git a/samples/HTML/ApiOverviewPage.st b/samples/HTML/ApiOverviewPage.st new file mode 100644 index 00000000..4faa1935 --- /dev/null +++ b/samples/HTML/ApiOverviewPage.st @@ -0,0 +1,60 @@ + + + +$Common_meta()$ + +Android API Differences Report + + +
+ +$Header()$ + + +
+

Android API Differences Report

+

This document details the changes in the Android framework API. It shows +additions, modifications, and removals for packages, classes, methods, and +fields. Each reference to an API change includes a brief description of the +API and an explanation of the change and suggested workaround, where available.

+ +

The differences described in this report are based a comparison of the APIs +whose versions are specified in the upper-right corner of this page. It compares a +newer "to" API to an older "from" version, noting any changes relative to the +older API. So, for example, indicated API removals are no longer present in the "to" +API.

+

For more information about the Android framework API and SDK, +see the Android product site.

+ +$if(no_delta)$ +

Congratulation!

+No differences were detected between the two provided APIs. +$endif$ + + +$if(removed_packages)$ +$Table(name="Removed Packages", rows=removed_packages:{$it.from:ModelElementRow()$})$ +
+$endif$ + + +$if(added_packages)$ +$Table(name="Added Packages", rows=added_packages:{$it.to:PackageAddedLink()$}:SimpleTableRow())$ +
+$endif$ + +$if(changed_packages)$ +$Table(name="Changed Packages", rows=changed_packages:{$it.to:PackageChangedLink()$}:SimpleTableRow())$ +
+$endif$ +
+ + +
+ + + + + + + diff --git a/samples/HTML/pages.html b/samples/HTML/pages.html new file mode 100644 index 00000000..e068e4fa --- /dev/null +++ b/samples/HTML/pages.html @@ -0,0 +1,31 @@ + + + + +Related Pages + + + +
+Main Page · +Class Overview · +Hierarchy · +All Classes +
+ + +
+
+
Related Pages
+
+
+
Here is a list of all related documentation pages:
+
+ + + diff --git a/samples/Liquid/feed.xml b/samples/Liquid/feed.xml new file mode 100644 index 00000000..edaae4a0 --- /dev/null +++ b/samples/Liquid/feed.xml @@ -0,0 +1,44 @@ + + + + Jekyll • Simple, blog-aware, static sites + + http://jekyllrb.com/ + {{ site.time | date_to_rfc822 }} + {{ site.time | date_to_rfc822 }} + en-US + Jekyll v{{ jekyll.version }} + Transform your plain text into static websites and blogs. + + Transform your plain text into static websites and blogs. + http://jekyllrb.com/img/logo-rss.png + Jekyll • Simple, blog-aware, static sites + http://jekyllrb.com/ + 144 + 73 + + {% for post in site.posts %} + + {{ post.title | xml_escape}} + http://jekyllrb.com{{ post.url }} + {{ post.date | date_to_rfc822 }} + {{ post.author }} + {% for tag in post.tags %} + {{ tag | xml_escape }} + {% endfor %} + {% for cat in post.categories %} + {{ cat | xml_escape }} + {% endfor %} + http://jekyllrb.com{{ post.url }} + {{ post.content | xml_escape }} + + {% endfor %} + + \ No newline at end of file diff --git a/samples/Liquid/jekyll.html b/samples/Liquid/jekyll.html new file mode 100644 index 00000000..fba31c3d --- /dev/null +++ b/samples/Liquid/jekyll.html @@ -0,0 +1,84 @@ +
+
+
+

Transform your plain text into static websites and blogs.

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

Get up and running in seconds.

+
+
+

Quick-start Instructions

+
+

+ ~ + $ + gem install jekyll +

+

+ ~ + $ + jekyll new my-awesome-site +

+

+ ~ + $ + cd my-awesome-site +

+

+ ~/my-awesome-site + $ + jekyll serve +

+

+ # => Now browse to http://localhost:4000 +

+
+
+
+
+
+
+
+
+
+
+ Free Jekyll hosting on GitHub Pages +
+

Free hosting with GitHub Pages

+

Sick of dealing with hosting companies? GitHub Pages are powered by Jekyll, so you can easily deploy your site using GitHub for free—custom domain name and all.

+ Learn more about GitHub Pages → +
+
+
+
+
+
+
\ No newline at end of file diff --git a/samples/Liquid/layout.liquid b/samples/Liquid/layout.liquid new file mode 100644 index 00000000..7954c7ec --- /dev/null +++ b/samples/Liquid/layout.liquid @@ -0,0 +1,104 @@ + + + + + + {{shop.name}} - {{page_title}} + + {{ 'textile.css' | global_asset_url | stylesheet_tag }} + {{ 'lightbox/v204/lightbox.css' | global_asset_url | stylesheet_tag }} + + {{ 'prototype/1.6/prototype.js' | global_asset_url | script_tag }} + {{ 'scriptaculous/1.8.2/scriptaculous.js' | global_asset_url | script_tag }} + {{ 'lightbox/v204/lightbox.js' | global_asset_url | script_tag }} + {{ 'option_selection.js' | shopify_asset_url | script_tag }} + + {{ 'layout.css' | asset_url | stylesheet_tag }} + {{ 'shop.js' | asset_url | script_tag }} + + {{ content_for_header }} + + + + +

Skip to navigation.

+ + {% if cart.item_count > 0 %} + + {% endif %} + +
+ +
+
+ +
+
+ {{ content_for_layout }} +
+
+ +
+
+ + + + {% if tags %} + + {% endif %} + + + +
+ +

+ + + +
+
+ +
+ + + + diff --git a/samples/Liquid/posts.json b/samples/Liquid/posts.json new file mode 100644 index 00000000..9633fd93 --- /dev/null +++ b/samples/Liquid/posts.json @@ -0,0 +1 @@ +{{ site.posts | jsonify }} diff --git a/samples/Liquid/template.liquid b/samples/Liquid/template.liquid new file mode 100644 index 00000000..5502c2e7 --- /dev/null +++ b/samples/Liquid/template.liquid @@ -0,0 +1,70 @@ +

We have wonderful products!

+ diff --git a/samples/Smalltalk/Dinner.st b/samples/Smalltalk/Dinner.st new file mode 100644 index 00000000..9304cbc0 --- /dev/null +++ b/samples/Smalltalk/Dinner.st @@ -0,0 +1,111 @@ +"====================================================================== +| +| Smalltalk dining philosophers +| +| + ======================================================================" + + +"====================================================================== +| +| Copyright 1999, 2000 Free Software Foundation, Inc. +| Written by Paolo Bonzini. +| +| This file is part of GNU Smalltalk. +| +| GNU Smalltalk is free software; you can redistribute it and/or modify it +| under the terms of the GNU General Public License as published by the Free +| Software Foundation; either version 2, or (at your option) any later version. +| +| GNU Smalltalk is distributed in the hope that it will be useful, but WITHOUT +| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +| FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +| details. +| +| You should have received a copy of the GNU General Public License along with +| GNU Smalltalk; see the file COPYING. If not, write to the Free Software +| Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +| + ======================================================================" + + +Object subclass: #Philosophers + instanceVariableNames: 'forks philosophers randy eating' + classVariableNames: '' + poolDictionaries: '' + category: 'Examples-Processes'! + +!Philosophers class methodsFor: 'dining'! + +new + self shouldNotImplement +! + +new: quantity + ^super new initialize: quantity +! ! + +!Philosophers methodsFor: 'dining'! + +dine + self dine: 15 +! + +dine: seconds + (Delay forSeconds: seconds) wait. + philosophers do: [ :each | each terminate ]. + self initialize: self size +! + +leftFork: n + ^forks at: n +! + +rightFork: n + ^n = self size + ifTrue: [ forks at: 1 ] + ifFalse: [ forks at: n + 1 ] +! + +initialize: n + eating := Semaphore new. + n - 1 timesRepeat: [ eating signal ]. + + randy := Random new. + forks := (1 to: n) collect: [ :each | Semaphore forMutualExclusion ]. + philosophers := (1 to: n) collect: [ :each | self philosopher: each ]. +! + +philosopher: n + | philosopherCode leftFork rightFork status | + leftFork := self leftFork: n. + rightFork := self rightFork: n. + status := 'Philosopher #', n printString, ' '. + philosopherCode := [[ true ] whileTrue: [ + Transcript nextPutAll: status, 'thinks'; nl. + (Delay forMilliseconds: randy next * 2000) wait. + Transcript nextPutAll: status, 'wants to eat'; nl. + eating critical: [ "Avoid deadlock" + Transcript nextPutAll: status, 'waits for left fork'; nl. + leftFork wait. + Transcript nextPutAll: status, 'waits for right fork'; nl. + rightFork wait. + Transcript nextPutAll: status, 'eats'; nl. + (Delay forMilliseconds: randy next * 2000) wait. + leftFork signal. + rightFork signal. + ]. + ]]. + + ^(philosopherCode newProcess) + priority: Processor userBackgroundPriority; + name: status; + resume; + yourself +! + +size + ^forks size +! ! + +(Philosophers new: 5) dine! diff --git a/samples/Smalltalk/TestBasic.st b/samples/Smalltalk/TestBasic.st new file mode 100644 index 00000000..ef6244cd --- /dev/null +++ b/samples/Smalltalk/TestBasic.st @@ -0,0 +1,64 @@ +Koan subclass: TestBasic [ + + + testDeclarationAndAssignment [ + | declaration anotherDeclaration | + "You must declare variables before using them." + "Variables are separated by a single space." + + declaration _ 1. "Squeak Smalltalk way to assign value" + anotherDeclaration := 'string'. "typical way to assign value + (this will be used throughout the koans)" + + self expect: fillMeIn toEqual: declaration. + self expect: fillMeIn toEqual: anotherDeclaration. + ] + + testEqualSignIsNotAnAssignmentOperator [ + | variableA variableB value | + + variableA := variableB := 1234. "multiple assignments work" + value := variableA = variableB. "equal is not used for assignment" + + self expect: fillMeIn toEqual: (variableA = variableB). + + "#== is a message that checks if identity is equal. More about messages in the TestMessage koan." + ] + + testMultipleStatementsInASingleLine [ + | variableA variableB variableC | + + "Multiple statements are separated by periods." + variableA := 1. variableB := 2. variableC := 3. + + self expect: fillMeIn toEqual: variableA. + self expect: fillMeIn toEqual: variableB. + self expect: fillMeIn toEqual: variableC. + ] + + testInequality [ + self expect: fillMeIn toEqual: ('hello' ~= 'world'). + + "#~~ is a message that checks if identity is not equal. More about messages in the TestMessage koan." + ] + + testLogicalOr [ + | expression | + + expression := (3 > 4) | (5 < 6). + + self expect: fillMeIn toEqual: expression. + ] + + testLogicalAnd [ + | expression | + + expression := (2 > 1) & ('a' < 'b'). + + self expect: fillMeIn toEqual: expression. + ] + + testNot [ + self expect: fillMeIn toEqual: true not. + ] +] diff --git a/samples/Smalltalk/testSimpleChainMatches.st b/samples/Smalltalk/testSimpleChainMatches.st new file mode 100644 index 00000000..85ee574b --- /dev/null +++ b/samples/Smalltalk/testSimpleChainMatches.st @@ -0,0 +1,11 @@ +tests +testSimpleChainMatches + |e eCtrl | + e := self eventKey: $e. + eCtrl := self eventKey: $e ctrl: true. + + self assert: (($e ctrl, $e) matches: {eCtrl}). + self assert: ($e ctrl matches: {eCtrl. e}). + + self deny: (($e ctrl, $e) matches: {eCtrl. self eventKey: $a}). + self deny: ($e ctrl matches: {e}). \ No newline at end of file