Last active
April 27, 2018 22:24
-
-
Save lepinekong/15d78322ecce84cfbcf892ce1cdbda88 to your computer and use it in GitHub Desktop.
flexible seach function in red
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
((Search)) - searchString /in 'path /ext 'extension ->> searchString: form searchString | |
subgraph Init | |
searchString: form searchString | |
searchString: form searchString ->> ext? | |
subgraph extension | |
ext? - Yes ->> extension: form extension | |
extension: form extension ->> extension: to-file extension | |
ext? - No ->> extension: %.md | |
end | |
extension: %.md ->> root: any [path %./] | |
extension: to-file extension ->> root: any [path %./] | |
end | |
root: any [path %./] ->> isRootDirectory? | |
isRootDirectory? - isRootDirectory = Yes ->> find-where(*) root searchString | |
subgraph SearchFolder | |
find-where(*) root searchString | |
end | |
isRootDirectory? - isRootDirectory = No ->> splited-path: split-path file | |
subgraph SearchFile | |
splited-path: split-path file ->> path: splited-path/1 | |
path: splited-path/1 ->> search-lines read/lines file | |
end | |
subgraph readPath | |
(((*)find-where)) - path searchString ->> files: read path | |
files: read path ->> foreach file files | |
foreach file files ->> do-events/no-wait | |
do-events/no-wait ->> file: rejoin [path file] | |
file: rejoin [path file] ->> fileOrFolder? | |
fileOrFolder? - file ->> extension=suffixOfFile? | |
extension=suffixOfFile? - Yes ->> content: read file | |
content: read file ->> searchStringFoundInContent? | |
end | |
subgraph searchStringFoundInContent | |
searchStringFoundInContent? - Yes ->> print fileName: to-string file | |
print fileName: to-string file ->> lines: read/lines file | |
lines: read/lines file ->> foreach file files | |
end | |
searchStringFoundInContent? - No ->> searchStringFoundInFileName = find (to-string file) searchstring | |
subgraph searchStringInFileName | |
searchStringFoundInFileName = find (to-string file) searchstring ->> searchStringFoundInFileName? | |
searchStringFoundInFileName? - No ->> foreach file files | |
searchStringFoundInFileName? - Yes ->> print read file | |
end | |
subgraph searchStringFoundInFileName | |
print read file | |
end | |
print read file ->> foreach file files | |
extension=suffixOfFile? - No ->> foreach file files | |
fileOrFolder? - folder ->> (((*)find-where)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
search-lines-block: function[searchString lines /whole-line /local newline_terminator][ | |
;start debug | |
; .tracing ON | |
; ?? searchString | |
; .pause | |
; .tracing OFF | |
;end debug | |
newline_terminator: false | |
probe searchString | |
if ((last searchString) = newline) [ | |
probe searchstring | |
ask "(last searchString) = newline" | |
searchString = head (remove back tail searchString) | |
newline_terminator: true | |
;start debug | |
probe searchString | |
print "searchString with newline !!!!!!!!!!!" | |
ask "" | |
;end debug | |
] | |
use [i][ | |
i: 0 | |
forall lines [ | |
i: index? lines | |
line: lines/1 | |
;start debug | |
;print ["[" i "] - " line] | |
.pause (rejoin ["[" i "] - " line " in search-lines-block"]) | |
;end debug | |
either whole-line [ | |
if (line = searchString) [ | |
print ["[" i "] - " "found " searchString " in: " line] | |
] | |
][ | |
if not none? (find line searchString) [ | |
either not newline_terminator [ | |
print ["[" i "] - " "found " searchString " in: " line] | |
;start debug | |
.pause "if find line searchString" | |
;end debug | |
][ | |
if (take/part/last copy line (length? searchString)) = searchString | |
[ | |
print ["[" i "] - " "found " searchString " in: " line] | |
] | |
] | |
] | |
] | |
] | |
] | |
] | |
search-lines: function[ searchString [string!] lines_or_file [block! file!] /whole-line | |
/local newline_terminator | |
][ | |
switch/default type?/word get/any 'lines_or_file [ | |
file! [ | |
file: lines_or_file | |
lines: read/lines file | |
;start debug | |
.pause "search-lines for file!" | |
;end debug | |
either whole-line [ | |
search-lines-block/whole-line searchString lines | |
][ | |
search-lines-block searchString lines | |
] | |
] | |
block! [ | |
lines: lines_or_file | |
;start debug | |
.pause "search-lines for lines" | |
;end debug | |
either whole-line [ | |
search-lines-block/whole-line searchString lines | |
][ | |
search-lines-block searchString lines | |
] | |
] | |
] [ | |
throw-error 'script 'expect-arg varName | |
] | |
] | |
search: function [ | |
"Return file where searchString is found or NONE, if the string can't be found" | |
'searchString [word! string!] | |
/whole-line | |
/in | |
'path "Start search in this path (default is current directory)" | |
/ext 'extension [word! string! file!] "Search this extension only" | |
/red | |
/local splited-path | |
][ | |
; if (type? searchString = word!) [ | |
; searchString = to-string searchString | |
; ] | |
searchString: form searchString | |
either ext [ | |
extension: form extension | |
extension: to-file extension | |
][ | |
extension: %.md | |
] | |
default-path: to-red-file rejoin [.system.path %.bookmarks/] | |
;root: any [path %/c/rebol/system/.bookmarks/] | |
root: any [path default-path] | |
find-where: function [ | |
path | |
searchString | |
/local | |
content | |
lines | |
][ | |
files: read path | |
;subgraph loop | |
foreach file files [ | |
do-events/no-wait | |
file: rejoin [path file] | |
case [ | |
extension = suffix? file [ | |
;subgraph searchExtension | |
content: read file | |
searchStringFoundInContent: not none? (find content searchString) | |
;either find content searchString [ | |
either searchStringFoundInContent [ | |
;subgraph searchStringFoundInContent | |
print fileName: to-string file | |
lines: read/lines file | |
either whole-line [ | |
search-lines/whole-line searchString lines | |
][ | |
;start debug | |
.pause {in searchStringFoundInContent. Calling search-lines searchString lines} | |
;end debug | |
search-lines searchString lines | |
] | |
;end subgraph searchStringFoundInFileContent | |
][ | |
;label searchStringFoundInFileName | |
searchStringFoundInFileName: not none? (find (to-string file) searchstring) | |
;if find (to-string file) searchstring [ | |
if searchStringFoundInFileName [ | |
print "===" | |
print rejoin ["found in file: " file] | |
;start debug | |
.pause {in searchStringFoundInFileName.} | |
;end debug | |
;print read file | |
] | |
] | |
] | |
dir? file [ | |
;start debug | |
?? file | |
.pause {in dir? file = Yes} | |
;end debug | |
if result: find-where file searchString [ | |
return result | |
] | |
] | |
] | |
] | |
none | |
] | |
isRootDirectory: dir? root | |
either isRootDirectory [ | |
find-where root searchString | |
][ | |
splited-path: split-path file | |
path: splited-path/1 | |
either (exists? file) [ | |
search-lines read/lines file | |
return file | |
][ | |
print "TODO:" | |
] | |
] | |
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; copy and paste in http://chartmage.com/index.html flowchart | |
((Search)) - searchString /in 'path /ext 'extension ->> searchString: form searchString | |
subgraph Init | |
searchString: form searchString | |
searchString: form searchString ->> ext? | |
subgraph extension | |
ext? - Yes ->> extension: form extension | |
extension: form extension ->> extension: to-file extension | |
ext? - No ->> extension: %.md | |
end | |
extension: %.md ->> root: any [path %./] | |
extension: to-file extension ->> root: any [path %./] | |
end | |
root: any [path %./] ->> dir? | |
dir? - Root = Yes ->> find-where(*) root searchString | |
subgraph SearchFolder | |
find-where(*) root searchString | |
end | |
dir? - Root = No ->> splited-path: split-path file | |
subgraph SearchFile | |
splited-path: split-path file ->> path: splited-path/1 | |
path: splited-path/1 ->> search-lines read/lines file | |
end | |
(((*)find-where)) - path searchString ->> files: read path | |
files: read path - foreach file files ->> do-events/no-wait | |
do-events/no-wait ->> file: rejoin [path file] | |
file: rejoin [path file] ->> fileOrFolder? | |
fileOrFolder? - file ->> extension=suffixOfFile? | |
extension=suffixOfFile? - Yes ->> content: read file | |
content: read file ->> searchStringFoundInContent? | |
searchStringFoundInContent? - Yes ->> print file | |
subgraph searchStringFoundInFileContent | |
print file ->> lines: read/lines file | |
end | |
searchStringFoundInContent? - No ->> searchStringFoundInFileName = find (to-string file) searchstring | |
searchStringFoundInFileName = find (to-string file) searchstring ->> searchStringFoundInFileName? | |
searchStringFoundInFileName? - No ->> do-events/no-wait | |
searchStringFoundInFileName? - Yes ->> print read file | |
subgraph searchStringFoundInFileName | |
print read file | |
end | |
print read file ->> do-events/no-wait | |
extension=suffixOfFile? - No ->> do-events/no-wait | |
fileOrFolder? - folder ->> (((*)find-where)) |
Author
lepinekong
commented
Mar 11, 2018
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment