Rosetta Code/Find bare lang tags: Difference between revisions

From Rosetta Code
Content added Content deleted
(Restore AutoHotkey code by Crazyfirex, but disable Rosetta Code's syntax highlighter.)
(→‎Tcl: Added implementation)
Line 82: Line 82:
}
}
}</lang>
}</lang>

=={{header|Tcl}}==
Doing one of the extra credit options…
{{tcllib|textutil::split}}
<lang tcl>package require textutil::split

proc init {} {
global total count found
set total 0
array set count {}
array set found {}
}
proc findBareTags {pageName pageContent} {
global total count found
set t {{no language}}
lappend t {*}[textutil::split::splitx $pageContent \
{==\s*\{\{\s*header\s*\|\s*([^{}]+?)\s*\}\}\s*==}]
foreach {sectionName sectionText} $t {
set n [regexp -all {<lang>} $sectionText]
if {!$n} continue
incr count($sectionName) $n
lappend found($sectionName) $pageName
incr total $n
}
}
proc printResults {} {
global total count found
puts "$total bare language tags."
if {$total} {
puts ""
foreach sectionName [array names found] {
puts "$count($sectionName) in $sectionName\
(\[\[[join $found($sectionName) {]], [[}]\]\])"
}
}
}

# Do the first level of extra credit. Note that filenames are interleaved with
# page titles as the page content doesn't (necessarily) contain the title.
init
foreach {filename title} $argv {
set f [open $filename]
findBareTags $title [read $f]
close $f
}
printResults</lang>


{{omit from|GUISS}}
{{omit from|GUISS}}

Revision as of 08:36, 23 September 2011

Rosetta Code/Find bare lang tags is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

Find all <lang> tags without a language specified in the text of a page. Display counts by language section:

Description

<lang>Pseudocode</lang>

=={{header|C}}==
<lang C>printf("Hello world!\n");</lang>

=={{header|Perl}}==
<lang>print "Hello world!\n"</lang>

should display something like

2 bare language tags.

1 in perl
1 in no language

For extra credit, allow multiple files to be read. Summarize all results by language:

5 bare language tags.

2 in c ([[Foo]], [[Bar]])
1 in perl ([[Foo]])
2 in no language ([[Baz]])

For more extra credit, use the Media Wiki API to test actual RC tasks.

AutoHotkey

This code has no syntax highlighting, because Rosetta Code's highlighter fails with code that contains literal </lang> tags.

Stole RegEx Needle from Perl

task =
(
Description

<lang>Pseudocode</lang>

=={{header|C}}==
<lang C>printf("Hello world!\n");</lang>

=={{header|Perl}}==
<lang>print "Hello world!\n"</lang>
)
lang := "no lanugage", out := Object(lang, 0), total := 0
Loop Parse, task, `r`n
	If RegExMatch(A_LoopField, "==\s*{{\s*header\s*\|\s*([^\s\}]+)\s*}}\s*==", $)
		lang := $1, out[lang] := 0
	else if InStr(A_LoopField, "<lang>")
		out[lang]++
For lang, num in Out
	If num
		total++, str .= "`n" num " in " lang
MsgBox % clipboard := total " bare lang tags.`n" . str

Output:

2 bare lang tags.

1 in no lanugage
1 in Perl

Perl

This is a simple implementation that does not attempt either extra credit. <lang perl>my $lang = 'no language'; my $total = 0; my %blanks = (); while (<>) {

 if (m/<lang>/) {
   if (exists $blanks{lc $lang}) {
     $blanks{lc $lang}++
   } else {
     $blanks{lc $lang} = 1
   }
   $total++
 } elsif (m/==\s*Template:\s*header\s*\\s*==/) {
   $lang = lc $1
 }

}

if ($total) { print "$total bare language tag" . ($total > 1 ? 's' : ) . ".\n\n"; while ( my ($k, $v) = each(%blanks) ) { print "$k in $v\n" } }</lang>

Tcl

Doing one of the extra credit options…

Library: Tcllib (Package: textutil::split)

<lang tcl>package require textutil::split

proc init {} {

   global total count found
   set total 0
   array set count {}
   array set found {}

} proc findBareTags {pageName pageContent} {

   global total count found
   set t Template:No language
   lappend t {*}[textutil::split::splitx $pageContent \

{==\s*\{\{\s*header\s*\|\s*([^{}]+?)\s*\}\}\s*==}]

   foreach {sectionName sectionText} $t {

set n [regexp -all {<lang>} $sectionText] if {!$n} continue incr count($sectionName) $n lappend found($sectionName) $pageName incr total $n

   }

} proc printResults {} {

   global total count found
   puts "$total bare language tags."
   if {$total} {

puts "" foreach sectionName [array names found] { puts "$count($sectionName) in $sectionName\ (\[\[[join $found($sectionName) {]], [[}]\]\])" }

   }

}

  1. Do the first level of extra credit. Note that filenames are interleaved with
  2. page titles as the page content doesn't (necessarily) contain the title.

init foreach {filename title} $argv {

   set f [open $filename]
   findBareTags $title [read $f]
   close $f

} printResults</lang>