namespace eval ::xowiki {}
::nsf::object::alloc ::xo::db::CrClass ::xowiki::Page {array set :RE {include {{{([^<]+?)}}([^\}\\]|$)} clean2 { <br */?> *(<div)} anchor {\\\[\\\[([^\]]+?)\\\]\\\]} div {>>([^&<]*?)<<([ \n]*)?} clean {[\\](\{\{|>>|\[\[)}}
set :__default_metaclass ::xotcl::Class
set :__default_superclass ::xotcl::Object
set :abstract_p f
set :auto_save false
array set :db_constraints {page_order {{default {}} {default {}}}}
array set :db_slot {page_order ::xowiki::Page::slot::page_order creator ::xowiki::Page::slot::creator page_id ::xowiki::Page::slot::page_id creation_date ::xo::db::Object::slot::creation_date creation_user ::xo::db::Object::slot::creation_user object_id ::xo::db::Object::slot::object_id description ::xowiki::Page::slot::description text ::xowiki::Page::slot::text creation_ip ::xo::db::Object::slot::creation_ip package_id ::xo::db::Object::slot::package_id object_title ::xo::db::Object::slot::object_title nls_language ::xo::db::CrItem::slot::nls_language security_inherit_p ::xo::db::Object::slot::security_inherit_p context_id ::xo::db::Object::slot::context_id mime_type ::xo::db::CrItem::slot::mime_type name ::xo::db::CrItem::slot::name title ::xowiki::Page::slot::title item_id ::xo::db::CrItem::slot::item_id revision_id ::xo::db::CrItem::slot::revision_id publish_date ::xowiki::Page::slot::publish_date modifying_user ::xo::db::Object::slot::modifying_user last_modified ::xo::db::Object::slot::last_modified modifying_ip ::xo::db::Object::slot::modifying_ip}
set :folder_id -100
set :form ::xowiki::WikiForm
set :id_column page_id
array set :markupmap {unescape { {[[} \{\{ {>>}} escape {{\[[} \\\{\{ {\>>} }}
set :mime_type text/html
set :name_method {}
set :non_cached_instance_var_patterns __*
set :object_type ::xowiki::Page
set :object_type_key 000000000000111100011001
set :pretty_name #xowiki.Page_pretty_name#
set :pretty_plural #xowiki.Page_pretty_plural#
set :recursion_count 0
set :security_inherit_p t
set :sql_package_name ::xowiki::Page
set :storage_type text
set :supertype content_revision
set :table_name xowiki_page
set :with_table true}
::xowiki::Page proc quoted_html_content text {
list [ad_text_to_html -- $text] text/html
}
::xowiki::Page proc container_already_rendered field {
if {![info exists ::xowiki_page_item_id_rendered]} {
return ""
}
return "and not $field in ([ns_dbquotelist $::xowiki_page_item_id_rendered])"
}
::xowiki::Page proc save_tags {-package_id:required -item_id:required -revision_id:required -user_id:required tags} {
::xo::dc dml delete_tags "delete from xowiki_tags where item_id = :item_id and user_id = :user_id"
regsub -all {[^\w.-]+} $tags " " tags
foreach tag [split $tags " "] {
if {$tag ne ""} {
::xo::dc dml insert_tag "insert into xowiki_tags (item_id,package_id, user_id, tag, time) values (:item_id, :package_id, :user_id, :tag, CURRENT_TIMESTAMP)"
}
}
search::queue -object_id $revision_id -event UPDATE
}
::xowiki::Page proc get_tags {-package_id:required -item_id -user_id} {
if {[info exists item_id]} {
if {[info exists user_id]} {
set tags [::xo::dc list -prepare integer,integer,integer get_tags {
SELECT distinct tag from xowiki_tags
where user_id = :user_id and item_id = :item_id and package_id = :package_id
}]
} else {
set tags [::xo::dc list -prepare integer,integer get_tags {
SELECT distinct tag from xowiki_tags
where item_id = :item_id and package_id = :package_id
}]
}
} else {
if {[info exists user_id]} {
set tags [::xo::dc list -prepare integer,integer get_tags {
SELECT distinct tag from xowiki_tags
where user_id = :user_id and package_id :package_id
}]
} else {
set tags [::xo::dc list -prepare integer get_tags {
SELECT distinct tag from xowiki_tags
where package_id = :package_id
}]
}
}
return $tags
}
::xowiki::Page proc find_slot {-start_class:required name} {
foreach cl [list $start_class {*}[$start_class info heritage]] {
set slotobj ${cl}::slot::$name
if {[nsf::is object $slotobj]} {
return $slotobj
}
}
return ""
}
::xowiki::Page proc import {-user_id -package_id -folder_id {-replace 0} -objects} {
ad_log_deprecated "::xowiki::Page proc" "import" "::$package_id import ..."
if {![info exists package_id]} {
set package_id [::xo::cc package_id]
}
set cmd [list ::$package_id import -replace $replace]
if {[info exists user_id]} {lappend cmd -user_id $user_id}
if {[info exists objects]} {lappend cmd -objects $objects}
{*}$cmd
}
::xowiki::Page instproc category_import {-name -description -locale -categories} {
set key ::__xowiki_category_import($name)
if {[info exists $key]} return
set tree_ids [::xowiki::Category get_mapped_trees -object_id ${:package_id} -locale $locale -names [list $name] -output tree_id]
set tree_id [lindex $tree_ids 0];
if {$tree_id eq ""} {
:log "...importing category tree $name"
set tree_id [category_tree::import -name $name -description $description -locale $locale -categories $categories]
category_tree::map -tree_id $tree_id -object_id ${:package_id}
}
foreach category [::xowiki::Category get_category_infos -tree_id $tree_id] {
lassign $category category_id category_name deprecated_p level
lappend categories $level $category_name
set names($level) $category_name
set node_name $name
for {set l 1} {$l <= $level} {incr l} {append node_name /$names($l)}
set ::__xowiki_reverse_category_map($node_name) $category_id
}
set $key 1
}
::xowiki::Page instproc error_in_includelet {arg msg} {
return [:error_during_render "[_ xowiki.error_in_includelet [list arg $arg name ${:name}]]<br >\n$msg"]
}
::xowiki::Page instproc create_link arg {
set label $arg
set link $arg
set options ""
regexp {^([^|]+)[|](.*)$} $arg _ link label
regexp {^([^|]*)[|](.*)$} $label _ label options
set options [:unescape $options]
set link [string trim $link]
set package_id [::${:package_id} resolve_package_path $link link]
if {$package_id == 0} {
if {[regsub {^//} $link / link]} {
switch -glob -- [::xowiki::guesstype $link] {
text/css {
::xo::Page requireCSS $link
return ""
}
application/x-javascript -
application/javascript {
::xo::Page requireJS $link
return ""
}
image/* {
Link create [self]::link -page [self] -name "" -type localimage -label $label -href $link
[self]::link configure {*}$options
return [self]::link
}
}
}
set l [ExternalLink new -label $label -href $link]
$l configure {*}$options
return $l
}
set link_info [:get_anchor_and_query $link]
set parent_id [expr {$package_id == ${:package_id} ?
${:parent_id} : [::$package_id folder_id]}]
set use_package_path true
set is_self_link false
if {[regexp {^:(..):(.+)$} [dict get $link_info link] _ lang stripped_name]} {
set item_ref_info [::$package_id item_ref -use_package_path $use_package_path -default_lang [:lang] -parent_id $parent_id ${lang}:$stripped_name]
dict set item_ref_info link_type language
} elseif {[regexp {^[.]SELF[.]/(.*)$} [dict get $link_info link] _ link]} {
set self_link_ids [:self_link_ids]
set parent_id [dict get $self_link_ids parent_id]
set package_id [dict get $self_link_ids package_id]
set is_self_link true
set item_ref_info [::$package_id item_ref -use_package_path $use_package_path -default_lang [:lang] -parent_id $parent_id $link]
dict set link_info link $link
} else {
set item_ref_info [::$package_id item_ref -use_package_path $use_package_path -default_lang [:lang] -parent_id $parent_id [dict get $link_info link]]
}
if {$label eq $arg} {
set label [dict get $link_info link]
}
set item_name [string trimleft [dict get $item_ref_info prefix]:[dict get $item_ref_info stripped_name] :]
Link create [self]::link -page [self] -form [dict get $item_ref_info form] -type [dict get $item_ref_info link_type] -name $item_name -lang [dict get $item_ref_info prefix] -anchor [dict get $link_info anchor] -query [dict get $link_info query] -stripped_name [dict get $item_ref_info stripped_name] -label $label -parent_id [dict get $item_ref_info parent_id] -item_id [dict get $item_ref_info item_id] -package_id $package_id -is_self_link $is_self_link
if {[:can_link [dict get $item_ref_info item_id]] == 0} {
:references refused [dict get $item_ref_info item_id]
if {[[self]::link exists href]} {
[self]::link unset href
}
}
[self]::link configure {*}$options
set result [[self]::link]
return $result
}
::xowiki::Page instproc www-make-live-revision {} {
set page_id [:query_parameter revision_id]
if {[string is integer -strict $page_id]} {
set revision_id $page_id
} else {
set revision_id ${:revision_id}
}
:set_live_revision -revision_id $revision_id
${:package_id} returnredirect [${:package_id} query_parameter_return_url [export_vars -base [::${:package_id} url] {{m revisions}}]]
}
::xowiki::Page instproc www-toggle-publish-status -return_url {
if {![info exists return_url]} {
set return_url [:query_parameter return_url:localurl [ad_return_url]]
}
if {${:publish_status} ne "ready"} {
set new_publish_status "ready"
} else {
set new_publish_status "production"
}
:update_publish_status $new_publish_status
${:package_id} returnredirect $return_url
}
::xowiki::Page instproc lang {} {
return [string range ${:nls_language} 0 1]
}
::xowiki::Page instproc get_content {} {
return [:render -with_footer false -update_references never]
}
::xowiki::Page instproc validate=form_constraints form_constraints {
ad_try {
:create_form_fields_from_form_constraints $form_constraints
} on error {errorMsg} {
ad_log error "error during form_constraints validator: $errorMsg"
:uplevel [list set errorMsg $errorMsg]
return 0
}
return 1
}
::xowiki::Page instproc www-clipboard-content {} {
set clipboard [::xowiki::clipboard get]
if {$clipboard eq ""} {
util_user_message -message "Clipboard empty"
} else {
foreach item_id $clipboard {
if {[::xo::db::CrClass get_instance_from_db -item_id $item_id] ne ""} {
util_user_message -message [::$item_id pretty_link]
} else {
util_user_message -message "item $item_id deleted"
}
}
}
:return_redirect_without_params
}
::xowiki::Page instproc is_folder_page {{-include_folder_links true}} {
return 0
}
::xowiki::Page instproc get_description {-nr_chars content} {
set revision_id ${:revision_id}
set description ${:description}
if {$description eq "" && $content ne ""} {
set description [ad_html_text_convert -from text/html -to text/plain -- $content]
}
if {$description eq "" && $revision_id > 0} {
set body [::xo::dc get_value -prepare integer get_description_from_syndication "select body from syndication where object_id = :revision_id" -default ""]
set description [ad_html_text_convert -from text/html -to text/plain -- $body]
}
if {[info exists nr_chars] && [string length $description] > $nr_chars} {
set description [string range $description 0 $nr_chars]...
}
return $description
}
::xowiki::Page instproc references_update {resolved {unresolved {}}} {
set item_id ${:item_id}
::xo::dc dml -prepare integer delete_references "delete from xowiki_references where page = :item_id"
::xo::dc dml -prepare integer delete_unresolved_references "delete from xowiki_unresolved_references where page = :item_id"
foreach ref $resolved {
lassign $ref r link_type
::xo::dc dml insert_reference "insert into xowiki_references (reference, link_type, page) values (:r,:link_type,:item_id)"
}
foreach ref $unresolved {
dict with ref {
::xo::dc dml insert_unresolved_reference "insert into xowiki_unresolved_references (page, parent_id, name, link_type) values (:item_id,:parent_id,:name,:link_type)"
}
}
}
::xowiki::Page instproc www-save-attributes {} {
set field_names [:field_names]
set form_fields [list]
set query_field_names [list]
set validation_errors 0
foreach field_name $field_names {
if {[::xo::cc exists_form_parameter $field_name]} {
lappend form_fields [:create_form_field $field_name]
lappend query_field_names $field_name
}
}
lassign [:get_form_data -field_names $query_field_names $form_fields] validation_errors category_ids
if {$validation_errors == 0} {
set update_without_revision [::${:package_id} query_parameter replace:boolean 0]
foreach form_field $form_fields {
if {[$form_field istype ::xowiki::formfield::richtext]} {
$form_field value [list [$form_field value] text/html]
}
}
if {$update_without_revision} {
set update_instance_attributes 0
foreach form_field $form_fields {
set s [$form_field slot]
if {$s eq ""} {
set update_instance_attributes 1
} else {
error "Not implemented yet"
:update_attribute_from_slot $s [$form_field value]
}
}
if {$update_instance_attributes} {
set s [:find_slot instance_attributes]
:update_attribute_from_slot $s [:instance_attributes]
}
} else {
:save_data -use_given_publish_date [expr {"_publish_date" in $field_names}] [::xo::cc form_parameter __object_name:signed,convert ""] $category_ids
}
${:package_id} returnredirect [:query_parameter return_url:localurl [:pretty_link]]
return
} else {
ns_log warning "www-save-attributes: we have $validation_errors validation_errors"
}
${:package_id} returnredirect [:query_parameter return_url:localurl [:pretty_link]]
}
::xowiki::Page instproc www-delete -return_url {
set returnUrlOpt [expr {[info exists return_url] ? [list -return_url $return_url] : ""}]
${:package_id} www-delete -item_id ${:item_id} -name ${:name} {*}$returnUrlOpt
}
::xowiki::Page instproc search_render {} {
set :__no_form_page_footer 1
set html [:render -update_references none]
unset :__no_form_page_footer
foreach tag {h1 h2 h3 h4 h5 b strong} {
foreach {match words} [regexp -all -inline "<$tag>(\[^<\]+)</$tag>" $html] {
foreach w [split $words] {
if {$w eq ""} continue
set word($w) 1
}
}
}
foreach tag [::xowiki::Page get_tags -package_id ${:package_id} -item_id ${:item_id}] {
set word($tag) 1
}
return [list mime text/html html $html keywords [array names word] text ""]
}
::xowiki::Page instproc notification_render {} {
return [:render]
}
::xowiki::Page instproc show_fields {form_fields {msg {}}} {
foreach f $form_fields { append msg "[$f name] [namespace tail [$f info class]], " }
:msg $msg
:log "form_fields: $msg"
}
::xowiki::Page instproc lookup_cached_form_field -name:required {
set key ::_form_field_names($name)
if {[info exists $key]} {
return [set $key]
}
error "No form field with name $name found"
}
::xowiki::Page instproc can_link item_id {
return 1
}
::xowiki::Page instproc category_export tree_name {
set tree_ids [::xowiki::Category get_mapped_trees -object_id ${:package_id} -names [list $tree_name] -output tree_id]
set tree_id [lindex $tree_ids 0]
set tree_description [dict get [category_tree::get_data $tree_id] description]
set categories [list]
if {![info exists :__category_map]} {
set :__category_map [dict create]
}
foreach category [::xowiki::Category get_category_infos -tree_id $tree_id] {
lassign $category category_id category_name deprecated_p level
lappend categories $level $category_name
set names($level) $category_name
set node_name $tree_name
for {set l 1} {$l <= $level} {incr l} {append node_name /$names($l)}
dict set :__category_map $category_id $node_name
}
set cmd [list :category_import -name $tree_name -description $tree_description -locale [lang::system::site_wide_locale] -categories $categories]
if {![info exists :__map_command] || [string first $cmd ${:__map_command}] == -1} {
append :__map_command \n $cmd
}
return ${:__category_map}
}
::xowiki::Page instproc is_form {} {
return 0
}
::xowiki::Page instproc www-edit {{-new:boolean false} {-autoname:boolean false} {-validation_errors ""}} {
:instvar item_id
:edit_set_default_values
set fs_folder_id [:edit_set_file_selector_folder]
if {[::${:package_id} exists_query_parameter "return_url"]} {
set submit_link [:query_parameter return_url:localurl]
set return_url $submit_link
} else {
set submit_link [:pretty_link]
}
set object_type [:info class]
lappend ::template::parse_level [info level]
set action_vars [expr {$new ? "{edit-new 1} object_type return_url" : "{m edit} return_url"}]
if {[::${:package_id} info class] eq "::xowiki::Package"} {
set folder_spec [list script_dir [::${:package_id} package_url]]
} else {
set first_instance_id [::xowiki::Package first_instance -party_id [::xo::cc user_id] -privilege read]
if {$first_instance_id ne ""} {
::xowiki::Package require $first_instance_id
set folder_spec [list script_dir [::$first_instance_id package_url]]
}
}
if {$fs_folder_id ne ""} {
lappend folder_spec folder_id $fs_folder_id
}
[$object_type getFormClass -data [self]] create ::xowiki::f1 -volatile -action [export_vars -base [::${:package_id} url] $action_vars] -data [self] -folderspec $folder_spec -submit_link $submit_link -autoname $autoname
if {[info exists return_url]} {
::xowiki::f1 generate -export [list [list return_url $return_url]]
} else {
::xowiki::f1 generate
}
::xowiki::f1 instvar edit_form_page_title context formTemplate
if {[info exists item_id]} {
set rev_link [::${:package_id} make_link [self] revisions]
set view_link [::${:package_id} make_link [self] view]
}
if {[info exists last_page_id]} {
set back_link [::${:package_id} url]
}
set index_link [::${:package_id} make_link -privilege public ${:package_id}]
::xo::Page set_property doc title "[::${:package_id} instance_name] - $edit_form_page_title"
array set property_doc [::xo::Page get_property doc]
set edit_tmpl [::${:package_id} get_adp_template "edit"]
set html [::${:package_id} return_page -adp $edit_tmpl -form f1 -variables {
item_id {parent_id ${:parent_id}}
edit_form_page_title context formTemplate
view_link back_link rev_link index_link property_doc
}]
template::util::lpop ::template::parse_level
return $html
}
::xowiki::Page instproc initialize_loaded_object {} {
if {[info exists :title] && ${:title} eq ""} {set :title ${:name}}
next
}
::xowiki::Page instproc www-delete-revision {} {
set item_id ${:item_id}
::xo::dc 1row -prepare integer get_revision {
select latest_revision,live_revision from cr_items where item_id = :item_id
}
${:package_id} delete_revision -revision_id ${:revision_id} -item_id $item_id
if {$live_revision == ${:revision_id}} {
xo::dc 1row -prepare integer get_revision {select latest_revision from cr_items where item_id = :item_id}
if {$latest_revision eq ""} {
${:package_id} delete -name ${:name} -item_id $item_id
} else {
set page [::xo::db::CrClass get_instance_from_db -item_id $item_id -revision_id $latest_revision]
$page set_live_revision -revision_id $latest_revision
}
}
if {$latest_revision ne ""} {
${:package_id} returnredirect [:query_parameter return_url:localurl [export_vars -base [${:package_id} url] {{m revisions}}]]
}
}
::xowiki::Page instproc get_anchor_and_query link {
set anchor ""
set query ""
regexp {^([^#]*)(\#|%23)(.*)$} $link _ link . anchor
regexp {^(.*)[?]([^?]+)$} $link _ link query
return [list link $link anchor $anchor query $query]
}
::xowiki::Page instproc condition=match {query_context value} {
if {[llength $value] != 2} {
error "two arguments for match required, [llength $value] passed (arguments='$value')"
}
ad_try {
set success [string match [lindex $value 1] [set :[lindex $value 0]]]
} on error {errorMsg} {
ns_log error "error during condition match: $errorMsg"
set success 0
}
return $success
}
::xowiki::Page instproc create_form_field {{-cr_field_spec ""} {-field_spec ""} field_name} {
switch -glob -- $field_name {
__* {}
_* {
set varname [string range $field_name 1 end]
return [:create_raw_form_field -name $field_name -spec $cr_field_spec -slot [:find_slot $varname]]
}
default {
return [:create_raw_form_field -name $field_name -spec $field_spec -slot [:find_slot $field_name]]
}
}
}
::xowiki::Page instproc www-clipboard-copy {} {
set clipboard [::xowiki::clipboard get]
set item_ids [::xowiki::exporter include_needed_objects $clipboard]
set content [::xowiki::exporter marshall_all -mode copy $item_ids]
ad_try {
namespace eval ::xo::import $content
} on error {errMsg} {
:msg "Error: $errMsg\n$::errorInfo"
return
}
set folder_id [expr {[:is_folder_page] ? ${:item_id} : ${:parent_id}}]
set msg [::${:package_id} import -replace 0 -create_user_ids 1 -parent_id $folder_id -objects $item_ids]
util_user_message -html -message $msg
::xowiki::clipboard clear
:return_redirect_without_params
}
::xowiki::Page instproc references {submethod args} {
switch -- $submethod {
clear {
set :__references { unresolved {} resolved {} refused {} }
}
unresolved -
refused -
resolved {
return [dict lappend :__references $submethod [lindex $args 0]]
}
get { return [dict get ${:__references} [lindex $args 0]] }
all { return ${:__references} }
default {error "unknown submethod: $submethod"}
}
}
::xowiki::Page instproc physical_parent_id {} {
if {[info exists :physical_parent_id]} {
return ${:physical_parent_id}
} else {
return ${:parent_id}
}
}
::xowiki::Page instproc form_field_flush_cache {} {
unset -nocomplain ::_form_field_names
}
::xowiki::Page instproc div arg {
if {$arg eq "content"} {
return "<div id='content' class='column'>"
} elseif {[string match "left-col*" $arg] || [string match "right-col*" $arg] || $arg eq "sidebar"} {
return "<div id='[ns_quotehtml $arg]' class='column'>"
} elseif {$arg eq "box"} {
return "<div class='box'>"
} elseif {$arg eq ""} {
return "</div>"
} else {
return ""
}
}
::xowiki::Page instproc www-revisions {} {
return [:www-view [next]]
}
::xowiki::Page instproc unescape string {
return [string map [list ">" > "<" < """ \" "&" & "&semicolon;" {;} ] $string]
}
::xowiki::Page instproc update_publish_status new_publish_status {
if {$new_publish_status ni {production ready live expired}} {
error "update_publish_status receives invalid publish status '$new_publish_status'"
}
if {$new_publish_status ne ${:publish_status}} {
:set_live_revision -revision_id ${:revision_id} -publish_status $new_publish_status
::xo::xotcl_object_cache flush ${:revision_id}
::xo::xotcl_object_cache flush ${:item_id}
if {$new_publish_status eq "ready"} {
::xowiki::notification::do_notifications -revision_id ${:revision_id}
::xowiki::datasource -nocleanup ${:revision_id}
} else {
set revision_id ${:revision_id}
::xo::dc dml -prepare integer flush_syndication {delete from syndication where object_id = :revision_id}
}
}
}
::xowiki::Page instproc create_form_fields field_names {
set form_fields [:create_category_fields]
foreach att $field_names {
if {[string match "__*" $att]} continue
lappend form_fields [:create_form_field $att]
}
return $form_fields
}
::xowiki::Page instproc www-create-new {{-parent_id 0} {-view_method edit} {-name ""} {-nls_language ""} {-publish_status ""}} {
set original_package_id ${:package_id}
if {[:exists_query_parameter "package_instance"]} {
set package_instance [:query_parameter package_instance:localurl]
ad_try {
::xowiki::Package initialize -url $package_instance -user_id [::xo::cc user_id] -actual_query ""
} on error {errorMsg} {
ns_log error "Package initialize: $errorMsg\n$::errorInfo"
return [::$original_package_id error_msg "Page <b>'${:name}'</b> invalid provided package instance=$package_instance<p>$errorMsg</p>"]
}
}
set default_variables {}
foreach name_and_spec [list name title page_order:graph last_page_id:int32 nls_language:oneof,arg=[join [lang::system::get_locales] |] ] {
set p [string first : $name_and_spec]
set key [expr {$p > -1 ? [string range $name_and_spec 0 $p-1] : $name_and_spec}]
if {[:exists_query_parameter $key]} {
lappend default_variables $key [:query_parameter $name_and_spec]
}
}
set text_to_html [:form_parameter __text_to_html:0..n ""]
foreach key {_text _name} {
if {[:exists_form_parameter $key]} {
set __value [:form_parameter $key]
if {$key in $text_to_html} {
set __value [ad_text_to_html -- $__value]
}
lappend default_variables [string range $key 1 end] $__value
switch -- $key {
_name {set name $__value}
}
}
}
set instance_attributes [list]
foreach {_att _value} [::xo::cc get_all_form_parameter] {
if {[string match _* $_att]} continue
lappend instance_attributes $_att $_value
}
if {$parent_id == 0} {
if {![info exists :parent_id]} {
set :parent_id [::${:package_id} folder_id]
}
set fp_parent_id [:form_parameter parent_id:int32 [:query_parameter parent_id:int32 ${:parent_id}]]
} else {
set fp_parent_id $parent_id
}
if {![::xo::db::CrClass id_belongs_to_package -item_id $fp_parent_id -package_id ${:package_id}]} {
ad_return_complaint 1 "invalid parent_id"
ad_script_abort
}
set fp_package_id [:form_parameter package_id:int32 [:query_parameter package_id:int32 ${:package_id}]]
if {$publish_status eq ""} {
set publish_status [:query_parameter publish_status:wordchar ""]
}
if {$publish_status eq "" && [:exists_query_parameter name]} {
if {[::${:package_id} get_parameter production_mode:boolean 0]} {
set publish_status "production"
} else {
set publish_status "ready"
}
}
set source_item_id 0
if {[:exists_query_parameter p.source]} {
set source_page [:query_parameter p.source:token]
set source_item_id [::${:package_id} lookup -use_site_wide_pages true -name $source_page]
}
if {$source_item_id == 0} {
set source_item_id [:query_parameter source_item_id:int32 ""]
}
::xo::Package require $fp_package_id
set f [:create_form_page_instance -name $name -nls_language $nls_language -parent_id $fp_parent_id -package_id $fp_package_id -default_variables $default_variables -instance_attributes $instance_attributes -source_item_id $source_item_id]
if {$publish_status ne ""
&& $publish_status in {"production" "ready" "live" "expired"}
} {
$f publish_status $publish_status
}
if {[:exists_query_parameter p.configure]} {
set configure_method [:query_parameter p.configure:wordchar]
if {[$f procsearch configure_page=$configure_method] ne ""} {
$f configure_page=$configure_method $name
} else {
ns_log notice "cannot find configure_page=$configure_method on [$f info precedence]"
}
}
if {$name eq ""} {
$f save_new
} else {
set id [::$fp_package_id lookup -parent_id $fp_parent_id -name $name]
if {$id == 0} {
$f save_new
} else {
::xowiki::FormPage get_instance_from_db -item_id $id
$f copy_content_vars -from_object $id
$f item_id $id
$f save
}
}
$f notification_notify
foreach name_and_spec {
return_url:localurl
template_file
title
detail_link:localurl
text
} {
set p [string first : $name_and_spec]
set key [expr {$p > -1 ? [string range $name_and_spec 0 $p-1] : $name_and_spec}]
if {[:exists_query_parameter $key]} {
set $key [:query_parameter $name_and_spec]
:log "set instance var from query param '$key' -> '[set $key]'"
}
}
if {[info exists template_file]} {
set template_file [$fp_package_id normalizepath $template_file]
}
set form_redirect [:form_parameter __form_redirect:0..n ""]
if {$form_redirect eq ""} {
set form_redirect [$f pretty_link -query [export_vars {
{m $view_method} return_url template_file title detail_link text
}]]
}
${:package_id} returnredirect $form_redirect
set :package_id $original_package_id
}
::xowiki::Page instproc unset_temporary_instance_variables {} {
unset -nocomplain :__form_fields :__field_in_form :__field_needed
}
::xowiki::Page instproc adp_subst content {
foreach __v [:info vars] {
if {[info exists $__v]} continue
:instvar $__v
}
set __ignorelist {
__v __vars __l __ignorelist __varlist __references __my_class
__last_includelet text item_id content lang_links
}
set current_user [::xo::cc set untrusted_user_id]
set current_url [::xo::cc url]
set __vars [info vars]
regsub -all -- [template::adp_variable_regexp] $content {\1@\2;noquote@} content_noquote
set __l [string length $content]
try {
set __bufsize [ns_adp_ctl bufsize]
} on error {errorMsg} {
set __bufsize 0
}
if {$__bufsize > 0 && $__l > $__bufsize} {
ns_adp_ctl bufsize [expr {$__l + 1024}]
}
set template_code [template::adp_compile -string $content_noquote]
set my_parse_level [template::adp_level]
ad_try {
set template_value [template::adp_eval template_code]
} on error {__errMsg} {
set __varlist [list]
set __template_variables__ "<ul>\n"
foreach __v [lsort $__vars] {
if {[array exists $__v]} continue ;
if {$__v in $__ignorelist} continue
lappend __varlist $__v
append __template_variables__ "<li><b>$__v:</b> '[set $__v]'\n"
}
append __template_variables__ "</ul>\n"
set ::template::parse_level $my_parse_level
set template_value "<div class='errorMsg'>Error in Page $name: $__errMsg</div>$content<p>Possible values are$__template_variables__"
}
return $template_value
}
::xowiki::Page instproc pretty_link {{-anchor ""} {-query ""} {-absolute:boolean false} {-siteurl ""} {-lang ""} {-download false} {-path_encode:boolean true}} {
if {${:parent_id} eq "0"} {
set msg "you must not call pretty_link on a page with parent_id 0"
ad_log error $msg
error $msg
}
${:package_id} pretty_link -parent_id ${:parent_id} -anchor $anchor -query $query -absolute $absolute -siteurl $siteurl -lang $lang -download $download -page [self] -path_encode $path_encode ${:name}
}
::xowiki::Page instproc css_class_name {{-margin_form:boolean true}} {
set name ""
if {$margin_form} {
set css [::template::CSS class margin-form]
if {$css ne ""} {
set name "$css "
}
}
return [append name [::xowiki::utility formCSSclass ${:name}]]
}
::xowiki::Page instproc translate {-from -to text} {
set langpair $from|$to
set url http://translate.google.com/#$from/$to/$text
set request [util::http::get -url $url]
set status [dict get $request status]
set data [expr {[dict exists $request page] ? [dict get $request page] : ""}]
if {$status == 200} {
dom parse -html -- $data doc
$doc documentElement root
set n [$root selectNodes {//*[@id="result_box"]}]
:msg "$text $from=>$to node '$n'"
if {$n ne ""} {return [$n asText]}
}
util_user_message -message "Could not translate text, status=$status"
return "untranslated: $text"
}
::xowiki::Page instproc form_field_exists name {
return [info exists ::_form_field_names($name)]
}
::xowiki::Page instproc set_content text {
:text [list [string map [list >> "\n>>" << "<<\n"] [string trim $text " \n"]] text/html]
}
::xowiki::Page instproc can_be_linked {} {
return 1
}
::xowiki::Page instproc condition=is_folder_page {query_context value} {
return [:is_folder_page]
}
::xowiki::Page instproc get_property_from_link_page {property {default {}}} {
if {![:is_link_page]} {
return $default
}
set item_ref [:property link]
::xo::db::CrClass get_instance_from_db -item_id ${:item_id}
set props [::xo::cc cache [list ::${:item_id} compute_link_properties $item_ref]]
if {[dict exists $props $property]} {
return [dict get $props $property]
}
return $default
}
::xowiki::Page instproc copy_content_vars {-from_object:required {-except {}}} {
set excluded_var {
folder_id 1 package_id 1 absolute_links 1 lang_links 1 modifying_user 1
publish_status 1 item_id 1 revision_id 1 last_modified 1
parent_id 1 context_id 1
}
foreach var $except {
dict set excluded_var $var 1
}
foreach var [$from_object info vars] {
if {[string match "__*" $var]} continue
if {![dict exists $excluded_var $var]} {
set :$var [$from_object set $var]
}
}
}
::xowiki::Page instproc www-bulk-delete {} {
::security::csrf::validate
if {![:exists_form_parameter "objects"]} {
:msg "nothing to delete"
}
set instantiate_p [:form_parameter instantiate_p:boolean false]
set item_ids [:get_ids_for_bulk_actions [:form_parameter objects:int32,0..n]]
foreach item_id $item_ids {
:log "bulk-delete: DELETE item_id $item_id"
if {$instantiate_p} {
set i [::xo::db::CrClass get_instance_from_db -item_id $item_id]
$i www-delete
} else {
${:package_id} www-delete -item_id $item_id
}
}
:return_redirect_without_params
}
::xowiki::Page instproc render_icon {} {
return [list text [namespace tail [:info class]] is_richtext false]
}
::xowiki::Page instproc record_last_visited -user_id {
set item_id ${:item_id}
set package_id ${:package_id}
if {![info exists user_id]} {set user_id [::xo::cc set untrusted_user_id]}
if {$user_id > 0} {
::xo::dc transaction {
set rows [xo::dc dml -prepare integer,integer update_last_visisted {
update xowiki_last_visited set time = CURRENT_TIMESTAMP, count = count + 1
where page_id = :item_id and user_id = :user_id
}]
if {$rows ne "" && $rows < 1} {
::xo::dc dml insert_last_visisted "insert into xowiki_last_visited (page_id, package_id, user_id, count, time) values (:item_id, :package_id, :user_id, 1, CURRENT_TIMESTAMP)"
}
}
}
}
::xowiki::Page instproc render_content {} {
lassign ${:text} html mime
if {[:render_adp]} {
set html [:adp_subst $html]
}
return [:substitute_markup $html]
}
::xowiki::Page instproc resolve_included_page_name page_name {
if {$page_name ne ""} {
set page [::${:package_id} resolve_page_name_and_init_context -lang [:lang] $page_name]
if {$page eq ""} {
error "Cannot find page '$page_name' to be included in page '${:name}'"
}
} else {
set page [self]
}
return $page
}
::xowiki::Page instproc substitute_markup {{-context_obj ""} content} {
if {${:mime_type} eq "text/enhanced"} {
set content [ad_enhanced_text_to_html $content]
}
if {!${:do_substitutions}} {
return $content
}
set baseclass [expr {[[:info class] exists RE] ? [:info class] : [self class]}]
$baseclass instvar RE markupmap
set output ""
set l ""
ad_try {
if {$context_obj ne ""} {
:set_resolve_context -package_id [$context_obj package_id] -parent_id [$context_obj item_id]
set :__ignore_self_in_links 1
}
foreach l0 [split $content \n] {
append l [string map $markupmap(escape) $l0]
if {[string first \{\{ $l] > -1 && [string first \}\} $l] == -1} {append l " "; continue}
set l [:regsub_eval $RE(anchor) $l {:anchor "\1"} "1"]
set l [:regsub_eval $RE(div) $l {:div "\1"}]
set l [:regsub_eval $RE(include) $l {:include_content "\1" "\2"}]
regsub -all -- $RE(clean2) $l { \1} l
set l [string map $markupmap(unescape) $l]
append output $l \n
set l ""
}
} on error {errorMsg} {
error $errorMsg
} finally {
if {$context_obj ne ""} {
unset :__ignore_self_in_links
:reset_resolve_context
}
}
return $output
}
::xowiki::Page instproc get_rich_text_spec {field_name default} {
set package_id ${:package_id}
set spec ""
foreach {s widget_spec} [::$package_id get_parameter -check_query_parameter false WidgetSpecs] {
lassign [split $s ,] page_name var_name
set name [expr {[info exists :name] ? ${:name} : $page_name}]
if {[string match $page_name $name] &&
[string match $var_name $field_name]} {
set spec $widget_spec
break
}
}
if {$spec eq ""} {
return $default
}
return $field_name:$spec
}
::xowiki::Page instproc mutual_overwrite_occurred {} {
util_user_message -html -message "[_ xowiki.User] <em>[::xo::get_user_name ${:modifying_user}]</em> [_ xowiki.has_modified_this_page]. [_ xowiki.Please_open] <a href='[ns_quotehtml [::xo::cc url]]' target='_blank'>[_ xowiki.modified_page]</a> [_ xowiki.new_window_or_OK]."
return 1
}
::xowiki::Page instproc www-validate-attribute {} {
set field_names [:field_names]
set validation_errors 0
foreach field_name $field_names {
if {[::xo::cc exists_form_parameter $field_name]} {
set form_fields [:create_form_field $field_name]
set query_field_names $field_name
break
}
}
lassign [:get_form_data -field_names $query_field_names $form_fields] validation_errors category_ids
set error ""
if {$validation_errors == 0} {
set status_code 200
} else {
set status_code 406
foreach f $form_fields {
if {[$f error_msg] ne ""} {
set error [::xo::localize [$f error_msg] 1]
}
}
}
ns_return $status_code text/html $error
}
::xowiki::Page instproc self_link_ids {} {
set parent_id [expr {[info exists :__ignore_self_in_links] ? ${:parent_id} : [:physical_item_id]}]
return [list package_id [:physical_package_id] parent_id $parent_id]
}
::xowiki::Page instproc is_new_entry old_name {
return [expr {${:publish_status} eq "production" && $old_name eq ${:revision_id}}]
}
::xowiki::Page instproc www-create-or-use {{-parent_id 0} {-view_method edit} {-name ""} {-nls_language ""}} {
:www-create-new -parent_id $parent_id -view_method $view_method -name $name -nls_language $nls_language
}
::xowiki::Page instproc physical_item_id {} {
if {[info exists :physical_item_id]} {
return ${:physical_item_id}
} else {
return ${:item_id}
}
}
::xowiki::Page instproc anchor_parent_id {} {
return ${:item_id}
}
::xowiki::Page instproc validate=form_input_fields form_fields {
return 1
}
::xowiki::Page instproc get_html_from_content content {
if {![catch {set l [llength $content]}]
&& $l == 2
&& [string match "text/*" [lindex $content 1]]} {
return [lindex $content 0]
}
return $content
}
::xowiki::Page instproc www-popular-tags {} {
set package ::${:package_id}
set limit [:query_parameter limit:int32 20]
set weblog_page [$package get_parameter weblog_page:graph weblog]
set href [$package pretty_link -parent_id [$package folder_id] $weblog_page]?summary=1
set entries [list]
xo::dc foreach get_popular_tags [::xo::dc select -vars "count(*) as nr, tag" -from "xowiki_tags" -where "item_id = [ns_dbquotevalue ${:item_id}]" -groupby "tag" -orderby "nr" -limit $limit] {
set label [ns_quotehtml "$tag ($nr)"]
lappend entries "<a href='[ns_quotehtml $href&ptag=[ad_urlencode $tag]]'>$label</a>"
}
ns_return 200 text/html "<span class='popular-tags'>[_ xowiki.popular_tags_label]: [join $entries {, }]</span>"
ad_script_abort
}
::xowiki::Page instproc content_header_append text {
append ::__xowiki__content_header $text \n
}
::xowiki::Page instproc find_slot {-start_class name} {
if {![info exists start_class]} {
set start_class [:info class]
}
return [::xowiki::Page find_slot -start_class $start_class $name]
}
::xowiki::Page instproc update {} {
::xo::dc transaction {
next
:instvar object_id creator page_order publish_date description text title
::xo::dc dml update_xowiki_page {update xowiki_page
set creator = :creator,page_order = :page_order,publish_date = :publish_date,description = :description,text = :text,title = :title where page_id = :object_id
}
}
}
::xowiki::Page instproc get_folder -folder_form_ids:required {
set page [self]
while {1} {
if {[$page istype ::xowiki::FormPage]} {
if {[$page is_folder_page]} break
}
set page [::xo::db::CrClass get_instance_from_db -item_id [$page parent_id]]
}
return $page
}
::xowiki::Page instproc evaluate_form_field_condition cond {
return 0
}
::xowiki::Page instproc www-diff {} {
set compare_id [:query_parameter compare_revision_id:int32 0]
if {$compare_id == 0} {
return ""
}
::xo::Page requireCSS urn:ad:css:xowiki-[::template::CSS toolkit]
set my_page [::xowiki::Package instantiate_page_from_id -revision_id ${:revision_id}]
ad_try {
set html1 [$my_page render]
} on error {errorMsg} {
set html1 "Error rendering ${:revision_id}: $errorMsg"
}
set user1 [::xo::get_user_name [$my_page set creation_user]]
set time1 [$my_page set creation_date]
set revision_id1 [$my_page set revision_id]
regexp {^([^.]+)[.]} $time1 _ time1
set other_page [::xowiki::Package instantiate_page_from_id -revision_id $compare_id]
$other_page volatile
ad_try {
set html2 [$other_page render]
} on error {errorMsg} {
set html2 "Error rendering $compare_id: $errorMsg"
}
set user2 [::xo::get_user_name [$other_page set creation_user]]
set time2 [$other_page set creation_date]
set revision_id2 [$other_page set revision_id]
regexp {^([^.]+)[.]} $time2 _ time2
set title "Differences for ${:name}"
set context [list $title]
if {![:exists_query_parameter plain_text_diff]} {
ad_try {
set content [::util::html_diff -old $html2 -new $html1 -show_old_p t]
} on error {errMsg} {
ns_log notice "::util::html_diff failed on comparing page ${:name}, revisions_id ${:revision_id} and $compare_id"
}
}
if {![info exists content]} {
set text1 [ad_html_text_convert -from text/html -to text/plain -- $html1]
set text2 [ad_html_text_convert -from text/html -to text/plain -- $html2]
set content [::xowiki::text_diff_in_html $text2 $text1]
}
::xo::Page set_property doc title $title
array set property_doc [::xo::Page get_property doc]
::xo::Page header_stuff
${:package_id} return_page -adp /packages/xowiki/www/diff -variables {
content title context
time1 time2 user1 user2 revision_id1 revision_id2 property_doc
}
}
::xowiki::Page instproc create_raw_form_field {-name {-slot ""} {-spec ""} {-configuration ""} {-omit_field_name_spec:boolean false} {-nls_language ""} {-form_constraints ""}} {
set save_slot $slot
if {$slot eq ""} {
set slot [::xo::Attribute new -pretty_name $name -datatype text -noinit]
$slot destroy_on_cleanup
}
if {$nls_language eq ""} {
set nls_language [:nls_language]
}
set spec_list [list]
if {[$slot exists spec]} {lappend spec_list [$slot set spec]}
if {$spec ne ""} {lappend spec_list $spec}
if {[$slot exists pretty_name]} {
set label [$slot set pretty_name]
} else {
set label $name
:log "no pretty_name for variable $name in slot $slot"
}
if {[$slot exists default]} {
set default [$slot default]
} else {
set default ""
}
set f [::xowiki::formfield::FormField new -name $name -id [::xowiki::Includelet html_id F.${:name}.$name] -locale $nls_language -label $label -type [expr {[$slot exists datatype] ? [$slot set datatype] : "text"}] -help_text [expr {[$slot exists help_text] ? [$slot set help_text] : ""}] -validator [expr {[$slot exists validator] ? [$slot set validator] : ""}] -required [expr {[$slot exists required] ? [$slot set required] : "false"}] -default $default -spec [join $spec_list ,] -object [self] -slot $save_slot ]
$f destroy_on_cleanup
$f configure {*}$configuration
return $f
}
::xowiki::Page instproc instantiate_includelet arg {
set package_id ${:package_id}
::try {
set page_name [lindex $arg 0]
} on error {errMsg} {
return [:error_in_includelet $arg [_ xowiki.error-includelet-dash_syntax_invalid]]
}
if {[:isclass ::xowiki::includelet::$page_name]} {
set page [::xowiki::includelet::$page_name new -package_id $package_id -name $page_name -locale [::xo::cc locale] -actual_query [::xo::cc actual_query]]
} else {
set page [::$package_id get_page_from_item_ref -use_package_path true -use_site_wide_pages true -use_prototype_pages true -default_lang [:lang] -parent_id ${:parent_id} $page_name]
if {$page ne "" && ![$page exists __decoration]} {
$page set __decoration [::$package_id get_parameter default-portlet-decoration:graph portlet]
}
}
if {$page ne ""} {
$page set __caller_parameters [lrange $arg 1 end]
$page destroy_on_cleanup
set :__last_includelet $page
$page set __including_page [self]
if {[$page istype ::xowiki::Includelet]} {
$page initialize
}
}
return $page
}
::xowiki::Page instproc htmlFooter {{-content ""}} {
if {[info exists :__no_footer]} {return ""}
set package_id ${:package_id}
set footer ""
if {[ns_conn isconnected]} {
set url "[ns_conn location][::xo::cc url]"
set package_url "[ns_conn location][::$package_id package_url]"
}
set tags ""
if {[::$package_id get_parameter with_tags:boolean 1] &&
![:exists_query_parameter no_tags] &&
[::xo::cc user_id] != 0
} {
set tag_content [:include my-tags]
set tag_includelet ${:__last_includelet}
if {[$tag_includelet exists tags]} {
set tags [$tag_includelet set tags]
}
} else {
set tag_content ""
}
if {[::$package_id get_parameter with_digg:boolean 0] && [info exists url]} {
if {![info exists description]} {set description [:get_description $content]}
append footer "<div style='float: right'>" [:include [list digg -description $description -url $url]] "</div>\n"
}
if {[::$package_id get_parameter with_delicious:boolean 0] && [info exists url]} {
if {![info exists description]} {set description [:get_description $content]}
append footer "<div style='float: right; padding-right: 10px;'>" [:include [list delicious -description $description -url $url -tags $tags]] "</div>\n"
}
if {[::$package_id get_parameter with_yahoo_publisher:boolean 0] && [info exists package_url]} {
set publisher [::$package_id get_parameter "my_yahoo_publisher" [::xo::get_user_name [::xo::cc user_id]]]
append footer "<div style='float: right; padding-right: 10px;'>" [:include [list my-yahoo-publisher -publisher $publisher -rssurl "$package_url?rss"]] "</div>\n"
}
if {[::$package_id get_parameter show_page_references:boolean 1]} {
append footer [:include my-references]
}
if {[::$package_id get_parameter show_per_object_categories:boolean 1]} {
set html [:include my-categories]
if {$html ne ""} {
append footer $html <br>
}
set categories_includelet ${:__last_includelet}
}
append footer $tag_content
if {[::$package_id get_parameter with_general_comments:boolean 0] &&
![:exists_query_parameter no_gc]} {
append footer [:include my-general-comments]
}
if {$footer ne ""} {
append footer "<div class='visual-clear'><!-- --></div>"
}
return "<div class='item-footer'>$footer</div>\n"
}
::xowiki::Page instproc is_unprefixed {} {
return [expr {[:is_folder_page]
|| [:is_link_page]
|| ${:name} eq ${:revision_id}
}]
}
::xowiki::Page instproc is_link_page {} {
return 0
}
::xowiki::Page instproc can_contain obj {
return 1
}
::xowiki::Page instproc include_content {arg ch2} {
if {[incr ::xowiki_inclusion_depth] > 10} {
return [:error_in_includelet $arg [_ xowiki.error-includelet-nesting_to_deep]]$ch2
}
if {[regexp {^adp (.*)$} $arg _ adp]} {
try {
lindex $adp 0
} on error {errMsg} {
incr ::xowiki_inclusion_depth -1
return [:error_in_includelet $arg [_ xowiki.error-includelet-adp_syntax_invalid]]$ch2
}
set adp [string map { " "} $adp]
set path_info [:check_adp_include_path [lindex $adp 0]]
if {![dict get $path_info allowed]} {
incr ::xowiki_inclusion_depth -1
return [:error_in_includelet $arg [dict get $path_info msg]]$ch2
}
set adp_fn [dict get $path_info fn]
set adp_args [lindex $adp 1]
if {[llength $adp_args] % 2 == 1} {
incr ::xowiki_inclusion_depth -1
set adp $adp_args
incr ::xowiki_inclusion_depth -1
return [:error_in_includelet $arg [_ xowiki.error-includelet-adp_syntax_invalid]]$ch2
}
lappend adp_args __including_page [self]
set including_page_level [template::adp_level]
ad_try {
set page [template::adp_include $adp_fn $adp_args]
} on error {errorMsg} {
ad_log error "$errorMsg\n$::errorInfo"
set ::template::parse_level $including_page_level
return [:error_in_includelet $arg [_ xowiki.error-includelet-error_during_adp_evaluation]]$ch2
} finally {
incr ::xowiki_inclusion_depth -1
}
return $page$ch2
} else {
set html [:include [:unescape $arg]]
incr ::xowiki_inclusion_depth -1
return $html$ch2
}
}
::xowiki::Page instproc create_form_page_instance {-name:required -package_id -parent_id {-text ""} {-instance_attributes ""} {-default_variables ""} {-nls_language ""} {-state initial} {-creation_user ""} {-publish_status production} {-source_item_id ""}} {
set ia [dict merge [:default_instance_attributes] $instance_attributes]
if {$nls_language eq ""} {
set nls_language [:query_parameter nls_language:wordchar [:nls_language]]
}
if {![info exists package_id]} {
set package_id ${:package_id}
}
if {![info exists parent_id]} {
set parent_id ${:parent_id}
}
if {$creation_user eq ""} {
set context [::$package_id context]
if {![nsf::is object $context]} {
::xo::ConnectionContext require -package_id $package_id -url [::$package_id pretty_link ${:name}]
}
set creation_user [$context user_id]
}
set f [FormPage new -destroy_on_cleanup -name $name -text $text -package_id $package_id -parent_id $parent_id -nls_language $nls_language -publish_status $publish_status -creation_user $creation_user -state $state -instance_attributes $ia -page_template ${:item_id}]
$f initialize
if {$source_item_id ne ""} {
set sourceObj [FormPage get_instance_from_db -item_id $source_item_id]
$f copy_content_vars -from_object $sourceObj -except name
}
foreach {att value} $default_variables {
$f set $att $value
}
$f set __title_prefix ${:title}
return $f
}
::xowiki::Page instproc return_redirect_without_params {} {
::${:package_id} returnredirect [:query_parameter return_url:localurl [ad_urlencode_folder_path [::xo::cc url]]]
}
::xowiki::Page instproc build_name {{-nls_language ""}} {
set name ${:name}
set stripped_name $name
regexp {^..:(.*)$} $name _ stripped_name
if {$stripped_name ne ""} {
if {[:is_folder_page] || [:is_link_page]} {
set name $stripped_name
} else {
if {$nls_language ne ""} {
set :nls_language $nls_language
}
set name [:lang]:$stripped_name
}
}
return $name
}
::xowiki::Page instproc reverse_map_party {-entry -default_party {-create_user_ids 0}} {
set email [expr {[dict exists $entry email] ? [dict get $entry email] : ""}]
if {$email ne ""} {
set id [party::get_by_email -email $email]
if {$id ne ""} { return $id }
}
set username [expr {[dict exists $entry username] ? [dict get $entry username] : ""}]
if {$username ne ""} {
set id [acs_user::get_by_username -username $username]
if {$id ne ""} { return $id }
}
set group_name [expr {[dict exists $entry group_name] ? [dict get $entry group_name] : ""}]
if {$group_name ne ""} {
set id [group::get_id -group_name $group_name]
if {$id ne ""} { return $id }
}
if {$create_user_ids} {
if {$group_name ne ""} {
:log "+++ create a new group group_name=${group_name}"
set group_id [group::new -group_name $group_name]
group::update -group_id $group_id [list join_policy [dict get $entry join_policy]]
ns_log notice "+++ reverse_party_map: we could add members [dict get $entry members] - but we don't"
return $group_id
} else {
:log "+++ create a new user username=${username}, email=${email}"
set status [auth::create_user -username $username -email $email -first_names [dict get $entry first_names] -last_name [dict get $entry last_name] -screen_name [dict get $entry screen_name] -url [dict get $entry url] -nologin]
set creation_status [dict get $status creation_status]
if {$creation_status eq "ok"} {
return [dict get $status user_id]
}
:log "+++ create user username=${username}, email=${email} failed, reason=${creation_status}"
}
}
return $default_party
}
::xowiki::Page instproc lookup_form_field {-name:required form_fields} {
:form_field_index $form_fields
set key ::_form_field_names($name)
if {[info exists $key]} {
return [set $key]
}
foreach name_and_spec [:get_form_constraints] {
regexp {^([^:]+):(.*)$} $name_and_spec _ spec_name short_spec
if {[string match $spec_name $name]} {
set f [:create_form_fields_from_form_constraints [list $name:$short_spec]]
set $key $f
return $f
}
}
set components [split $name .]
set path [lindex $components 0]
foreach c [lrange $components 1 end] {
if {[string is integer -strict $c]} {
if {[info exists ::_form_field_names($path)]} {
set repeatField [set ::_form_field_names($path)]
set max [$repeatField max]
if {$max > $c} {
set max $c
}
for {set i 1} {$i <= $max} {incr i} {
if {![info exists ::_form_field_names($path.$i)]} {
set f [$repeatField require_component $i]
:form_field_index $f
}
}
} else {
:__debug_known_field_names "<$path> needed to create <$path.$c>"
}
}
append path . $c
}
if {[info exists $key]} {
return [set $key]
}
if {$name ni {langmarks fontname fontsize formatblock} && ![string match *__locale $name]} {
set names [list]
foreach f $form_fields {lappend names [$f name]}
:msg "No form field with name '$name' found (available fields: [lsort [array names ::_form_field_names]])"
ns_log warning "====== lookup_form_field: No form field with name '$name' found" "(available fields: [lsort [array names ::_form_field_names]])"
}
set f [:create_form_fields_from_form_constraints [list $name:text]]
set $key $f
return $f
}
::xowiki::Page instproc normalize_internal_link_name {name stripped_name lang} {
set anchor ""
set query ""
regexp {^([^#]*)(\#|%23)(.*)$} $stripped_name _ stripped_name . anchor
regexp {^(.*)[?]([^?]+)$} $stripped_name _ stripped_name query
if {$stripped_name eq ""} {
regexp {:([^:]+)$} $name _ stripped_name
}
set normalized_name [::${:package_id} normalize_name $stripped_name]
if {$lang eq ""} {set lang [:lang]}
if {$name eq ""} {set name $lang:$normalized_name}
return [list name $name lang $lang normalized_name $normalized_name anchor $anchor query $query]
}
::xowiki::Page instproc content_header_get {} {
if {[info exists ::__xowiki__content_header]} {
return $::__xowiki__content_header
}
}
::xowiki::Page instproc anchor arg {
ad_try {
set l [:create_link $arg]
} on error {errorMsg} {
return "<div class='errorMsg'>Error during processing of anchor ${arg}:<blockquote>$errorMsg</blockquote></div>"
}
if {$l eq ""} {
return ""
}
if {[info exists :__RESOLVE_LOCAL] && [$l exists is_self_link] && [$l is_self_link]} {
:set_resolve_context -package_id [:physical_package_id] -parent_id [:physical_parent_id]
$l parent_id [:anchor_parent_id]
set html [$l render]
:reset_resolve_context
} else {
set html [$l render]
}
if {[info commands $l] ne ""} {
$l destroy
} else {
ns_log notice "link object already destroyed. This might be due to a recursive inclusion"
}
return $html
}
::xowiki::Page instproc map_categories category_ids {
category::map_object -remove_old -object_id ${:item_id} $category_ids
}
::xowiki::Page instproc physical_package_id {} {
if {[info exists :physical_package_id]} {
return ${:physical_package_id}
} else {
return ${:package_id}
}
}
::xowiki::Page instproc build_instance_attribute_map form_fields {
if {![info exists :__instance_attribute_map]} {
set :__instance_attribute_map [dict create]
}
foreach f $form_fields {
set multiple [expr {[$f exists multiple] ? [$f set multiple] : 0}]
if {[$f exists category_tree] && [$f exists is_category_field]} {
dict set :__instance_attribute_map [$f name] [list category [$f category_tree] $multiple]
:category_export [$f category_tree]
} elseif {[$f exists is_party_id]} {
dict set :__instance_attribute_map [$f name] [list party_id $multiple]
} elseif {[$f istype "::xowiki::formfield::file"]} {
dict set :__instance_attribute_map [$f name] [list file 0]
}
}
return ${:__instance_attribute_map}
}
::xowiki::Page instproc demarshall {-parent_id -package_id -creation_user {-create_user_ids 0}} {
unset -nocomplain -- :context_id
set :parent_id $parent_id
set :package_id $package_id
:reverse_map_party_attribute -attribute creation_user -default_party $creation_user -create_user_ids $create_user_ids
:reverse_map_party_attribute -attribute modifying_user -default_party $creation_user -create_user_ids $create_user_ids
if {![info exists :page_order]} {set :page_order ""}
set is_folder_page [:is_folder_page]
if {$is_folder_page} {
set :name [:build_name]
} else {
if {[regexp {^(..):} ${:name} _ lang]} {
if {[string range [:nls_language] 0 1] ne $lang} {
set old_nls_language [:nls_language]
:nls_language [:get_nls_language_from_lang $lang]
ns_log notice "nls_language for item ${:name} set from $old_nls_language to [:nls_language]"
}
}
}
}
::xowiki::Page instproc stats_record_count name {
ns_log error "the method Page->stats_record_count should not be called"
}
::xowiki::Page instproc www-save-tags {} {
::xowiki::Page save_tags -user_id [::xo::cc user_id] -item_id ${:item_id} -revision_id ${:revision_id} -package_id ${:package_id} [:form_parameter new_tags:0..n]
::${:package_id} returnredirect [:query_parameter return_url:localurl [ad_return_url]]
}
::xowiki::Page instproc www-view {{content {}}} {
::xowiki::Page set recursion_count 0
set page_package_id ${:package_id}
set context_package_id [::xo::cc package_id]
set folder_id [::$page_package_id folder_id]
set template_file [ns_normalizepath [:query_parameter "template_file" [::$context_package_id get_parameter template_file:graph view-default]]]
if {[nsf::is object ::xowiki::$template_file]} {
$template_file before_render [self]
}
set object_type [::$page_package_id get_parameter object_type:graph [:info class]]
set rev_link [::$page_package_id make_link [self] revisions]
if {[::$context_package_id query_parameter m:token ""] eq "edit"} {
set view_link [::$page_package_id make_link [self] view return_url]
set edit_link ""
} else {
set edit_link [::$page_package_id make_link [self] edit return_url]
set view_link ""
}
set delete_link [::$page_package_id make_link [self] delete return_url]
if {[info exists :__link(new)]} {
set new_link [set :__link(new)]
} else {
set new_link [:new_link $page_package_id]
}
set admin_link [::$context_package_id make_link -privilege admin -link admin/ ::$context_package_id]
set index_link [::$context_package_id make_link -privilege public ::$context_package_id]
set view_link [::$page_package_id make_link [self] view return_url]
set notification_subscribe_link ""
if {[::$context_package_id get_parameter with_notifications:boolean 1]} {
if {[::xo::cc user_id] != 0} {
set notifications_return_url [expr {[info exists return_url] ? $return_url : [ad_return_url]}]
set notification_type [notification::type::get_type_id -short_name xowiki_notif]
set notification_text "Subscribe to [::$context_package_id instance_name]"
set notification_subscribe_link [export_vars -base /notifications/request-new {{return_url $notifications_return_url}
{pretty_name $notification_text}
{type_id $notification_type}
{object_id $context_package_id}}]
set notification_image "<adp:icon name='envelope' title='[ns_quotehtml $notification_text]'>"
}
}
if {$content eq ""} {
set content [:content_header_get][:render]
} else {
set content [:content_header_get]$content
}
set autoname [::$page_package_id get_parameter autoname:boolean 0]
set footer [:htmlFooter -content $content]
set top_includelets ""
set vp [string trim [::$context_package_id get_parameter top_includelet ""]]
if {$vp ne "" && $vp ne "none"} {
set top_includelets [:include $vp]
}
if {[::$context_package_id get_parameter MenuBar:boolean 0]} {
set folderhtml [:include {folders -style folders}]
::xo::Page set_property body folderHTML $folderhtml
set mb [::xowiki::MenuBar info instances -closure]
if {$mb ne ""} {
set mbHTML [$mb render-preferred]
::xo::Page set_property body menubarHTML $mbHTML
}
}
if {[::$context_package_id get_parameter with_user_tracking:boolean 1]} {
:record_last_visited
}
if {[::$context_package_id get_parameter with_views_package_if_available:boolean 1]
&& [info commands ::views::record_view] ne ""} {
views::record_view -object_id ${:item_id} -viewer_id [::xo::cc user_id]
array set views_data [views::get -object_id ${:item_id}]
}
if {[:exists_query_parameter return_url]} {
set return_url [:query_parameter return_url:localurl]
}
set master [::$context_package_id get_parameter master:boolean 1]
if {![string is boolean -strict $master]} {
ad_return_complaint 1 "value of master is not boolean"
ad_script_abort
}
if {$master} {
set context [list ${:title}]
::xo::Page set_property doc title "[::$context_package_id instance_name] - ${:title}"
::xo::Page set_property body title ${:title}
set template ""
set page [self]
foreach css [::$context_package_id get_parameter extra_css:localurl ""] {
::xo::Page requireCSS -order 10 $css
}
::xo::cc unset -nocomplain cache([list $context_package_id get_parameter template_file:graph])
set template_file [:query_parameter "template_file" [::$context_package_id get_parameter template_file:graph view-default]]
if {[string range $template_file 0 0] eq "/"} {
ns_log warning "ignore template as specified in parameter 'template_file'" "on non-standard location: $template_file. The template should be" " under\n/packages/[${:package_id} package_key]/resources/templates/..."
set template_file [::$context_package_id get_parameter -check_query_parameter false -nocache template_file view-default]
}
set validated_template_file [::${:package_id} get_adp_template $template_file]
if {$validated_template_file eq ""} {
ns_log error "invalid template specified in parameter 'template_file': '$template_file'"
}
set template_file $validated_template_file
template::head::add_css -href urn:ad:css:xowiki-[::template::CSS toolkit] -order 0
if {$footer ne ""} {
template::add_body_script -script {
function get_popular_tags(popular_tags_link, prefix) {
var http = new XMLHttpRequest();
http.open('GET', popular_tags_link, true);
http.onreadystatechange = function() {
if (http.readyState == 4) {
if (http.status != 200) {
alert('Something wrong in HTTP request, status code = ' + http.status);
} else {
var e = document.getElementById(prefix + '-popular_tags');
e.innerHTML = http.responseText;
e.style.display = 'block';
}
}
};
http.send(null);
}
}
}
::xo::Page header_stuff
if {![info exists :description]} {
set :description [:get_description $content]
}
if {[info commands ::template::head::add_meta] ne ""} {
::xo::Page set_property doc title_lang [:lang]
set meta(description) [:description]
set meta(keywords) ""
if {[:istype ::xowiki::FormPage]} {
set meta(keywords) [string trim [:property keywords]]
if {[:property html_title] ne ""} {
::xo::Page set_property doc title [:property html_title]
}
}
if {$meta(keywords) eq ""} {
set meta(keywords) [::$context_package_id get_parameter keywords ""]
}
foreach i [array names meta] {
if {$meta($i) eq ""} continue
template::head::add_meta -name $i -content $meta($i)
}
}
array set body [::xo::Page get_property body]
array set doc [::xo::Page get_property doc]
if {$page_package_id != $context_package_id} {
set page_context [::$page_package_id instance_name]
}
if {$template ne ""} {
set __including_page $page
set __adp_stub [::$context_package_id get_adp_template view-default]
set template_code [template::adp_compile -string $template]
append template_code {
if { [info exists __adp_master] } {
set __adp_output [template::adp_parse $__adp_master [concat [list __adp_slave $__adp_output] [array get __adp_properties]]]
}
}
ad_try {
set content [template::adp_eval template_code]
ns_return 200 text/html $content
} on error {errMsg} {
ns_return 200 text/html "Error in Page ${:name}: $errMsg<br>$template"
}
ad_script_abort
} else {
set package_id $context_package_id
set title ${:title}
set name ${:name}
set item_id ${:item_id}
::$context_package_id return_page -adp $template_file -variables {
name title item_id context return_url
content footer package_id page_package_id page_context
rev_link edit_link delete_link new_link admin_link index_link view_link
notification_subscribe_link notification_image
top_includelets page views_data body doc
}
}
} else {
set :mime_type [::xo::cc get_parameter content-type:graph text/html]
return $content
}
}
::xowiki::Page instproc www-list {} {
if {[:is_form] && ![:exists_query_parameter children]} {
set :description "form-usages for ${:name} ${:title}"
return [:www-view [:include [list form-usages -form_item_id ${:item_id}]]]
}
if {[:is_folder_page] || [:exists_query_parameter children]} {
return [:www-view [:include [list child-resources -publish_status all]]]
}
${:package_id} returnredirect [ad_return_url]
}
::xowiki::Page instproc notification_notify {} {
::xowiki::notification::do_notifications -page [self]
}
::xowiki::Page instproc __debug_known_field_names msg {
set fields {}
foreach name [lsort [array names ::_form_field_names]] {
set f $::_form_field_names($name)
append fields " $name\t[$f info class]\t [$f spec]\n"
}
append fields "Repeat container:\n"
foreach f [::xowiki::formfield::repeatContainer info instances] {
append fields "$f\t[$f name]\t [$f spec]\n"
foreach component [$f components] {
append fields "... [$component name]\t[$component info class]\t [$component spec]\n"
if {[$component istype ::xowiki::formfield::CompoundField]} {
foreach c [$component components] {
append fields "..... [$c name]\t[$c info class]\t [$c spec]\n"
}
}
}
}
}
::xowiki::Page instproc field_names {{-form ""}} {
array set dont_modify {item_id 1 revision_id 1 object_id 1 object_title 1 page_id 1 name 1}
set field_names [list]
foreach field_name [[:info class] array names db_slot] {
if {[info exists dont_modify($field_name)]} {
continue
}
lappend field_names _$field_name
}
return $field_names
}
::xowiki::Page instproc render {{-update_references unresolved} {-with_footer:boolean true}} {
array set :lang_links {found "" undefined ""}
:references clear
if {[info exists :__extra_references]} {
foreach ref ${:__extra_references} {
:references resolved $ref
}
unset :__extra_references
}
set content [:render_content]
set unresolved_references [:references get unresolved]
if {$update_references eq "all"
|| ($update_references eq "unresolved" && [llength $unresolved_references] > 0)
} {
:references_update [lsort -unique [:references get resolved]] [lsort -unique $unresolved_references]
}
if {$with_footer && [::xo::cc get_parameter content-type:graph text/html] eq "text/html"} {
append content "<DIV class='content-chunk-footer'>"
if {![info exists :__no_footer] && ![::xo::cc get_parameter __no_footer:boolean 0]} {
append content [:footer]
}
append content "</DIV>\n"
}
return $content
}
::xowiki::Page instproc pretty_name {} {
return ${:name}
}
::xowiki::Page instproc get_target_from_link_page {{-depth 10}} {
set item_id [:get_property_from_link_page item_id 0]
if {$item_id == 0} {return ""}
set target [::xo::db::CrClass get_instance_from_db -item_id $item_id]
set target_package_id [$target package_id]
if {$target_package_id != ${:package_id}} {
::xowiki::Package require $target_package_id
}
if {$depth > 1 && [$target is_link_page]} {
set target [:get_target_from_link_page -count [expr {$depth - 1}]]
}
return $target
}
::xowiki::Page instproc create_form_fields_from_form_constraints {-lookup:switch form_constraints} {
set form_fields [list]
foreach name_and_spec $form_constraints {
regexp {^([^:]+):(.*)$} $name_and_spec _ spec_name short_spec
if {[string match "@table*" $spec_name]
|| $spec_name in {@categories @cr_fields}
} continue
if {$lookup && [:form_field_exists $spec_name]} {
lappend form_fields [:lookup_form_field -name $spec_name {}]
} else {
lappend form_fields [:create_raw_form_field -name $spec_name -slot [:find_slot $spec_name] -spec $short_spec -form_constraints $form_constraints ]
}
}
return $form_fields
}
::xowiki::Page instproc edit_set_default_values {} {
foreach name_and_spec [list name title page_order:graph last_page_id:int32 nls_language:oneof,arg=[join [lang::system::get_locales] |] ] {
set p [string first : $name_and_spec]
set key [expr {$p > -1 ? [string range $name_and_spec 0 $p-1] : $name_and_spec}]
if {[::${:package_id} exists_query_parameter $key]} {
set :$key [::${:package_id} query_parameter $name_and_spec]
}
}
}
::xowiki::Page instproc serialize_relocatable {} {
if {[::package vcompare [package require xotcl::serializer] 2.1] > -1} {
set content [:serialize -target [string trimleft [self] :]]
} else {
set content [:serialize]
regsub { ::([0-9]+) } $content { \1 } content
regsub -all -- {\n::([0-9]+) } $content "\n\\1 " content
}
return $content
}
::xowiki::Page instproc check_unresolved_references {} {
set parent_id ${:parent_id}
set name ${:name}
foreach i [xo::dc list -prepare integer,text items_with_unresolved_references {
SELECT page from xowiki_unresolved_references
WHERE parent_id = :parent_id
AND name = :name
}] {
set page [::xo::db::CrClass get_instance_from_db -item_id $i]
$page render -update_references all -with_footer false
}
}
::xowiki::Page instproc notification_subject {-instance_name {-category_label ""} -state} {
if {$category_label eq ""} {
return "\[$instance_name\]: ${:title} ($state)"
} else {
return "\[$instance_name\] $category_label: ${:title} ($state)"
}
}
::xowiki::Page instproc www-clipboard-clear {} {
::xowiki::clipboard clear
:return_redirect_without_params
}
::xowiki::Page instproc set_resolve_context {-package_id:required -parent_id:required -item_id} {
set stack_entry [list -package_id ${:package_id} -parent_id ${:parent_id} -item_id ${:item_id}]
lappend :resolve_context_stack $stack_entry
if {${:parent_id} != $parent_id} {
if {![info exists :physical_parent_id]} {
set :physical_parent_id ${:parent_id}
}
set :parent_id $parent_id
}
if {${:package_id} != $package_id} {
if {![info exists :physical_package_id]} {
set :physical_package_id ${:package_id}
}
set :package_id $package_id
}
if {[info exists item_id] && ${:item_id} != $item_id} {
if {![info exists :physical_item_id]} {
set :physical_item_id ${:item_id}
}
set :item_id $item_id
}
}
::xowiki::Page instproc get_parent_object {} {
set parent_id ${:parent_id}
if {$parent_id > 0} {
if {! [nsf::is object ::$parent_id] } {
::xo::db::CrClass get_instance_from_db -item_id $parent_id
}
return ::$parent_id
}
return ""
}
::xowiki::Page instproc new_link {-object_type -name -title -nls_language -return_url -parent_id page_package_id} {
if {[info exists parent_id] && $parent_id eq ""} {
unset parent_id
}
return [::$page_package_id make_link $page_package_id edit-new object_type name title nls_language return_url parent_id autoname]
}
::xowiki::Page instproc footer {} {
return ""
}
::xowiki::Page instproc default_instance_attributes {} {
return [list]
}
::xowiki::Page instproc can_save {} {
set parent [:get_parent_object]
if {$parent ne "" && [$parent istype ::xowiki::Page]} {
return [$parent can_contain [self]]
}
return 1
}
::xowiki::Page instproc save_new args {
if {![:can_save]} {error "can't save this page under this parent"}
${:package_id} flush_page_fragment_cache
set id [next]
:check_unresolved_references
return $id
}
::xowiki::Page instproc detail_link {} {
if {[info exists :instance_attributes]} {
if {[dict exists ${:instance_attributes} detail_link]
&& [dict get ${:instance_attributes} detail_link] ne ""} {
return [dict get ${:instance_attributes} detail_link]
}
}
return [:pretty_link]
}
::xowiki::Page instproc validate=name name {
upvar nls_language nls_language
set success [::xowiki::validate_name [self]]
if {$success} {
set actual_length [string length $name]
set max_length 400
if {$actual_length > $max_length} {
set errorMsg [_ acs-tcl.lt_name_is_too_long__Ple [list name $name max_length $max_length actual_length $actual_length]]
set success 0
}
} else {
if {![:istype ::xowiki::File] && [regexp {^[a-zA-Z][a-zA-Z]:$} $name]} {
set errorMsg [_ xowiki.Page-validate_name-invalid_name [list value $name]]
} else {
set errorMsg [_ xowiki.Page-validate_name-duplicate_item [list value $name]]
}
}
if {$success} {
set :name $name
} else {
uplevel [list set errorMsg $errorMsg]
}
return $success
}
::xowiki::Page instproc rename {-old_name -new_name} {
${:package_id} flush_name_cache -name $old_name -parent_id ${:parent_id}
next
:log "----- rename <$old_name> to <$new_name>"
}
::xowiki::Page instproc error_during_render msg {
return "<div class='errorMsg'>$msg</div>"
}
::xowiki::Page instproc check_adp_include_path adp_fn {
if {[string match "admin/*" $adp_fn]} {
set allowed [::xo::cc permission -object_id ${:package_id} -privilege admin -party_id [::xo::cc user_id]]
if {!$allowed} {
return [list allowed $allowed msg "Page can only be included by an admin!" fn ""]
}
}
if {[regexp {^/www/templates/(.*)$} $adp_fn . widget]} {
return [list allowed 1 msg "" fn /packages/openacs-bootstrap3-theme/resources/widgets/$widget]
}
if {[string match "/*" $adp_fn] || [string match "../*" $adp_fn]} {
return [list allowed 0 msg "Invalid name for adp_include" fn ""]
}
return [list allowed 1 msg "" fn /packages/[::${:package_id} package_key]/lib/$adp_fn]
}
::xowiki::Page instproc www-clipboard-export {} {
set clipboard [::xowiki::clipboard get]
::xowiki::exporter export $clipboard
ns_conn close
::xowiki::clipboard clear
ad_script_abort
}
::xowiki::Page instproc www-csv-dump {} {
if {![:is_form]} {
error "not called on a form"
}
set form_item_id ${:item_id}
set items [::xowiki::FormPage get_form_entries -base_item_ids $form_item_id -form_fields "" -initialize false -publish_status all -package_id ${:package_id}]
foreach i [$items children] {array set vars [$i set instance_attributes]}
array set vars [list _name 1 _last_modified 1 _creation_user 1]
set attributes [lsort -dictionary [array names vars]]
set includelet_key name:form-usages,form_item_ids:$form_item_id,field_names:[join $attributes " "],
::xo::cc set queryparm(includelet_key) [ns_base64urlencode $includelet_key]
:www-view [:include [list form-usages -field_names $attributes -extra_form_constraints _creation_user:numeric,format=%d -form_item_id ${:item_id} -generate csv]]
}
::xowiki::Page instproc get_instance_attributes {} {
if {[info exists :instance_attributes]} {
return ${:instance_attributes}
}
return ""
}
::xowiki::Page instproc edit_set_file_selector_folder {} {
if {[info commands ::dotlrn_fs::get_community_shared_folder] ne ""} {
set cid [::dotlrn_community::get_community_id]
if {$cid ne ""} {
return [::dotlrn_fs::get_community_shared_folder -community_id $cid]
}
}
return ""
}
::xowiki::Page instproc www-autosave-attribute {} {
set field_names [:field_names]
set provided_form_parameters [xo::cc get_all_form_parameter]
set keys [dict keys $provided_form_parameters]
if {[llength $keys] == 1} {
set key [lindex $keys 0]
set value [::xo::cc form_parameter $key]
ns_log notice "[self] autosave-attribute save '$key' <$value>"
set prefix ""
regexp {^([^.]+)[.]} $key . prefix
if {$prefix ne "" && $prefix in $field_names} {
if {[dict exists ${:instance_attributes} $prefix]} {
set innerDict [dict get ${:instance_attributes} $prefix]
} else {
set innerDict ""
}
dict set innerDict $key $value
dict set :instance_attributes $prefix $innerDict
set s [:find_slot instance_attributes]
:update_attribute_from_slot $s ${:instance_attributes}
ns_return 200 text/plain ok
} elseif {$prefix eq "" && $key in $field_names} {
if {[string match _* $key]} {
set s [:find_slot [string range $key 1 end]]
:update_attribute_from_slot $s $value
} else {
set s [:find_slot instance_attributes]
dict set :instance_attributes $key $value
:update_attribute_from_slot $s ${:instance_attributes}
}
ns_return 200 text/plain ok
} else {
ns_return 404 text/plain "not ok"
ns_log error "autosave attribute: unexpected field name <$key>" "(prefix '$prefix'), not contained in <$field_names> " "value [llength $value] bytes"
}
} else {
ns_log warning "autosave attribute: expecting a single form parameter with a prefix keys <$keys>"
ns_return 404 text/plain "not ok"
}
ns_log notice "SAVE-att DONE"
ad_script_abort
}
::xowiki::Page instproc include {-configure arg} {
set page [:instantiate_includelet $arg]
if {$page eq "" || ![nsf::is object $page]} {
set page_name [ns_quotehtml $arg]
return [:error_during_render [_ xowiki.error-includelet-unknown]]
}
if {[$page istype ::xowiki::Page]} {
set package_id [$page package_id]
set allowed [[::$package_id set policy] check_permissions -package_id $package_id -user_id [::xo::cc set untrusted_user_id] $page view]
if {!$allowed} {
return "<div class='errorMsg'>Insufficient privileges to view content of [$page name].</div>"
}
}
if {[info exists configure]} {
$page configure {*}$configure
}
return [:render_includelet $page]
}
::xowiki::Page instproc map_party {-property party_id} {
if {$party_id eq "" || $party_id == 0} {
return $party_id
}
ad_try {
acs_user::get -user_id $party_id -array info
set result [list]
foreach a {username email first_names last_name screen_name url} {
lappend result $a $info($a)
}
:log "-- map_party $party_id: $result"
return $result
} on error {errorMsg} {
}
ad_try {
group::get -group_id $party_id -array info
:log "got group info: [array get info]"
set result [array get info]
set members {}
foreach member_id [group::get_members -group_id $party_id] {
lappend members [:map_party -property $property $member_id]
}
lappend result members $members
ns_log notice "-- map_party $party_id: $result"
return $result
} on error {errorMsg} {
}
ns_log warning "Cannot map party_id $party_id, probably not a user; property $property lost during export"
return {}
}
::xowiki::Page instproc changed_redirect_url {} {
if {[::${:package_id} exists_query_parameter "return_url"]} {
return ""
}
return [:pretty_link]
}
::xowiki::Page instproc get_query_parameter_return_url {{default {}}} {
set return_url [:query_parameter return_url:localurl $default]
return $return_url
}
::xowiki::Page instproc save args {
if {![:can_save]} {error "can't save this page under this parent"}
${:package_id} flush_page_fragment_cache
set id [next]
:check_unresolved_references
return $id
}
::xowiki::Page instproc validate=page_order value {
if {[info exists :page_order]} {
set page_order [string trim $value " ."]
set :page_order $page_order
return [expr {![regexp {[^0-9a-zA-Z_.]} $page_order]}]
}
return 1
}
::xowiki::Page instproc render_includelet includelet {
foreach {att value} [$includelet set __caller_parameters] {
switch -- $att {
-decoration {$includelet set __decoration $value}
-title {$includelet set title $value}
-id {$includelet set id $value}
}
}
if {[$includelet exists __decoration] && [$includelet set __decoration] ne "none"} {
$includelet mixin add ::xowiki::includelet::decoration=[$includelet set __decoration]
}
set includeletClass [$includelet info class]
if {[$includeletClass exists cacheable] && [$includeletClass set cacheable]} {
$includelet mixin add ::xowiki::includelet::page_fragment_cache
}
if {[$includelet istype ::xowiki::Includelet]} {
$includelet include_head_entries
}
set html ""
ad_try {
set html [$includelet render]
} on error {errorMsg} {
set errorCode $::errorCode
set errorInfo $::errorInfo
if {[string match "*for parameter*" $errorMsg]} {
ad_return_complaint 1 [ns_quotehtml $errorMsg]
ad_script_abort
} else {
ad_log error "render_includelet $includeletClass led to: $errorMsg ($errorCode)\n$errorInfo"
set page_name [$includelet name]
set ::errorInfo [::xowiki::Includelet html_encode $errorInfo]
set html [:error_during_render [_ xowiki.error-includelet-error_during_render]]
}
}
return $html
}
::xowiki::Page instproc save_data {{-use_given_publish_date:boolean false} old_name category_ids} {
:unset_temporary_instance_variables
set package_id ${:package_id}
::xo::dc transaction {
if {[:is_new_entry $old_name]} {
if {![::$package_id get_parameter production_mode:boolean 0]} {
set :publish_status "ready"
}
}
:map_categories $category_ids
set queue ::__xowiki__transaction_queue(${:item_id})
if {[info exists $queue]} {
foreach cmd [set $queue] {
{*}$cmd
}
}
:save -use_given_publish_date $use_given_publish_date
if {$old_name ne ${:name}} {
:rename -old_name $old_name -new_name ${:name}
}
:notification_notify
}
return ${:item_id}
}
::xowiki::Page instproc www-clipboard-add {} {
if {![:exists_form_parameter "objects"] && [ns_conn method] eq "POST"} {
:msg "nothing to copy"
}
::xowiki::clipboard add [:get_ids_for_bulk_actions [:form_parameter objects:int32,0..n]]
if {[ns_set iget [ns_conn headers] "X-Requested-With"] eq "XMLHttpRequest"} {
ns_log notice "HEADERS: got X-Requested-With"
return OK
} else {
:return_redirect_without_params
}
}
::xowiki::Page instproc reverse_map_party_attribute {-attribute {-default_party 0} {-create_user_ids 0}} {
if {![info exists :$attribute]} {
set :$attribute $default_party
} elseif {[llength [set :$attribute]] < 2} {
set :$attribute $default_party
} else {
set :$attribute [:reverse_map_party -entry [set :$attribute] -default_party $default_party -create_user_ids $create_user_ids]
}
}
::xowiki::Page instproc add_computed_instance_attributes {} {
}
::xowiki::Page instproc marshall {{-mode export}} {
:unset_temporary_instance_variables
set old_creation_user [:creation_user]
set old_modifying_user ${:modifying_user}
set :creation_user [:map_party -property creation_user $old_creation_user]
set :modifying_user [:map_party -property modifying_user $old_modifying_user]
if {$mode eq "export" && [:is_new_entry ${:name}]} {
set server [ns_info server]
set port [ns_config ns/server/${server}/module/nssock port]
set new_name [ns_info address]:${port}-${:item_id}
}
if {[info exists new_name]} {
set old_name ${:name}
set :name $new_name
set content [:serialize_relocatable]
set :name $old_name
} else {
set content [:serialize_relocatable]
}
set :creation_user $old_creation_user
set :modifying_user $old_modifying_user
return $content
}
::xowiki::Page instproc get_form_data {-field_names form_fields} {
set validation_errors 0
set category_ids [list]
array set containers [list]
set cc [::${:package_id} context]
if {![info exists field_names]} {
set field_names [list]
foreach att [$cc array names form_parameter] {
if {[regexp {^[\w.]+(\.(tmpfile|content-type))?$} $att]} {
lappend field_names $att
} else {
ad_log warning "Page get_form_data: field name '$att' was skipped. Received field names: [$cc array names form_parameter]"
}
}
}
foreach att $field_names {
set processed($att) 1
switch -glob -- $att {
__category_* {
set f [:lookup_form_field -name $att $form_fields]
if {![$f is_disabled]} {
set value [$f value [$cc form_parameter $att]]
foreach v $value {lappend category_ids $v}
}
}
__* {
}
_* {
set f [:lookup_form_field -name $att $form_fields]
if {![$f is_disabled]} {
set value [$f value [string trim [$cc form_parameter $att]]]
set varname [string range $att 1 end]
if {[string first . $att] == -1} {
set :$varname $value
}
}
}
default {
if {[regexp {^(.+)[.](tmpfile|content-type)} $att _ file field]} {
set f [:lookup_form_field -name $file $form_fields]
if {![$f is_disabled]} {
$f $field [string trim [$cc form_parameter $att]]
}
} else {
set f [:lookup_form_field -name $att $form_fields]
if {![$f is_disabled]} {
set value [$f value [string trim [$cc form_parameter $att]]]
if {[string first . $att] == -1} {
dict set :instance_attributes $att $value
}
if {[$f exists is_category_field]} {
foreach v $value {
lappend category_ids $v
}
}
}
}
}
}
if {[string first . $att] > -1} {
lassign [split $att .] container component
lappend containers($container) $component
}
}
set leaf_components {}
set container_fields {}
foreach f $form_fields {
if {[$f istype ::xowiki::formfield::CompoundField]} {
lappend leaf_components {*}[$f leaf_components]
lappend container_fields $f
set processed([$f name]) 1
}
}
foreach f [concat $form_fields $leaf_components] {
set att [$f name]
if {![info exists processed($att)]
&& ![$f exists is_repeat_template]
&& ![$f is_disabled]
} {
switch -glob -- $att {
__* {
}
_* {
set varname [string range $att 1 end]
set default ""
if {[info exists :$varname]} {set default [set :$varname]}
set v [$f value_if_nothing_is_returned_from_form $default]
set value [$f value $v]
if {$v ne $default} {
if {[string first . $att] == -1} {
set :$varname $value
}
}
}
default {
set default ""
if {[dict exists ${:instance_attributes} $att]} {
set default [dict get ${:instance_attributes} $att]
}
set v [$f value_if_nothing_is_returned_from_form $default]
set value [$f value $v]
if {[string first . $att] == -1} {
dict set :instance_attributes $att $value
}
}
}
}
}
foreach f $container_fields {
set name [$f name]
if {![$f is_disabled]} {
dict set :instance_attributes $name [$f value]
} elseif {[dict exists ${:instance_attributes} $name]} {
$f value [dict get ${:instance_attributes} $name]
}
}
foreach f [concat $form_fields] {
set validation_error [$f validate [self]]
if {$validation_error ne ""} {
$f error_msg $validation_error
incr validation_errors
}
}
set current_revision_id [$cc form_parameter __current_revision_id ""]
if {$validation_errors == 0
&& $current_revision_id ne ""
&& $current_revision_id != ${:revision_id}
} {
set validation_errors [:mutual_overwrite_occurred]
ad_log warning "mutual_overwrite occurred, current_revision_id <$current_revision_id> my ${:revision_id}"
}
if {[:validate=form_input_fields $form_fields] == 0} {
incr validation_errors
}
if {$validation_errors == 0} {
foreach f $form_fields {
if {![$f is_disabled]} {
$f convert_to_internal
}
}
} else {
:log validation_errors=$validation_errors
foreach f $form_fields {
$f reset_on_validation_error
}
}
return [list $validation_errors [lsort -unique $category_ids]]
}
::xowiki::Page instproc www-duplicate {} {
::xowiki::clipboard clear
::xowiki::clipboard add [list ${:item_id}]
if {![regexp {^(.*[-]copy-)\d+} ${:name} . stem]} {
set stem ${:name}-copy-
}
set new_name [::xowiki::autoname new -name $stem -parent_id ${:package_id}]
set old_name ${:name}
ad_try {
set :name $new_name
:www-clipboard-copy
} finally {
set :name $old_name
::xo::xotcl_object_cache flush ${:item_id}
}
}
::xowiki::Page instproc reset_resolve_context {} {
if {![info exists :resolve_context_stack] || [llength ${:resolve_context_stack}] < 1} {
error "set_resolve_context and reset_resolve_context calls not balanced"
}
set entry [lindex ${:resolve_context_stack} end]
set :resolve_context_stack [lrange ${:resolve_context_stack} 0 end-1]
:configure {*}$entry
if {[llength ${:resolve_context_stack}] == 0} {
unset :resolve_context_stack
foreach att {item package parent} {
set name physical_${att}_id
if {[info exists :$name]} {
unset :$name
}
}
}
}
::xowiki::Page instproc notification_detail_link {} {
set link [:pretty_link -absolute 1]
append html "<p>For more details, see <a href='[ns_quotehtml $link]'>[ns_quotehtml ${:title}]</a></p>"
append text "\nFor more details, see $link ...\n"
return [list html $html text $text]
}
::xowiki::Page instproc form_field_index form_field_objs {
set marker ::__computed_form_field_names($form_field_objs)
if {[info exists $marker]} return
foreach form_field_obj $form_field_objs {
if {![$form_field_obj istype ::xowiki::formfield::FormField]} continue
set ::_form_field_names([$form_field_obj name]) $form_field_obj
:form_field_index [$form_field_obj info children]
}
set $marker 1
}
::xowiki::Page instproc condition=regexp {query_context value} {
if {[llength $value] != 2} {
error "two arguments for regexp required, [llength $value] passed (arguments='$value')"
}
ad_try {
set success [regexp [lindex $value 1] [set :[lindex $value 0]]]
} on error {errorMsg} {
ns_log error "error during condition regexp: $errorMsg"
set success 0
}
return $success
}
::xowiki::Page instproc stats_record_detail args {
ns_log error "the method Page->stats_record_detail should not be called"
}
::xowiki::Page instproc regsub_eval {{-noquote:boolean false} re string cmd {prefix ""}} {
if {$noquote} {
set map { \[ \\[ \] \\] \$ \\$ \\ \\\\}
} else {
set map { \" \\\" \[ \\[ \] \\] \$ \\$ \\ \\\\}
}
uplevel [list subst [regsub -all -- $re [string map $map $string] "\[$cmd\]"]]
}
::xowiki::Page instforward get_nls_language_from_lang ::xowiki::Package %proc
::xowiki::Page instforward exists_form_parameter {%set :package_id} %proc
::xowiki::Page instforward item_ref {%my package_id} %proc
::xowiki::Page instforward form_parameter {%set :package_id} %proc
::xowiki::Page instforward exists_query_parameter {%set :package_id} %proc
::xowiki::Page instforward get_ids_for_bulk_actions {%my package_id} %proc
::xowiki::Page instforward query_parameter {%set :package_id} %proc
::xowiki::Page instparametercmd creator
::xowiki::Page instparametercmd page_id
::xowiki::Page instparametercmd creation_user
::xowiki::Page instparametercmd mime_type
::xowiki::Page instparametercmd publish_date
::xowiki::Page instparametercmd render_adp
::xowiki::Page instparametercmd absolute_links
::xowiki::Page instparametercmd title
::xowiki::Page instparametercmd page_order
::xowiki::Page instparametercmd description
::xowiki::Page instparametercmd name
::xowiki::Page instparametercmd last_modified
::xowiki::Page instparametercmd do_substitutions
::xowiki::Page instparametercmd text
::xowiki::Page instparametercmd nls_language
::nsf::relation::set ::xowiki::Page superclass ::xo::db::CrItem
::nx::slotObj -container slot ::xowiki::Page
::xowiki::Page::slot eval {set :__parameter {
{render_adp 1}
{do_substitutions 1}
{absolute_links 0}
}}
::nsf::object::alloc ::xo::db::CrAttribute ::xowiki::Page::slot::page_order {set :accessor public
set :column_name page_order
set :configurable true
set :convert false
set :create_acs_attribute true
set :create_table_attribute true
set :datatype text
set :default {}
set :defaultmethods {}
set :disposition alias
set :domain ::xowiki::Page
set :incremental false
set :manager ::xowiki::Page::slot::page_order
set :max_n_values 1
set :methodname page_order
set :min_n_values 1
set :multiplicity 1..1
set :name page_order
set :parameterSpec {-page_order:substdefault {}}
set :per-object false
set :position 0
set :pretty_name #xowiki.Page-page_order#
set :pretty_plural {}
set :references {}
set :required false
set :sqltype ltree
set :substdefault 0b111
set :trace none
set :validator page_order
: init}
::nsf::object::alloc ::xo::db::CrAttribute ::xowiki::Page::slot::creator {set :accessor public
set :column_name creator
set :configurable true
set :convert false
set :create_acs_attribute true
set :create_table_attribute true
set :datatype text
set :defaultmethods {}
set :disposition alias
set :domain ::xowiki::Page
set :incremental false
set :manager ::xowiki::Page::slot::creator
set :max_n_values 1
set :methodname creator
set :min_n_values 1
set :multiplicity 1..1
set :name creator
set :parameterSpec -creator
set :per-object false
set :position 0
set :pretty_name #xowiki.Page-creator#
set :pretty_plural {}
set :references {}
set :required false
set :sqltype text
set :trace none
: init}
::nsf::object::alloc ::xo::db::Attribute ::xowiki::Page::slot::page_id {set :accessor public
set :column_name page_id
set :configurable true
set :convert false
set :create_acs_attribute false
set :create_table_attribute true
set :datatype integer
set :defaultmethods {}
set :disposition alias
set :domain ::xowiki::Page
set :incremental false
set :manager ::xowiki::Page::slot::page_id
set :max_n_values 1
set :methodname page_id
set :min_n_values 1
set :multiplicity 1..1
set :name page_id
set :parameterSpec -page_id
set :per-object false
set :position 0
set :pretty_name ID
set :pretty_plural {}
set :references {}
set :required false
set :sqltype integer
set :trace none
: init}
::nsf::object::alloc ::xotcl::Attribute ::xowiki::Page::slot::do_substitutions {set :accessor public
set :configurable true
set :convert false
set :default 1
set :defaultmethods {}
set :disposition alias
set :domain ::xowiki::Page
set :incremental 0
set :manager ::xowiki::Page::slot::do_substitutions
set :methodname do_substitutions
set :multiplicity 1..1
set :name do_substitutions
set :parameterSpec {-do_substitutions:substdefault 1}
set :per-object false
set :position 0
set :required false
set :substdefault 0b111
set :trace none
: init}
::nsf::object::alloc ::xo::Attribute ::xowiki::Page::slot::creation_user {set :accessor public
set :configurable true
set :convert false
set :datatype text
set :defaultmethods {}
set :disposition alias
set :domain ::xowiki::Page
set :incremental false
set :manager ::xowiki::Page::slot::creation_user
set :methodname creation_user
set :multiplicity 1..1
set :name creation_user
set :parameterSpec -creation_user
set :per-object false
set :position 0
set :pretty_name #xowiki.Page-creation_user#
set :pretty_plural {}
set :required false
set :spec user_id
set :trace none
: init}
::nsf::object::alloc ::xotcl::Attribute ::xowiki::Page::slot::render_adp {set :accessor public
set :configurable true
set :convert false
set :default 1
set :defaultmethods {}
set :disposition alias
set :domain ::xowiki::Page
set :incremental 0
set :manager ::xowiki::Page::slot::render_adp
set :methodname render_adp
set :multiplicity 1..1
set :name render_adp
set :parameterSpec {-render_adp:substdefault 1}
set :per-object false
set :position 0
set :required false
set :substdefault 0b111
set :trace none
: init}
::nsf::object::alloc ::xo::db::CrAttribute ::xowiki::Page::slot::description {set :accessor public
set :column_name description
set :configurable true
set :convert false
set :create_acs_attribute false
set :create_table_attribute false
set :datatype text
set :defaultmethods {}
set :disposition alias
set :domain ::xo::db::CrItem
set :incremental false
set :manager ::xowiki::Page::slot::description
set :max_n_values 1
set :methodname description
set :min_n_values 1
set :multiplicity 1..1
set :name description
set :parameterSpec -description
set :per-object false
set :position 0
set :pretty_name #xotcl-core.description#
set :pretty_plural #xotcl-core.descriptions#
set :references {}
set :required false
set :spec textarea,cols=80,rows=2,label=#xowiki.Page-description#
set :sqltype text
set :trace none
: init}
::nsf::object::alloc ::xo::db::CrAttribute ::xowiki::Page::slot::text {set :accessor public
set :column_name text
set :configurable true
set :convert false
set :create_acs_attribute false
set :create_table_attribute false
set :datatype text
set :defaultmethods {}
set :disposition alias
set :domain ::xo::db::CrItem
set :incremental false
set :manager ::xowiki::Page::slot::text
set :max_n_values 1
set :methodname text
set :min_n_values 1
set :multiplicity 1..1
set :name text
set :parameterSpec -text
set :per-object false
set :position 0
set :pretty_name Text
set :pretty_plural {}
set :references {}
set :required false
set :spec richtext
set :sqltype text
set :trace none
: init}
::nsf::object::alloc ::xotcl::Attribute ::xowiki::Page::slot::absolute_links {set :accessor public
set :configurable true
set :convert false
set :default 0
set :defaultmethods {}
set :disposition alias
set :domain ::xowiki::Page
set :incremental 0
set :manager ::xowiki::Page::slot::absolute_links
set :methodname absolute_links
set :multiplicity 1..1
set :name absolute_links
set :parameterSpec {-absolute_links:substdefault 0}
set :per-object false
set :position 0
set :required false
set :substdefault 0b111
set :trace none
: init}
::nsf::object::alloc ::xo::Attribute ::xowiki::Page::slot::nls_language {set :accessor public
set :configurable true
set :convert false
set :datatype text
set :default {[ad_conn locale]}
set :defaultmethods {}
set :disposition alias
set :domain ::xowiki::Page
set :incremental false
set :manager ::xowiki::Page::slot::nls_language
set :methodname nls_language
set :multiplicity 1..1
set :name nls_language
set :parameterSpec {-nls_language:substdefault {[ad_conn locale]}}
set :per-object false
set :position 0
set :pretty_name #xowiki.Page-nls_language#
set :pretty_plural {}
set :required false
set :spec {select,options=[xowiki::locales]}
set :substdefault 0b111
set :trace none
: init}
::nsf::object::alloc ::xotcl::Attribute ::xowiki::Page::slot::mime_type {set :accessor public
set :configurable true
set :convert false
set :default text/html
set :defaultmethods {}
set :disposition alias
set :domain ::xowiki::Page
set :incremental false
set :manager ::xowiki::Page::slot::mime_type
set :methodname mime_type
set :multiplicity 1..1
set :name mime_type
set :parameterSpec {-mime_type:substdefault text/html}
set :per-object false
set :position 0
set :required false
set :substdefault 0b111
set :trace none
: init}
::nsf::object::alloc ::xo::Attribute ::xowiki::Page::slot::name {set :accessor public
set :configurable true
set :convert false
set :datatype text
set :defaultmethods {}
set :disposition alias
set :domain ::xowiki::Page
set :help_text #xowiki.Page-name-help_text#
set :incremental false
set :manager ::xowiki::Page::slot::name
set :methodname name
set :multiplicity 1..1
set :name name
set :parameterSpec -name
set :per-object false
set :position 0
set :pretty_name #xowiki.Page-name#
set :pretty_plural {}
set :required false
set :spec maxlength=400,required
set :trace none
set :validator name
: init}
::nsf::object::alloc ::xo::db::CrAttribute ::xowiki::Page::slot::title {set :accessor public
set :column_name title
set :configurable true
set :convert false
set :create_acs_attribute false
set :create_table_attribute false
set :datatype text
set :defaultmethods {}
set :disposition alias
set :domain ::xo::db::CrItem
set :incremental false
set :manager ::xowiki::Page::slot::title
set :max_n_values 1
set :methodname title
set :min_n_values 1
set :multiplicity 1..1
set :name title
set :parameterSpec -title
set :per-object false
set :position 0
set :pretty_name #xotcl-core.title#
set :pretty_plural #xotcl-core.titles#
set :references {}
set :required false
set :sqltype varchar(1000)
set :trace none
: init}
::nsf::object::alloc ::xo::db::CrAttribute ::xowiki::Page::slot::publish_date {set :accessor public
set :column_name publish_date
set :configurable true
set :convert false
set :create_acs_attribute false
set :create_table_attribute false
set :datatype date
set :defaultmethods {}
set :disposition alias
set :domain ::xo::db::CrItem
set :incremental false
set :manager ::xowiki::Page::slot::publish_date
set :max_n_values 1
set :methodname publish_date
set :min_n_values 1
set :multiplicity 1..1
set :name publish_date
set :parameterSpec -publish_date
set :per-object false
set :position 0
set :pretty_name #xo.CrItem-publish_date#
set :pretty_plural {}
set :references {}
set :required false
set :spec date,label=#xowiki.Page-publish_date#
set :sqltype date
set :trace none
: init}
::nsf::object::alloc ::xo::Attribute ::xowiki::Page::slot::last_modified {set :accessor public
set :configurable true
set :convert false
set :datatype text
set :defaultmethods {}
set :disposition alias
set :domain ::xowiki::Page
set :incremental false
set :manager ::xowiki::Page::slot::last_modified
set :methodname last_modified
set :multiplicity 1..1
set :name last_modified
set :parameterSpec -last_modified
set :per-object false
set :position 0
set :pretty_name #xowiki.Page-last_modified#
set :pretty_plural {}
set :required false
set :spec date
set :trace none
: init}
namespace eval ::xowiki {::namespace export Menu YUIMenuBar YUIMenuBarItem YUIMenu YUIMenuItem YUIMenuItemList YUIContextMenu YUIContextMenuItem}