r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[Core] Discuss core issues

Graham
20-Jul-2009
[14256x3]
caps: charset [ #"A" - #"Z" ]
non-caps: complement caps

parse "ArialBold" [ some [ copy fontname name (print fontname)  ]]
>> parse "ArialBold" [ some [ copy fontname name (repend out [ fontname 
" " ])  ]]
== true
>> out
== "Arial Bold "
close enuf ??
Ashley
20-Jul-2009
[14259]
** Script Error: name has no value
Graham
20-Jul-2009
[14260x2]
name: [ caps some non-caps ]
out: ""
cut and paste works poorly in windows :(
Ashley
20-Jul-2009
[14262x2]
and Mac ...
Thanks, that's enough for me to start with.
Graham
20-Jul-2009
[14264]
>> parse next s: "ArialBoldItalic" [ some [ some non-caps [ end | 
mark: ( insert mark #" " ) skip ]] ]
== true
>> s
== "Arial Bold Italic"
Ashley
20-Jul-2009
[14265]
Even better!
Graham
20-Jul-2009
[14266]
I'm waiting now for Ladislav's answer !
Ashley
20-Jul-2009
[14267]
In 12 bytes or less ;)
Pekr
20-Jul-2009
[14268]
not sure if correct, but:

caps: charset [ #"A" - #"Z" ]
non-caps: complement caps
s: "aaaArialBoldItalic"

parse/all s [any [mark: caps (insert mark #" ") skip | skip] end]
Ashley
20-Jul-2009
[14269]
Slight complexity, "HelveticaCY" has to parse as "Helvetica CY" not 
"Helvetica C Y"
Graham
20-Jul-2009
[14270x4]
>> parse next s: "ArialBoldItalicYY" [ some [ some non-caps [ end 
| mark: ( insert mark #" " ) 2 skip ]] ]
== true
>> s
== "Arial Bold Italic YY"
>> parse/all s: "abcArialBoldItalicsCY" [some [mark: caps (insert 
mark #" ") 2 skip | skip] end]
== true
>> s
== "abc Arial Bold Italics CY"
I think you should have 'some and not 'any as there should always 
be at least one space to be inserted.
Pekr's rule looks shorter because you don't need the non-caps
Ashley
20-Jul-2009
[14274]
'some works. The 4 variations it has to handle are:

	"Arial"
	"ArialBold"
	"ArialBoldItalic"
	"ArialCY"

so putting a 'next prior to 's seems to handle all these.
Pekr
20-Jul-2009
[14275x2]
'any will work too ...
putting 'next there serves the purpose, but is an ugly hack :-)
Graham
20-Jul-2009
[14277]
why is it a hack??
Pekr
20-Jul-2009
[14278]
you should solve it by parse and parse only - that is the challenge 
:-)
Graham
20-Jul-2009
[14279x2]
we know we only have to parse part of the string ... not all of it
I find it easier to bypass edge conditions rather than program for 
them :)
Ashley
20-Jul-2009
[14281x2]
I'm with G on this one.
Here's the finished code (which obtains REBOL compatable font names 
under Mac):

	fonts: copy []
	caps: make bitset! [#"A" - #"Z"]

 foreach file compose [(read %/System/Library/Fonts/) (read %/Library/Fonts/)] 
 [
		if %.dfont = suffix? file [
			s: form first parse file "."

   parse next s [any [mark: caps (insert mark #" ") 2 skip | skip] end]
			insert tail fonts s
		]
	]
	remove-each font-name fonts: sort unique fonts [

  (size-text make face [text: "A" font: make face/font [name: font-name 
  size: 10]]) =

  size-text make face [text: "A" font: make face/font [name: font-name 
  size: 12]]
	]


(the windows func to do this is http://www.reboltech.com/library/scripts/get-fonts-windows.r
)
Pekr
20-Jul-2009
[14283]
there's no edge condition. What if the name would not begin with 
a capital letter? I would parse all string and instead of 'next I 
would use 'trim, which would tream initial space, in case first letter 
is capital :-) But if it is the rule, that the first letter is always 
being a capital, then your solution is absolutly correct ...
Ashley
20-Jul-2009
[14284]
First letter is always a capital ... except where it's a # but those 
fonts are not usable by REBOL anyway.
Graham
20-Jul-2009
[14285]
Pekr, skip can always be used as the first word in the parse rule 
if you don't like next
Graham
21-Jul-2009
[14286x2]
What's the best way of stopping an application from starting if another 
instance is already running?  The app is a core based app that is 
in a forever loop.
I guess I could always make it a View app instead, and wait on  a 
port ... and use a timer to trigger the other stuff I need to do.
Pekr
21-Jul-2009
[14288x2]
I once used lock file - you keep file openeed, and you try to delete 
that lock from the other app. If you can delete it, so create lock 
file, if not, another instance is already running. But - that works 
only under Windows, I've heard that under Linux, you can delete file, 
even if another app is using it. Dunno if true ...
You can also use TCP ports, but if you open some port, firewall will 
step-in and ask for approval ...
Graham
21-Jul-2009
[14290x2]
so, open a file and keep it open?
could try that .. seems easy enough
Pekr
21-Jul-2009
[14292x2]
yes ...
under Windows, if you open file in one process, another one can't 
delete it. Easy enough. Prevents the case, where process does not 
remove the lock, but crashes. Then you would be in locked situation. 
But if app crashes, you can remove the log. Under linux, dunno how 
to do it. One chance is e.g. the need for process to update timestamp, 
and if timestamp is not updated, then app most probably crashed, 
so you can start another instance ...
sqlab
21-Jul-2009
[14294]
open a listen port, there can only one be open
Pekr
21-Jul-2009
[14295]
sqlab ... yes, but requires firewall approval ...
Janko
21-Jul-2009
[14296]
maybe you can use rename in the same way I used it to implement simple 
locking just before in DB Chat channel
Sunanda
21-Jul-2009
[14297]
One way:

On startup:
-- check for your timestamp file

-- If it does not exist or  (it exists and timestamp is over 2 minutes 
in past), proceed to run

-- otherwise, wait 65 seconds.  Test if timestamp has changed: yes-halt; 
no-proceed

While running:

-- write the  timestamp file at least once a minute with an updated 
time

On clean closedown:
-- delete the timestamp file.

Drawbacks:

-- application could take over a minute to restart if immediately 
restarted after a crash.

-- manual deletion of timestamp file can lead to multiple instances 
running (you can minimise this by re-reading file and aborting if 
timestamp is not the last one you set)
-- all those writes of the file.
sqlab
22-Jul-2009
[14298]
Sunanda,  does your timestamp file mean a file with the timestamp 
as content or just the date and time of the file?

I have many times seen, that the timestamp of a file under windows 
does not change, although there is always data added to the file.
Graham
22-Jul-2009
[14299]
You can use set-modes to update the timestamp
Sunanda
22-Jul-2009
[14300]
sqlab -- I mean a file whose contents is just a timestamp, eg:
  write %timestamp.txt mod now/precise

In practice, the actual method is a little more convoluted (to avoid, 
for example, two instances both starting at once -- so neither sees 
a pre-existing timestamp.txt file).
Robert
22-Jul-2009
[14301]
I need to issue the combination ALT+RETURN into a string. How can 
I do this? Is there a control character for ALT like for CTRL?
ChristianE
22-Jul-2009
[14302]
AFAIK, due to multi-platform issues and various platforms not supporting 
it the ALT-key has never been utilized for the view event engine, 
hence it's probably not possible to detect the ALT-key. There's no 
/ALT refinement for the EVENT! datatype like there is /SHIFT and 
/CONTROL, so most likely there's also no control sequence for the 
ALT-key for /CORE to work with, too.
Robert
22-Jul-2009
[14303]
I tried various HEX codes I found in google but none worked. Excel 
just printed strange chars instead of doing a line-break.
Henrik
22-Jul-2009
[14304]
is alt+return really a char?
Pekr
22-Jul-2009
[14305]
IIRC, Alt is supported under View. What might not be supported is 
combination of some keys, e.g. ctrl + tab, so you can't tab between 
the tabs in an OS compatible manner. It would require some tricks 
to register for such events. Dunno if Alt + Enter should work or 
not ...