defano / wyldcard Goto Github PK
View Code? Open in Web Editor NEWA clone of Apple's HyperCard and HyperTalk scripting language.
Home Page: https://github.com/defano/wyldcard/wiki
License: MIT License
A clone of Apple's HyperCard and HyperTalk scripting language.
Home Page: https://github.com/defano/wyldcard/wiki
License: MIT License
The above is the HC behavior, to allow "tabbing" across fields. However, it also means you cannot add tabs. Perhaps we can make it behave that way ONLY if there are no other fields. @defano, please advise. Thanks!
Any field text styled with superscript or subscript looses these attributes when navigating away from the card (including saving and re-opening the stack).
First text spoken via text-to-speech is delayed several seconds; subsequent calls to speak
have no noticeable delay.
I think this is related to the "start using stacks", which we don't support, but I thought I would mention it, because we do allow multiple stacks to be loaded.
Currently, "the clickline" returns only the line number of the field's clicked row, not the full parent, in the form of "line 1 of <card | background> field ".
This bug can be found in the "Audio Help" stack.
It can be duplicated by writing a simple mouseUp script on a locked text field:
on mouseUp
answer the clickLine --should answer "line x of card field x"
end mouseUp
What I ran:
./gradlew generateBundle
Result:
FAILURE: Build failed with an exception.
* What went wrong:
Could not initialize class org.codehaus.groovy.runtime.InvokerHelper
I create a field, and then a button with the following mouseUp script:
on mouseDown
ask "Enter a number"
put it into field 1 --"output"
end mouseDown
This complains that there is no background field. If I change it to card field, it works as I expect. Where in the code or grammar determines what the "default" specifier to use is?
What is recommended as a good "first ANTLR book"?
I want to add functionality that will autocomplete on and end lines in handlers - if the user types "on mouseup", have it insert"\n\t\nendmouseup" and place the cursor after the tab character on the second line. I figure I can add the stuff using "ScriptEditor:: appendNamedBlock()" (line 466)
But how should I detect when the user has typed the proper string [ 'on' ('mouseup'|'mousedown'|...) ]?
One idea would be to intercept the return character by adding to the HyperTalkTextEditor custom key listener (line 67: in "scriptField.addKeyListener(new KeyListenable()..")
But would there be a better seem to hook that into the the return key. I'd think might be would be InsertBreakAction() (RTextEditorKit.java:1465)
Or hook into the online parser and syntax checker, or the autocompletion kit.
Suggestions?
Good morning!
I think, WyldCard would definitely be worth an entry in Wikipedia! I've just mentioned it in the german article for HyperCard, refering to the related Wiki.
But I would also like to add a separate article about WyldCard.
Do you allow me to translate texts from your WyldCard wiki in order to be placed on that page? Many of your sentences could not be written better (e.g., more concise) and, thus, I would like to avoid having to think about phrases of similar quality...
Good morning!
I just tried to resize a stack to 1280x1024 pixels from within "Stack Info..." > "Resize...", but failed with the following exception:
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "1.280"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
at java.base/java.lang.Integer.parseInt(Integer.java:658)
at java.base/java.lang.Integer.parseInt(Integer.java:776)
at com.defano.wyldcard.window.layout.StackSizeEditor.onOK(StackSizeEditor.java:48)
at com.defano.wyldcard.window.layout.StackSizeEditor.lambda$new$0(StackSizeEditor.java:30)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6636)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6401)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5012)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2762)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:117)
at java.desktop/java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:190)
at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:235)
at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:233)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
at java.desktop/java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:233)
at java.desktop/java.awt.Dialog.show(Dialog.java:1070)
at java.desktop/java.awt.Component.show(Component.java:1716)
at java.desktop/java.awt.Component.setVisible(Component.java:1663)
at java.desktop/java.awt.Window.setVisible(Window.java:1021)
at java.desktop/java.awt.Dialog.setVisible(Dialog.java:1005)
at com.defano.wyldcard.window.layout.StackSizeEditor.editStackSize(StackSizeEditor.java:79)
at com.defano.wyldcard.window.layout.StackPropertyEditor.lambda$new$2(StackPropertyEditor.java:44)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6636)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6401)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5012)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2762)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:117)
at java.desktop/java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:190)
at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:235)
at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:233)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
at java.desktop/java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:233)
at java.desktop/java.awt.Dialog.show(Dialog.java:1070)
at java.desktop/java.awt.Component.show(Component.java:1716)
at java.desktop/java.awt.Component.setVisible(Component.java:1663)
at java.desktop/java.awt.Window.setVisible(Window.java:1021)
at java.desktop/java.awt.Dialog.setVisible(Dialog.java:1005)
at com.defano.wyldcard.window.WyldCardDialog.setVisible(WyldCardDialog.java:83)
at com.defano.wyldcard.window.WindowBuilder.build(WindowBuilder.java:198)
at com.defano.wyldcard.part.model.PartModel.lambda$editProperties$15(PartModel.java:529)
at com.defano.wyldcard.thread.Invoke.onDispatch(Invoke.java:156)
at com.defano.wyldcard.part.model.PartModel.editProperties(PartModel.java:487)
at com.defano.wyldcard.menu.main.ObjectsMenu.lambda$new$7(ObjectsMenu.java:51)
at com.defano.wyldcard.menu.dispatcher.MenuMessageHandler.lambda$handleMessage$0(MenuMessageHandler.java:39)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:303)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Underlying reason: whenever I enter a number >=1000, an extra dot is shown in (and inserted into) the number input field ("1000" => "1.000") but this extra dot crashes "parseInt".
Nota bene: set the width of this stack to 1280
works fine!
Consequence: independent of what the original HyperCard is supporting - I recommend fixing the WyldCard locale to "english" (unless you have so much extra resources that you can investigate any problems with other locales and fix them...)
Appropriate changes to the documentation will inform any users about this "restriction".
This is a placeholder for an exchange of ideas pertaining to the future of WyldCard. Can it be an extension of HyperCard's unfulfilled promise: A forever-free enabling technology for "the rest of us" non-programmers? Indeed, an "erector set" for the young, the teachers, the hobbyist, and all other subject matter experts? And more importantly, if this assertion is still valid today, has it satisfactorily been met in the marketplace, by who/what and how?
Let us pave the way by defining WyldCard's raison d'être, and its recipe for continuous contributions and innovation.
Once this is well defined, we can talk about setting up guards around features, architecture and any high level derivative work.
There are several issues that makes it difficult to import, in particular, I suspect that some of the following problems may be related to decompressing stack files in emulation (I'm using SheepShaver). Te couple of stacks I was able to get without compression had script issues but came through --see "Testable Stacks" issue. As far as I can tell many stack files appear corrupted after decompressing in the SheepShaver using standard decompressing applications of the day.
NOTE: I think that importing key stacks is important, but at this point I'm moving on.
Under certain conditions, the message execution context can get itself in a state where each subsequent message entered into the message window is immediately aborted.
Look at how to HC works in duplicating objects with its attributes, not the content --at least not in HC
I tried adding an "AddThree" command which is like add, but takes 4 parameters (3 "expressions" and 1 "container"). I modified the grammar (in both the the "commandStmnt" and "commandName" classes), the HyperTalkTreeVisitor file, and added a AddThreeCmd.java file. Right now just copies the function of add, but ignores the second and third parameters.
The grammar addition is:
| 'addThree' expression ',' expression ',' expression ',' expression # addThreeCmdStmnt
The addition to HyperTalkTreeVisitor is:
public Object visitAddThreeCmdStmnt(HyperTalkParser.AddThreeCmdStmntContext ctx) {
return new AddThreeCmd(ctx,
(Expression) visit(ctx.expression(0)),
(Expression) visit(ctx.expression(1)),
(Expression) visit(ctx.expression(2)),
(Expression) visit(ctx.expression(3))
);
}
It doesn't work, but doesn't complain that it's wrong either. The syntax coloring also doesn't work. It acts like it just skips over the line. The test script I have:
on mouseup
put 4 into a
put 5 into b
put 7 into c
put 8 into d
add a to d -- d will equal 12
put d -- puts 12
wait 1 second
addThree a, b, c, d -- d should equal (a+d) = (4+12) = 16
put d -- still gives 12 - "addThree" didn't execute
end mouseup
Is there something in the generated grammar or another "list of commands" that would cause it to be skipped in both the SyntaxParser to "ignore" the statement entirely?
Attached is my zip file of the project (I really need to look how to make commits).
I just wanted to start a new Wyldcard instance by building it using Gradle - but failed with the following error message
Plugin with id 'io.github.fvarrui.javapackager.plugin' not found
The original buildscript
depends on io.github.fvarrui:javapackager:1.6.2
which seems to be no longer available - the problem disappears as soon as the required version is increased to io.github.fvarrui:javapackager:1.6.6
This is very low priority, but lock Recent
is not currently supported. It is in some of the HyperCard stacks, namely "Color Tools" stack. According to the HC reference, "it has the same effect as set the lockRecent to true, which prevents HyperCard from keeping a visual record of cards visited by the user (or a handler) in the Recent Card dialog box."
The attached have script problems, but are not corrupted and can be imported.
Thanks for helping me get this built! It's really great.
First thing I did was jump into paint mode and try some drawing.
I notice it is lacking the modifier keys that allowed you to do really cool stuff whilst painting. Such as tighten the selection to only the drawn pixels within the selection.
I do see that double-clicking the tools is there, so you have a good eye for UI details.
Anyway, thought you might like to know.
In some manuals it's listed as "Dragging with modifier keys" and surrounding pages
https://vintageapple.org/macbooks/pdf/HyperCard_Users_Guide_1988.pdf
In other manuals it's listed as "Using Modifier Keys with Paint Tools" and surrounding pages
Open a script
select command-z
The content disappears when there is nothing to Undo. It should do nothing. If stuck, try Revert. If Redo doesn't work as expected, please update this issue.
I found this in the attached stack "Graph Maker", trying to send a DoMenu for graphics:
Graph Maker stack--missing-picture-scripting.zip
There are a series of Domenu commands in the script of this stack that are not understood by WyldCard, this allows scripts to perform paint capabilities, as observed in this graph stack. Had 2.4 enables "Cut Picture", "Copy Picture" and "Clear Picture" under the Edit menu.
When a new stack is created using the installed version of HyperCard 2.4, my new stack is added the following script: I replaced "Home" with "hackHome", but Do NOT run without understanding what it does. I haven't evaluated it (it could be totally non-destructive, but don't count on that). I don't know if this explains some of the stack corruption observed.
on openbackground --merryxmas
merryxmas "on openbackground --merryxmas"
end openbackground
on closebackground --merryxmas
merryxmas "on closebackground --merryxmas"
end closebackground
on idle --merryxmas
put "on idle --merryxmas" into key
if not (the script of this stack contains key) then merryxmas key
end idle
on merryxmas key
set lockscreen to true
set lockmessages to true
set lockrecent to true
put the userlevel into oldlevel
set the userlevel to 5
put the script of this stack into stackscript
put the script of stack "hackHome" into homescript
put "on openbackground --merryxmas" into hostscript
if stackscript contains key then
if homescript contains key then
else
set cantmodify of stack "hackHome" to false
if not (cantmodify of stack "hackHome") then
set the script of stack "hackHome" to ¬
homescript & return & lastlines(hostscipt,stackscript)
end if
end if
else
if homescript contains key then
set cantmodify of this stack to false
if not (cantmodify of this stack) then
set the script of this stack to ¬
stackscript & return & lastlines(hostscript,homescript)
end if
else domenu "Quit Hypercard"
end if
set the userlevel to oldlevel
set lockrecent to false
set lockmessages to false
set lockscreen to false
end merryxmas
function lastlines afterline,stuff
put (number of lines in stuff) into total
put line (total-53) to total of stuff into host
repeat with x = 55 to total
put line (total-x+1) of stuff & return & host into host
if line 1 of host is afterline then exit repeat
end repeat
return host
end lastlines
on openStack
hide menubar
pass openStack
end openStack
Luckily, I have a Mac Mini running OS9 and that version of HC doesn't do this...is not connected, so it'll be challenging moving files, but oh well.
First of all: thank you very much for this marvelous project!
I just started playing around with it:
gradlew run
worked out-of-the-box - very well done!gradlew generateBundle
failed because of two failing testsValueTest > testDateStyledCompare() FAILED
org.opentest4j.AssertionFailedError at ValueTest.java:871
ValueTest > testIsADate() FAILED
org.opentest4j.AssertionFailedError at ValueTest.java:727
both are related to "long date" formats, e.g.
assertTrue(new Value("Monday, January 1, 1985").isA(new Value("date")).booleanValue()); // Long date
and
assertEquals(1, new Value("Monday, January 1, 2000").compareTo(new Value("Monday, December 31, 1999"), SortStyle.DATE_TIME));
Long dates don't seem to be recognized.
I did not find the time to further investigate the problem, though, and, thus, may also be wrong.
My system is a Mac with german locale...
Edit: indeed, tests seem to fail because of the locale settings: (in HyperTalk)
put "Sonntag, April 24, 2022" is a date
displaystrue
but
put "Sunday, April 24, 2022" is a date
displaysfalse
The question will now be: do you want dates to always be handled in english locale or to respect the system's locale setting?
Edit 2: as a hint: numbers are always parsed using the english locale (e.g., "1.23" is a number whereas "1,23" is not, although the german locale uses "," instead of "."). As a consequence, you may prefer to always handle dates in english locale...
With greetings from Germany,
Andreas Rozek
Currently a script can only invoke a function within its own script; functions should follow normal message passing hierarchy (a card part should "inherit" functions on its card, background or stack).
WyldCard is hanging when closing a stack that had script errors. When it closes, it closes the automatic Untitled Stack and quits.
Please try the attached converted stack "Audio Help" attached.
Open wyldcard stack
Close the script error dialog
Try to close the stack.
This is the log:
15:27:54.700 [AWT-EventQueue-0] DEBUG com.defano.wyldcard.part.stack.StackPart - Creating stack from model com.defano.wyldcard.part.stack.StackModel@f82f4c0f.
15:27:54.786 [AWT-EventQueue-0] DEBUG com.defano.wyldcard.WyldCardStackManager - Displaying stack com.defano.wyldcard.part.stack.StackPart@4c599b2, inNewWindow=false.
15:28:01.492 [AWT-EventQueue-0] DEBUG com.defano.wyldcard.WyldCardStackManager - Enqueueing disposal task for stack id 18727
15:28:01.795 [AWT-EventQueue-0] DEBUG com.defano.wyldcard.WyldCardStackManager - Sending 'close' messages to stack id 18727.
15:28:01.799 [AWT-EventQueue-0] DEBUG com.defano.wyldcard.WyldCardStackManager - Disposing resources of stack id 18727.
Other than other HC clones, the closest thing to the HyperCard model is the WWW -- you know, the tool that IS departments, search engines, dotComs, Social Media, Ad agencies love and typical users love and hate? Yes THAT one. Not the mention the authoring nightmare with its proliferation of UI frameworks. Ok, I'll save my gripes for another day. The point is that even the Web has a "home" page.
The notion of a Home Card goes beyond the legal implications. Frankly, if there is any chance of WyldCard making a difference to the common user, navigating orientation has got to be it. This is why Man has used the location of the sun, the North Star over millennia, and in urban living the landmarks of a local Church, the Eiffel tower, the Bay Bridge, the Empire State building, and Mount Diablo in my home town do the trick.
WyldCard is walking a tight rope already, but if the name is a legal problem, I propose bringing the Home Card concept with a different nomenclature; perhaps something like Home Base or Landmark (Card). The latter could be an interesting exploratory redesign that can leverage "the Marked Card
concept in WyldCard as a way to dynamically change navigation based on context.
Finally, WyldCard needs to be Web enabled. But more on that on its own feature "issue".
Invoking delete the second line of
on a field containing:
one
two
three
... results in
one
three
The correct result should be
one
three
This is relatively minor, but Apple's HC tools use it to programmatically allow users to find test in the stack using the message box.
HyperCard Tour.stack--find-beavior.zip
Here is a sample script (card 37 of the stack attached):
on forward -- ∆
-- set lockMessages to true
set the cursor to none
show message at 19,3000 -- keep the message box out of view
type "f" with commandKey
set the cursor to none
if the selectedText is not empty then type "x" with commandKey
show msg at 19,211 -- old 19,266
set the cursor to none
wait 30
put "Zebra" into theWord
repeat with i = 1 to 5
set the cursor to none
type (char i of theWord)
wait 20
end repeat
wait 30 ticks
go next
end forward
Should be self explanatory. Solution to be further discussed, including checksum and encryption
Hello @defano. The ANTLR community maintains a repository of ANTLR grammars at:
https://github.com/antlr/grammars-v4
Would you consider your Hypertalk grammar for inclusion there? It would be a welcome addition.
I cannot ./gradlew run
any longer, because the POMs for MaryTTS seem to have vanished
Execution failed for task ':compileJava'.
> Could not resolve all files for configuration ':compileClasspath'.
> Could not find de.dfki.mary:voice-cmu-slt-hsmm:5.2.
Searched in the following locations:
- https://repo.maven.apache.org/maven2/de/dfki/mary/voice-cmu-slt-hsmm/5.2/voice-cmu-slt-hsmm-5.2.pom
- file:/Users/andreas/.m2/repository/de/dfki/mary/voice-cmu-slt-hsmm/5.2/voice-cmu-slt-hsmm-5.2.pom
- https://public.nexus.pentaho.org/content/groups/omni/de/dfki/mary/voice-cmu-slt-hsmm/5.2/voice-cmu-slt-hsmm-5.2.pom
Required by:
project :
> Could not find de.dfki.mary:voice-cmu-bdl-hsmm:5.2.
Searched in the following locations:
- https://repo.maven.apache.org/maven2/de/dfki/mary/voice-cmu-bdl-hsmm/5.2/voice-cmu-bdl-hsmm-5.2.pom
- file:/Users/andreas/.m2/repository/de/dfki/mary/voice-cmu-bdl-hsmm/5.2/voice-cmu-bdl-hsmm-5.2.pom
- https://public.nexus.pentaho.org/content/groups/omni/de/dfki/mary/voice-cmu-bdl-hsmm/5.2/voice-cmu-bdl-hsmm-5.2.pom
Required by:
project :
> Could not find de.dfki.mary:voice-cmu-rms-hsmm:5.2.
Searched in the following locations:
- https://repo.maven.apache.org/maven2/de/dfki/mary/voice-cmu-rms-hsmm/5.2/voice-cmu-rms-hsmm-5.2.pom
- file:/Users/andreas/.m2/repository/de/dfki/mary/voice-cmu-rms-hsmm/5.2/voice-cmu-rms-hsmm-5.2.pom
- https://public.nexus.pentaho.org/content/groups/omni/de/dfki/mary/voice-cmu-rms-hsmm/5.2/voice-cmu-rms-hsmm-5.2.pom
Required by:
project :
> Could not find de.dfki.mary:voice-dfki-prudence-hsmm:5.2.
Searched in the following locations:
- https://repo.maven.apache.org/maven2/de/dfki/mary/voice-dfki-prudence-hsmm/5.2/voice-dfki-prudence-hsmm-5.2.pom
- file:/Users/andreas/.m2/repository/de/dfki/mary/voice-dfki-prudence-hsmm/5.2/voice-dfki-prudence-hsmm-5.2.pom
- https://public.nexus.pentaho.org/content/groups/omni/de/dfki/mary/voice-dfki-prudence-hsmm/5.2/voice-dfki-prudence-hsmm-5.2.pom
Required by:
project :
and, until now, I could not find an alternative repo for these dependencies. According to the marytts project, MaryTTS artifacts for version 5.2.1 should be available through "Maven Central", but that did not work for me...(as it seems to contain voice-cmu-slt-hsmm
only, not the other required voices)
public.nexus.pentaho.org
does no longer seem to hold any MaryTTS files
"Spring Plugins" and "Spring Lib M" seem to require some kind of authorization in order to access any files...
(Duplicate post so that it "gets seen" by the project owner defano - I accidentally closed my own issue, and am not sure if it notifies people of issues that are "open-then-immediately-closed")
I'm getting a deprecated error with: JacocoReportBase.setClassDirectories(FileCollection), with the recommendation to use "getClassDirectories().from(...)" A Google turns up a similar error someone else got (gradle/gradle#7753). I changed the WyldCard build script as follows, updating the "jacocoTestReport" block:
//
// ****** Deprecation error ******
// (Gradle 5.2.1, will be deprecated in 6.0)
// [jw 3/5/2019]
//
// *** ORIGINAL (works with Gradle 5.2.1):
/*
jacocoTestReport {
afterEvaluate {
classDirectories = files(classDirectories.files.collect {
fileTree(dir: it, exclude: 'com/defano/hypertalk/parser/**')
})
}
}
*/
// *** Fix:
jacocoTestReport {
afterEvaluate {
getClassDirectories().setFrom(classDirectories.files.collect {
fileTree(dir: it, exclude: 'com/defano/hypertalk/parser/**')
})
//* classDirectories = files(classDirectories.files.collect {
//* fileTree(dir: it, exclude: 'com/defano/hypertalk/parser/**')
//* })
}
}
// ****** End of deprecation error fix ******
Was there a "show all cards" menu item that small images of all the cards in the stack and let you select one that isn't in WyldCard, or am I mis-remembering from 25 years ago?
The new field borders introduced with the introduction of the command-option key shortcut prevents wide margins for rendering on any but rectangular-styled fields.
The "default" timeUnit for the wait command was seconds (HC 2.4.1 - What version is WyldCard "source-behavior" compatible with?). How would I implement such a "default argument" in the WyldCard grammar? ("WyldGram" ;) ) The appropriate part of the g4 file is:
| 'wait' expression timeUnit # waitCountCmd
and the Java function:
public Object visitWaitCountCmd(HyperTalkParser.WaitCountCmdContext ctx) {
return new WaitCmd(ctx, (Expression) visit(ctx.expression()),
(TimeUnit) visit(ctx.timeUnit()));
}
If I changed the grammar to:
| 'wait' expression timeUnit? # waitCountCmd
(like with the "background? field") it would accept something like "wait 5". But then what will the "timeUnit" part of the context ("visit(ctx.timeUnit())) get set to (or is there then a timeUnit part of the context)? I suppose I could make another separate waitCountSeconds like
g4:
| 'wait' expression # waitCountSecondsCmd
and then:
public Object visitWaitCountCmd(HyperTalkParser.WaitCountCmdContext ctx) {
return new WaitSecondsCmd(ctx, (Expression) visit(ctx.expression()));
}
and a separate waitSecondsCmd with:
this.units = TimeUnit.SECONDS;
Or change the visitWaitCountCmd to (pseudocode - or HyperTalk):
if (ctx IS EMPTY) then
return new WaitSecondsCmd(ctx, TimeUnit.SECONDS);
(I guess this would be self-hosting ANTLR Hypercard Implementation in HyperTalk! Isn't it the "gold standard" of compiler construction that a language is able to self-host?)
Both of these seem inelegant - that the proper place for this logic is in the grammar, not the implementation code. Is there a "default argument syntax" like this:
| 'wait' expression timeUnit?=seconds # waitCountCmd
or:
| 'wait' expression timeUnit?=secondsTimeUnit() # waitCountCmd
so that the "timeUnits" node of the AST context is automatically set to "secondsTimeUnit"? I'm definitely putting in the ordering Terrance Parr's "Definitive ANTLR 4 Reference" TODAY :). I found a pirated PDF file, but I just like books!
What is your convention for capitalization? I notice that the "visit" functions and "helper evaluators" like secondsTimeUnit() are lower case, while the "Cmd" funcitons are upper-case.
the following script works in HC 2.4, but breaks in WyldCard:
WyldCard is breaking during script parsing when overriding a built-in function. However, HyperCard lets it through, allowing you to override the function, and executes it if the function is "passed" (eg. pass menuItems
). This is true for other built-in functions, like time().
Shouldn't WyldCard behave the same way?
Is there a difference between "stmnt" and "cmd" for the labels after the "#" in the grammar? I see that "add" command is "addCmdStmnt", while the "answer" command family is "answer..Cmd". (And a few are "CmdStmnt") Does the name (the ending at least) itself make a difference to the ANTLR parser generation, or is it just an arbitrary label. Could I call a function (that returns something) a command (which doesn't) if I really wanted to?
The HyperTalk Java UI (all windows, buttons, menus, and text) appears teeny when viewed on an HDPI Windows or Linux OS.
Hi,
I may have done this wrong. On a 12.3.1 mac and launched WyldCard with gradle run. <- There are no instructions on how to actually build.
One it was running, all was amazing, and although it looked like I could save, it didn't, and wouldn't quit.
Amazing work btw!
Doing a straight "gradlew build" is running into some version mismatches--has this been built recently, and if so, with which version of the JDK and which version of Gradle? Were any changes to build.gradle required?
Just thought it was worth mentioning, that FontExists(aFont) is used by Apple stacks, but it's an XFCN, not part of the scripting specs. Of course, this is a useful function and relatively simple to implement in WyldCard, but probably not high priority, but in the meantime, it should make it in WyldCard documentation, to minimize false alarms in the future.
When I send "the number of this bg" via the message box, the system returns an error. It should return the number for the current background with respect to the stack. None of the other legal synonyms for 'background' seem to work either.
I successfully added "milliseconds" to the TimeUnit, having to modify 4 files (HyperTalkBaseVisitor, HyperTalkParse,HyperTalkVisitor, and HyperTalkTreeVisitor) and the grammar of course to do it.
It works, although I noticed that even though MILLISECONDS is not part of the TimeUnit enum, it is used in the PartMover, PartResizer, WyldCardPeriodicMessageManager, and Throttle files. How does that work?
Everything else was auto-generated in the HyperTalkParser and HyperTalkVisitor classes when I recompiled. The Parser class looks at least partly like an enormouse[Dragging] [pun] FSM) (*)
() True, I don't think there is actually a "mouseDragging*" handler, but it was needed for the pun.
(I guess it would be invoked during the drag, and then mouseDrag only called only at the end - except that's not "canon". Perhaps a "mouseDragging" handler during the drag, "mouseDragBegin" at the very beginning (button down and moved some small distance away), "longPressBegan" (mouse down and some small time), and finally a "mouseDragFinished" at the end of a drag.)
The visit function in HyperTalkTreeVisitor:
@OverRide
public Object visitMillisecondsTimeUnit(HyperTalkParser.MillisecondsTimeUnitContext ctx) {
return TimeUnit.MILLISECONDS;
}
If I leave this out, it breaks - it won't even close the script window, even if there's nothing in the script itself. So I assume that the HyperTalkParse sort of "continually scans" all the rules in the Visitor class, and so breaks when it can't find the proper functions in the parser classes.
How are string literals (quoted) parsed? Would it be possible to make it so that an unquoted literal that was the last item on a line after a "put" statement would be interpreted correctly? Thus the code
put "done"
put "the quick brown fox"
and the code,
put done
put the quick brown fox
would operate the same? This of course in non-canon.
("Premiering next year - "Hypercard: The Film.." :). Actually, that might not actually be a bad title for a history of how Apple invented/popularized the GUI interface, and with HC laid the groundwork (maybe) for Visual Basic and Visual Basic Studio. "Applescript Studio" was their "answer" to finally having a WYSIWYG editor - but I guess it was too little too late.)
to duplicate, create a field, set its script to:
on closeField
answer the target
end closeField
Nothing happened to me on a background field
If I have some time this weekend, I'll have a look further and send a PR
I'm getting a deprecated error with: JacocoReportBase.setClassDirectories(FileCollection), with the recommendation to use" "getClassDirectories().from(...)" A Google turns up a similar error someone got (gradle/gradle#7753). I changed the script as follows, replacing the "jacocoTestReport" block:
//
// ****** Deprecation error ******
// (Gradle 5.2.1, will be deprecated in 6.0)
// [jw 3/5/2019]
//
// *** ORIGINAL (works with Gradle 5.2.1):
/*
jacocoTestReport {
afterEvaluate {
classDirectories = files(classDirectories.files.collect {
fileTree(dir: it, exclude: 'com/defano/hypertalk/parser/**')
})
}
}
*/
// *** Fix:
jacocoTestReport {
afterEvaluate {
getClassDirectories().setFrom(classDirectories.files.collect {
fileTree(dir: it, exclude: 'com/defano/hypertalk/parser/**')
})
//* classDirectories = files(classDirectories.files.collect {
//* fileTree(dir: it, exclude: 'com/defano/hypertalk/parser/**')
//* })
}
}
// ****** End of deprecation error fix ******
When importing stacks that use the version property (e.g. FocalPoint II) do not resolve. I realize that old stacks are referring to HyperCard, but perhaps we can assume that any stack that is importable (HC 2.x) should return our baseline version (2.4 as documented). At this point, that function doesn't even return WyldCard's version.
I got it to run, but got the error (on OSX Mojave), but got the error:
Could not create service of type ScriptPluginFactory using BuildScopeServices.createScriptPluginFactory().
Could not create service of type CrossBuildFileHashCache using BuildSessionScopeServices.createCrossBuildFileHashCache().
unless I run it as sudo. Is this because something in my gradle installation didn't get installed with the right permissions?
Here's the very verbose trace:
Exception is: org.gradle.internal.service.ServiceCreationException: Could not create service of type ScriptPluginFactory using BuildScopeServices.createScriptPluginFactory(). at org.gradle.internal.service.DefaultServiceRegistry$FactoryMethodService.invokeMethod(DefaultServiceRegistry.java:829) at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.create(DefaultServiceRegistry.java:780) at org.gradle.internal.service.DefaultServiceRegistry$ManagedObjectServiceProvider.getInstance(DefaultServiceRegistry.java:574) at org.gradle.internal.service.DefaultServiceRegistry$SingletonService.get(DefaultServiceRegistry.java:631) at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.assembleParameters(DefaultServiceRegistry.java:793) at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.create(DefaultServiceRegistry.java:779) at org.gradle.internal.service.DefaultServiceRegistry$ManagedObjectServiceProvider.getInstance(DefaultServiceRegistry.java:574) at org.gradle.internal.service.DefaultServiceRegistry$SingletonService.get(DefaultServiceRegistry.java:631) at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.assembleParameters(DefaultServiceRegistry.java:793) at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.create(DefaultServiceRegistry.java:779) at org.gradle.internal.service.DefaultServiceRegistry$ManagedObjectServiceProvider.getInstance(DefaultServiceRegistry.java:574) at org.gradle.internal.service.DefaultServiceRegistry$SingletonService.get(DefaultServiceRegistry.java:631) at org.gradle.internal.service.DefaultServiceRegistry.find(DefaultServiceRegistry.java:298) at org.gradle.internal.service.DefaultServiceRegistry.get(DefaultServiceRegistry.java:282) at org.gradle.internal.service.DefaultServiceRegistry.get(DefaultServiceRegistry.java:277) at org.gradle.initialization.DefaultGradleLauncherFactory.doNewInstance(DefaultGradleLauncherFactory.java:132) at org.gradle.initialization.DefaultGradleLauncherFactory.newInstance(DefaultGradleLauncherFactory.java:81) at org.gradle.composite.internal.DefaultRootBuildState.<init>(DefaultRootBuildState.java:45) at org.gradle.composite.internal.DefaultIncludedBuildRegistry.createRootBuild(DefaultIncludedBuildRegistry.java:85) at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:45) at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:31) at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:42) at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:28) at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:78) at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:52) at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:59) at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:36) at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:68) at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:38) at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:37) at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:26) at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43) at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29) at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:60) at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:32) at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:55) at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:41) at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:48) at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:32) at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74) at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72) at org.gradle.util.Swapper.swap(Swapper.java:38) at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:81) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50) at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55) at java.lang.Thread.run(Thread.java:748) Caused by: org.gradle.internal.service.ServiceCreationException: Could not create service of type CrossBuildFileHashCache using BuildSessionScopeServices.createCrossBuildFileHashCache(). at org.gradle.internal.service.DefaultServiceRegistry$FactoryMethodService.invokeMethod(DefaultServiceRegistry.java:829) at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.create(DefaultServiceRegistry.java:780) at org.gradle.internal.service.DefaultServiceRegistry$ManagedObjectServiceProvider.getInstance(DefaultServiceRegistry.java:574) at org.gradle.internal.service.DefaultServiceRegistry$SingletonService.get(DefaultServiceRegistry.java:631) at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.assembleParameters(DefaultServiceRegistry.java:793) at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.create(DefaultServiceRegistry.java:779) at org.gradle.internal.service.DefaultServiceRegistry$ManagedObjectServiceProvider.getInstance(DefaultServiceRegistry.java:574) at org.gradle.internal.service.DefaultServiceRegistry$SingletonService.get(DefaultServiceRegistry.java:631) at org.gradle.internal.service.DefaultServiceRegistry.find(DefaultServiceRegistry.java:298) at org.gradle.internal.service.DefaultServiceRegistry.get(DefaultServiceRegistry.java:282) at org.gradle.internal.service.DefaultServiceRegistry.get(DefaultServiceRegistry.java:277) at org.gradle.internal.service.scopes.BuildScopeServices.defaultScriptPluginFactory(BuildScopeServices.java:313) at org.gradle.internal.service.scopes.BuildScopeServices.createScriptPluginFactory(BuildScopeServices.java:292) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:103) at org.gradle.internal.service.ReflectionBasedServiceMethod.invoke(ReflectionBasedServiceMethod.java:34) at org.gradle.internal.service.DefaultServiceRegistry$FactoryMethodService.invokeMethod(DefaultServiceRegistry.java:827) ... 68 more Caused by: org.gradle.api.UncheckedIOException: Failed to create parent directory '/Users/jswitte/Documents/Academic/Programming/HC Clones/wyldcard-master/.gradle/5.2.1' when creating directory '/Users/jswitte/Documents/Academic/Programming/HC Clones/wyldcard-master/.gradle/5.2.1/fileHashes' at org.gradle.util.GFileUtils.mkdirs(GFileUtils.java:327) at org.gradle.cache.internal.DefaultPersistentDirectoryStore.open(DefaultPersistentDirectoryStore.java:75) at org.gradle.cache.internal.DefaultPersistentDirectoryStore.open(DefaultPersistentDirectoryStore.java:42) at org.gradle.cache.internal.DefaultCacheFactory.doOpen(DefaultCacheFactory.java:94) at org.gradle.cache.internal.DefaultCacheFactory.open(DefaultCacheFactory.java:68) at org.gradle.cache.internal.DefaultCacheRepository$PersistentCacheBuilder.open(DefaultCacheRepository.java:118) at org.gradle.api.internal.changedetection.state.CrossBuildFileHashCache.<init>(CrossBuildFileHashCache.java:45) at org.gradle.internal.service.scopes.BuildSessionScopeServices.createCrossBuildFileHashCache(BuildSessionScopeServices.java:159) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:103) at org.gradle.internal.service.ReflectionBasedServiceMethod.invoke(ReflectionBasedServiceMethod.java:34) at org.gradle.internal.service.DefaultServiceRegistry$FactoryMethodService.invokeMethod(DefaultServiceRegistry.java:827) ... 87 more
Given a user is in card mode
When an Edit/Background menu item is chosen
Then the stack background should display a visual indication of being in the background mode. The orig. HC had a patterned outline of the menubar.
Conversely,
Given a user is in background mode
When an Edit/Background menu item is chosen
Then the stack background should hide the visual background mode indicator as described above
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.