World: r3wp
[I'm new] Ask any question, and a helpful person will try to answer.
older newer | first last |
Alek_K 14-Apr-2006 [326] | But images are excluded from this :) |
Anton 14-Apr-2006 [327] | I understand you, but maybe I didn't make myself clear above. |
Alek_K 14-Apr-2006 [328x2] | Maybe I didn't :) - <img> inside <pre> are not permited (as w3c states) - but IE / Opera / Firefox displays it |
so changing src in it - is all way expected as for now | |
Anton 14-Apr-2006 [330] | Hmm... that's a strange rule. I thought that any text could be inside <pre> ... </pre> so that you could put code in. I don't claim to have a real indepth knowledge of html, though. I try to avoid it. :) |
Alek_K 14-Apr-2006 [331] | If You want to show html code in <pre> - You should use > for > and < for < |
Anton 14-Apr-2006 [332x3] | Ok, here is a version that should skip other attributes. |
page: read http://www.rebol.com images: copy [] use [whsp ws non-end-tag strd p1 p2 delim non-delim][ whsp: charset " ^-^/" ; whitespace ws: [any whsp] ; a rule for any number of whitespace characters non-end-tag: complement charset ">" ; all characters except ">" strd: charset {"'} ; string delimiters, double and single quote parse/all page [ any [ thru "<img" whsp [ any [ ws "src" ws "=" ws p1: [strd (delim: form p1/1) | (delim: ">")] (non-delim: complement union whsp charset delim) p1: any non-delim p2: (append images copy/part p1 p2) ; keep the url | non-end-tag ] ] | skip ] ] ] new-line/all images on ; add hidden newlines to the images block so it molds nicely print mold images | |
Ah yes. | |
Alek_K 14-Apr-2006 [335x2] | one more - value in quotes can contain whitespaces - it is ok to have <img src="one two.jpg"> |
and second - one can write <img alt="picture" src=one.jpg /> - which is also good - and besides that IMO all is OK. | |
Anton 14-Apr-2006 [337] | Really ? "one two.jpg" doesn't have to have the space url encoded ? |
Gabriele 14-Apr-2006 [338x2] | no, quotes are for that. |
also, in xhtml quotes are mandatory | |
Anton 14-Apr-2006 [340x2] | Hmm... OK then, here's the fixed version: |
page: read http://www.rebol.com ; special test cases from Alek_K ;page: {<img src="one two.jpg">} ; OK ;page: {<img alt="picture" src=one.jpg />} ; OK images: copy [] use [whsp ws non-end-tag strd wh- non-str-delim p1 p2 delim non-delim][ whsp: charset " ^-^/" ; whitespace ws: [any whsp] ; a rule for any number of whitespace characters non-end-tag: complement charset ">" ; all characters except ">" strd: charset {"'} ; string delimiters, double and single quote wh-: charset "^-^/" ; whitespace minus the space character (space is allowed inside a quoted string) non-str-delim: complement union whsp charset ">" parse/all page [ any [ thru "<img" whsp [ any [ ws "src" ws "=" ws ;p1: [strd (delim: form p1/1) | (delim: ">")] (non-delim: complement union whsp charset delim) p1: [strd (non-delim: complement union wh- charset form p1/1) | (non-delim: non-str-delim)] p1: any non-delim p2: (append images copy/part p1 p2) ; keep the url | non-end-tag ] ] | skip ] ] ] new-line/all images on ; add hidden newlines to the images block so it molds nicely print mold images | |
Anton 17-Apr-2006 [342] | Now, the tricky thing with modifying parts of a string in a parse rule is that you have to leave the current parse index at the end of your new replacement string. What usually happens is you parse up to your search string, set a marker (here it's done with p1:), parse through your search string, set another marker (p2:), then (remove/part p1 p2 insert p1 "my new string") but if the the new string is shorter or longer than the old string, then the parse index will be left in the wrong position. So to fix that we need to set p2 to p1 plus the length of the new string, then set the parse index to that position so it can continue as intended: (p2: p1 + length? new-string) :p2 So the full example above can modify links in place if you simply replace: (append images copy/part p1 p2) with something like: ( old-string: copy/part p1 p2 new-string: "create your new link from the old one here" remove/part p1 p2 insert p1 new-string p2: p1 + length? new-string ) :p2 |
Thør 26-May-2006 [343] | sync attempt... |
Normand 21-Jun-2006 [344] | Simple blocks mappings: I looked in the maillist, but did not find for such a simple case. I am trying to devise a function to map values from rebDB to the user UI in rebGui. So I need to map the respective values in two blocks, as in a: [a b c d e] and b: [1 2 3 4 5], thinking that a foreach would do the mapping. To no avail? z: [] foreach [i j] [a b] [append z [i j]] I want [a 1 b 2 c 3 d 4 e 5] I would need two foreach, side by side, not to embed one in the other. This does not work, but the idea is there. >> z: [] == [] >> foreach i a foreach j b [append z [i j]] == 5 >> :z == [i j i j i j i j i j] -> ?What is the formula? |
Henrik 21-Jun-2006 [345x2] | I made a function for this to interface MySQL: keyed: func [keys [block!] values [block!] /local out] [ out: copy [] if not any [empty? keys empty? values] [ repeat i length? keys [ insert tail out reduce [ keys/:i either block? first values [values/1/:i][values/:i] ] ] ] out ] |
>> keyed [a b c] [1 2 3] == [a 1 b 2 c 3] | |
Normand 21-Jun-2006 [347] | So usefull. Thanks. |
Anton 22-Jun-2006 [348] | >> a: [a b c d e] b: [1 2 3 4 5] z: [] repeat n length? a [repend z [a/:n b/:n]] == [a 1 b 2 c 3 d 4 e 5] |
Normand 29-Jun-2006 [349] | Integer digits of a string: I want to check if all the digits of a string, str: "1984", are integer number, to check the validity of a date. Ideally I do not want to use integer to-integer, as in: check: func [ str [string!] ] [ for n 1 (length? str) 1 [integer? to-integer to-string pick str 1] ]. It seems to me that to beg the question. Any more elegant way to do that? |
Tomc 29-Jun-2006 [350x2] | parse string [integer!] |
integer? load string | |
Henrik 29-Jun-2006 [352] | normand, also remember that rebol can do date checking, so you don't have to check that manually as well |
BrianH 29-Jun-2006 [353] | Although, only of dates that are in one of the ISO formats. |
Henrik 29-Jun-2006 [354] | yes, you need to shape them to that first, but that might be easier than the other thing :-) |
Geomol 30-Jun-2006 [355x2] | Example: Let's say, our date is 6 digits YYMMDD. >> date: "230812" We deside, it's the year 2023: >> insert date "20" Now dashes are inserted to form a date understandable by REBOL: >> insert skip date 6 "-" >> insert skip date 4 "-" Date now looks like this: >> date == "2023-08-12" And we can control, it's a valid date with: >> to-date date == 12-Aug-2023 If it's not a valid date, like if the original had other characters than digits, we'll get an error. Errors can be caught with: >> error? try [to-date "foobar"] == true Hope it helps. |
control = check | |
Normand 30-Jun-2006 [357] | Oh! I was persuming - wrongly - that no check was done. I thought that because at first glance Rebol did not produce an error on the function >> a: to-date "afrt-01-02" which results in == "afrt-01-02". Thanks for the explanation; then checking all the digits in a date is not usefull. |
Henrik 30-Jun-2006 [358x2] | if you load a string with a date, it will be checked: >> load "25-mar-2006" == 25-Mar-2006 >> load "25-12-2006" == 25-Dec-2006 >> load "3-3-6" == 3-Mar-2006 >> error? try [load "32-13-2006"] == true >> error? try [load "01-16-2006"] == true |
load is pretty good for checking valid content | |
Normand 12-Jul-2006 [360] | Multiple refinement functions : I need to formulate a function with more than one refinement. I know in Rebol we usually use the word 'either to formulate them, but with more than 3 refinements (and its following default case) it becomes tedious. Structures like 'record-operations: func [/delit /addit /modit] [ either delit [print "delete"] [either addit [print "add"] [either modit [print "modify"][print "no refinement"]]]]' are overly complicated. I would like a more flat structure, to be able to distinguish the conditions which are independants from the ones mutually dependants, albeit mutually exclusive. I tried multiple if's but that does not seem to work. What are the good options to code multiple refinements functions. The mail list does not seem to have an example discussing just that. And in the source, most functions with multiple refinements are native. |
Sunanda 12-Jul-2006 [361] | Multiple ifs should work.... if addit [addit code termined with a return] if modit [ modit code terminated with a return] If you have multiple refinements that make up one logical unit, try something like this: f: func [/a /b /c /d] [if all [a b c] [print 'abc return true] print 'not-triggered] f/a not-triggered f/b/c/a abc true |
Geomol 12-Jul-2006 [362] | If you allow more than one refinement at a time, an approach is to build up the code in a block, depending on the refinements (using if), and then evaluate the block at the end of the function. Example: f: func [/a /b /c] [blk: copy [] if a [append blk [print "ref a active"]] if b [append blk [print "ref b active"]] if c [append blk [print "ref c active"]] do blk] >> f/c/a ref a active ref c active |
Anton 12-Jul-2006 [363] | How about this ? f: func [/aref /bref /cref /local refs symbs][ refs: copy [aref bref cref] symbs: copy [] forall refs [if get refs/1 [append symbs to-char #"a" - 1 + index? refs]] ; convert to #"a" #"b" #"c" ... switch rejoin symbs [ "abc" [print "All of them"] "ac" [print "Just A and C"] "b" [print "Just B"] ] ] |
Normand 12-Jul-2006 [364] | Thanks for those answers. |
Anton 13-Jul-2006 [365] | Using an issue (or could be a string) instead of a block: f: func [/aref /bref /cref /local refs symbs][ refs: copy [aref bref cref] symbs: copy # forall refs [if get refs/1 [append symbs to-char #"a" - 1 + index? refs]] ; convert to #"a" #"b" #"c" ... switch symbs [ #abc [print "All of them"] #ac [print "Just A and C"] #b [print "Just B"] ] ] |
Ingo 13-Jul-2006 [366] | Newer version also have case ... case [ aref [ print 'aref] bref [print 'bref] true [print 'default] ] |
Maxim 13-Jul-2006 [367x5] | normand, a lot of us forget about the two following words: ANY ALL |
they are extremely powerfull when used together in cascade, and allow you to bake many ifs and eithers into one line of code: ANY stops evaluating an expression while it encounters none! values, ALL stops evaluating at the first none! value it encounters. | |
here is an example for handling multiple non-exlusive switches: lets say you have refinements /a /b /c /d. /d is mutually-exlusive to all others and a + b reacts differently than when alone... trying to wrap that in if/either can be a nightmare, and its impossible using case or switch... BUT using any/all actually makes it quite visual and simple to see flow: | |
option: ANY [ ALL [d (print "Exclusive d submitted") 1] ALL [a b (print "A and B supplied together") 2] ALL [a (print "A alone") 3] ALL [b (print "B alone") 4] 0 ] if d [print "D also specified" option: option + 10] | |
here, the first occurence of any possible refinement combination returns a number, the trailing 0 is there so that ANY does not return none (which could also be what you want) the /d is checked a part since its not exclusive. | |
Normand 14-Jul-2006 [372] | Glad to see that in Rebol there are many ways to Rome. Alphabetical sort - Is there a built-in way to obtain the right sort order for the french language. a b c d e é è ë f g ... I dont see it as a 'sort refinement, and 'am a bit surprised. Else why fuss with 8 bit chars? So I suppose it is there, but don't see it. In plain sort, the accented caracters are coming last! a: [é è ê ë a c b d e g f h i k j l m n p o q r t s u v x w y z] sort a == [a b c d e f g h i j k l m n o p q r s t u v w x y z è é ê ë] |
Volker 14-Jul-2006 [373x2] | Sort sorts only by ascii, the other things you need to compare yourself. |
Else why fuss with 8 bit chars - erm, to display such chars, for example in altme? | |
Sunanda 15-Jul-2006 [375] | Sorting.....Check this thread. It contains worked solutions for correct sorting in Hungarian. French should be similar: http://www.rebol.org/cgi-bin/cgiwrap/rebol/ml-display-thread.r?m=rmlMWWJ |
older newer | first last |