Elise Springer's
philosophy homepage
at Wesleyan University ...
Thanks for being patient!

Page uses Javascript, and functions best on Firefox
Elise Springer - Department of Philosophy
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity=60)';}
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox where print preview displays the noscript content */
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])

<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]

Also see [[AdvancedOptions]]

This tiddler was automatically created to record the details of this server
^^@@''Backstage stuff:''@@^^
<<newTiddler>> • <<saveChanges>>
[[ExcludedTiddlers]] • [[TabTags]]  <<tag Setup>> <<tag plugins>> <<tag systemConfig>> <<tag excludeLists>> <<tag epigraphs>> <<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>>
<<tabs txtMainTab ... "More tabs" TabMore>>
!!We have learned ... to approach scientific problems ... ''by ignoring'' — or postponing consideration of — the possibility that ''the larger context'' may influence the smaller... Our hypothesis runs counter to this... The [[observer must be included|responsibility]] within the focus of observation, and what can be studied is always a ''relationship'' or an infinite regress of relationships. Never a “thing”.
!!!!—Gregory Bateson, //Steps to an Ecology of Mind//, 1972
Many thanks to the many who made Bernstein's November 14 visit possible -- specifically the [[Ethics in Society Project|http://www.wesleyan.edu/ethics/]], as well as the Government Dept, Philosophy Dept, COL, and CSS. 
!Bernstein's book, //The Abuse of Evil: The Corruption of Politics and Religion Since 9/11//, can be found at [[Broad Street Books|http://www.wesleyan.edu/pplant/broadstbooks.htm]], or [[online|http://www.amazon.com/gp/product/074563494X/103-6298072-0949442?v=glance&n=283155&camp=2025&dev-t=D26XECQVNV6NDQ&link%5Fcode=xm2]].
!!The impact on me of realizing that our histories as agents are ''webs'' in which all that is a ''product of our wills'' is supported by things that are ''not'' is an //ethical// impact. It moves me toward humility and mercy, virtues that acknowledge the unfairness of life but also presuppose a morally structured context... [[responsibility]] is an achievement, not a given.
!!!!—Claudia Card, //The Unnatural Lottery//, 1996
Background: #ffd
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #16c
PrimaryDark: #024
SecondaryPale: #dfeedd
SecondaryLight: #efa
SecondaryMid: #bd4
SecondaryDark: #184
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
[[ColorB1]] [[ColorB2]] [[ColorB3]]
[[ColorS1]] [[ColorS2]] [[ColorS3]]
[[ColorT1]] [[ColorT2]] [[ColorT3]]
 function getFirstLine(s) {
 var m = s.match(/\s*(.*)/);
 return m != null && m.length >= 1 ? m[1] : "";
 '"*[["+tiddler.title+"]] &rarr; @@bgcolor("+getFirstLine(tiddler.text)+"):"+getFirstLine(tiddler.text)+"@@\n"' 
My first book, //Communicating Moral Concern: An Ethics of Critical Responsiveness// (forthcoming from MIT Press) illuminates the importance of critical encounters for moral agency, supporting a radically social understanding of morality. Most philosophical discussions of criticism portray its point either as the expression of appropriate attitudes and judgments or as the regulative prescription of conduct. This book insists that our philosophical account of moral criticism should illuminate how criticism engages the moral agency of all participants — regardless of their primary role as initiators, respondents, or mediators. 
The account developed here frames the point of moral criticism as the communication of moral concern, where concern is a kind of practical arousal of attention to a moral problem. In being taken up by multiple persons, a concern is reshaped by their distinct practical and epistemic situations. No particular moral judgment need be shared by participants in effective critical exchanges. Competence is marked by receptivity to unfamiliar threads of concern, creativity in the practical re-framing of concerns, and skills in bringing concerns to the attention of those whose relevant practical agency outreaches our own. 
Critical engagement is thus conceived as a kind of responsive attunement, and it is aptly approached as a virtue. Unlike most virtue ethics, however, which emphasize moral learning through imitation and inculcation, a virtue ethics that embraces good critical practice is one that can help us question traditional norms and recognize that our moral agency is enhanced through engaging with differences of embodiment, perspective, and history. 
SiteTitle SiteSubtitle MainMenu DefaultTiddlers ConfigTiddlers SiteUrl ExplicitTiddlers HiddenTiddlers NoSearchTiddlers StyleSheet LingoInterface LingoMessages
''DisableWikiLinksPlugin for TiddlyWiki version 1.2.x and 2.0''
^^author: Eric Shulman - ELS Design Studios
source: http://www.elsdesign.com/tiddlywiki/#DisableWikiLinksPlugin
license: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^

Self-contained control panel:
<<option chkDisableWikiLinks>> Disable automatic WikiWord tiddler links

version.extensions.disableWikiLinks= {major: 1, minor: 0, revision: 0, date: new Date(2005,12,9)};

if (config.options.chkDisableWikiLinks==undefined) config.options.chkDisableWikiLinks= true;

// find the formatter for wikiLink and replace handler with 'pass-thru' rendering
for (var i=0; i<config.formatters.length && config.formatters[i].name!="wikiLink"; i++);
config.formatters[i].handler=function(w) {
	// if not enabled, just do standard WikiWord link formatting
	if (!config.options.chkDisableWikiLinks) return this.coreHandler(w);
	// supress any leading "~" (if present)
	var skip=(w.matchText.substr(0,1)==config.textPrimitives.unWikiLink)?1:0;
| Name:|DiscerningTagsPlugin|
| Description:|Make the tag chooser ignore tags that are themselves tagged with 'excludeLists'|
| Version:|1.0|
| Date:|02-Nov-2006|
| Source:|http://discerningtags.tiddlyspot.com/|
| Author:|Daniel Baird <danielbaird@gmail.com>|
| CoreVersion:|2.1.x|
For instructions on how to install plugins, see here:
config.macros.tagChooser.onClick = function(e) {
	if(!e) var e = window.event;
	var lingo = config.views.editor.tagChooser;
	var popup = Popup.create(this);
	var tags = store.getTags();
	if(tags.length == 0)
	for(var t=0; t<tags.length; t++)
		var tagTiddler = store.getTiddler(tags[t][0]);
		if (!(tagTiddler && tagTiddler.isTagged('excludeLists')))
			var theTag = createTiddlyButton(createTiddlyElement(popup,"li"),tags[t][0],lingo.tagTooltip.format([tags[t][0]]),config.macros.tagChooser.onTagClick);
			theTag.setAttribute("tiddler", this.getAttribute("tiddler"));
	e.cancelBubble = true;
	if(e.stopPropagation) e.stopPropagation();
The Dvorak layout, named for its inventor, puts the most commonly-used letters of the English language under your strongest fingers: T and E, for example, lie under your two middle fingers in home row. Uncommon letters are relegated to more remote stations, where they belong. 
Dvorak users learn faster, type faster, hit the delete key less often, and suffer less repetitive strain injury. We probably type more, too, because working at the computer becomes more satisfying. Post-2000 computers all have dvorak built in, accessible via Control Panel or International Keyboard System Preferences. Various web sites offer [[tutorials|http://www.mit.edu:8001/people/jcb/Dvorak/dvorak-course/]].
<<newTiddler>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel options 'Change TiddlyWiki advanced options'>>
<<list shadowed>>
[>img[espringer|http://espringer.web.wesleyan.edu/images/springerhatffd.png]]My work in moral philosophy focuses on processes of ''[[moral change|diachronic ethics]], [[criticism|critical virtue]], and moral dialogue''. Thinking about the process of moral criticism has led me to think about moral responsibility in the context of a [[social ecology|ecological theory]] of attention to problems. My philosophical perspective has been most shaped by [[pragmatist naturalists|Pragmatist Philosophy]] and [[feminist theorists|Feminist Phil. & Moral Theory]].  
!At [[Wesleyan University|http://www.wesleyan.edu]] my regular [[courses]] include [[Introduction to Ethics]] and [[Personal Identity & Choice|Identity & Choice]], along with various upper-level studies related to my [[research project]].
!(See also: [[background]] & interests [[beyond philosophy]])
// //''Name:'' EmailLink
// //''Version:'' <<getversion email>> (<<getversiondate email "DD MMM YYYY">>)
// //''Author:'' AlanHecht
// //''Type:'' [[Macro|Macros]]

// //''Description:'' email lets you list a "email" address without displaying it as readable text.  This helps prevent your email address from being harvested by search engines and other web crawlers that read your page's contents. Using email, you type in the words "at" and "dot" instead of the punctuation symbols and add spaces inbetween words to disguise your address. However, email will display your email address in a web browser so that humans can read it. And email turns the address into a hyperlink that can be clicked to send you an instant email.

// //''Syntax:'' << {{{email yourname at yourdomain dot com "?optional parameters"}}} >>
// //Example 1: <<email sample at nowhere dot com>> (standard)
// //Example 2: <<email multiple dot sample at somewhere dot nowhere dot com>> (multiple dots)
// //Example 3: <<email sample at nowhere dot com "?subject=Submission&body=Type your message here.">> (with optional parameters)

// //''Directions:'' <<tiddler MacroDirections>>

// //''Notes:'' You can use the optional email parameters to stipulate a subject or message body for the message.  Most (not all) email clients will use this information to construct the email message.

// //''Related Links:'' none

// //''Revision History:''
// // v0.1.0 (20 July 2005): initial release
// // v0.1.1 (22 July 2005): renamed the macro from "mailto" to "email" to further thwart email harvesters.
// // v0.1.2 (15 October 2005): added global replacement of "dots" thanks to a suggestion from Ralph Winter

// //''Code section:''
version.extensions.email = {major: 0, minor: 1, revision: 2, date: new Date("Oct 15, 2005")};
config.macros.email = {}
config.macros.email.handler = function(place,macroName,params)
var temp = params.join(" ");
data = temp.split("?");
var recipient = data[0];
recipient = recipient.replace(" at ","@").replace(" dot ",".","g");
recipient = recipient.replace(/\s/g,"");
var optional = data[1] ? "?" + data[1] : "";
var theLink = createExternalLink(place,"ma"+"il"+"to:"+recipient+optional);
!!''There is no virtue'' which is final; all are initial... The terror of reform is the ''discovery'' that we must cast away our virtues, or ''what we have always esteemed'' such, into the same pit that has consumed our grosser vices: — “Forgive his crimes, forgive his virtues too, / Those smaller faults, half converts to the right” 
!!!!—Ralph Waldo Emerson, "Circles"
<<tiddler MeyersOnDissidentSpeech>> <<tiddler HonnethOnDisrespect>> <<tiddler MeadOnMoralAdvance>>
<<tiddler BatesonOnContexts>><<tiddler GibsonOnOneWorld>><<tiddler CardOnCharacterWeb>><<tiddler WalkerOnMoralPhilosophizing>>
''Ethics and Fluency'' is an advanced seminar (PHIL 347/ENVS 347) exploring Metaphors in Moral Cognition

The most significant choices we make, in moral philosophy, are choices among metaphors. Moral concepts orient us to practice (that is, they motivate) not because a special faculty of conscience is pulled by the truth of moral judgments, but because moral concepts develop and extend more concretely embodied practices (building, gathering, standing upright, being bound or constrained, emulating, obeying, controlling, cleaning, protecting, nurturing, cultivating, path-following, illuminating, making eye-contact, balancing, synchronizing, and harmonizing, for example).

Reason, conceived as coolly neutral, cannot guide our choice among these practical-moral metaphors. Nor can we think that any imaginable metaphorical stance can simply be chosen by will. What we may do, however, is to reflect on our metaphorical leanings and imagine their alternatives -- examining them, always, in light of what's salient about our practical circumstances. An especially salient aspect of our practical circumstances today is ecological crisis. Moral theory is barely beginning to be "woken from its dogmatic slumbers" with respect to the practical problems of ecological interdependence, limits, and volatility. So, one central question for our seminar is this: "Which moral metaphors might engage us well in our encounter with ecological crisis?"

We will consider the concept of "fluency" (and various related ones) as one intriguing and promising metaphorical ground for ethics, as it avoids both the detachment of principle and the ambition of maximal causal control. The metaphor of fluency is one that has been developed in certain ways by virtue ethicists, who emphasize practice, temporal development, responsiveness to context, and a non-reductive appreciation of what matters. Yet it is also a dangerous metaphor (Foucault says, "Everything is dangerous"). It is dangerous in its invocation of apprenticeship to tradition, of timelessly appropriate habits, and of stable individual archetypes of moral excellence. Hence a parallel theme of development, in this course, is a tension between ease and un-ease or discomfort (dis-ease?), fluency and disruption, habit and crisis. Perhaps our relation to moral metaphors must itself be open to vacillation and flux.
''[[Concepts of Evil, Blame, and Moral Understanding|http://espringer.web.wesleyan.edu/wescourses/2005f/phil343/index.html]]'' is an advanced philosophy seminar exploring the relations among its three principal themes (evil; blame; moral understanding), from classic treatments and puzzles through recent research on phenomena that seem to defy moral understanding.
<<tag excludeLists>> <<tag colorSpec>> [[Colors]]
I'm seeing whether evil or responsibility or dialogical or critical resistance gets a link...
|''Author:''|Eric Shulman - ELS Design Studios|
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|

When many people edit copies of the same TiddlyWiki document, the ability to easily copy and share these changes so they can then be redistributed to the entire group is very important.  This ability is also very useful when moving your own tiddlers from document to document (e.g., when upgrading to the latest version of TiddlyWiki, or 'pre-loading' your favorite stylesheets into a new 'empty' TiddlyWiki document.)

ExportTiddlersPlugin let you ''select and extract tiddlers from your ~TiddlyWiki documents and save them to a local file'' or a remote server (requires installation of compatible server-side scripting, still under development...).  An interactive control panel lets you specify a destination, and then select which tiddlers to export.  A convenient 'selection filter' helps you pick desired tiddlers by specifying a combination of modification dates, tags, or tiddler text to be matched or excluded.  ''Tiddler data can be output as ~TiddlyWiki "storeArea ~DIVs" that can be imported into another ~TiddlyWiki or as ~RSS-compatible XML that can be published for RSS syndication.''

!!!!!Inline interface (live)
<<exportTiddlers inline>>
Optional "special tiddlers" used by this plugin:
* SiteUrl^^
URL for official server-published version of document being viewed (used in XML export)
default: //none//^^
* SiteHost^^
host name/address for remote server (e.g., "www.server.com" or "")
default: //none//^^
* SitePost^^
remote path/filename for submitting changes (e.g., "/cgi-bin/submit.cgi")
default: //none//^^
* SiteParams^^
arguments (if any) for server-side receiving script
default: //none//^^
* SiteNotify^^
addresses (if any) for sending automatic server-side email notices
default: //none//^^
* SiteID^^
username or other authorization identifier for login-controlled access to remote server
default: current TiddlyWiki username (e.g., "YourName")^^
* SiteDate^^
stored date/time stamp for most recent published version of document
default: current document.modified value (i.e., the 'file date')^^
Import (or copy/paste) the following tiddlers into your document:
''ExportTiddlersPlugin'' (tagged with <<tag systemConfig>>)

create/edit ''SideBarOptions'': (sidebar menu items) 
^^Add {{{<<exportTiddlers>>}}} macro^^
!!!!!Revision History
''2006.11.08 [2.2.4]'' added promptForExportFilename() and replaced type="file" control with edit field + browse button ("...").
''2006.10.12 [2.2.3]'' in exportDIVFooter(), write POST-BODY-START/END markers for compatibility with TW2.1 core file format.  Based on report from Jose Gonzalez.
''2006.05.11 [2.2.2]'' in createExportPanel, removed call to addNotification() to no longer auto-refresh the list every time a tiddler is changed.  Instead, call refreshExportList(0) only when the panel is first rendered and each time it is made visible.  Prevents unneeded feedback messages from being displayed and increases overall document performance, since the listbox is no longer being updated each time a tiddler is saved.
''2006.05.02 [2.2.1]'' Use displayMessage() to show number of selected tiddlers instead of updating listbox 'header' item after each selection.  Prevents awkward 'scroll-to-top' behavior that made multi-select via ctrl-click nearly impossible.  Reported by Paul Reiber.
''2006.04.29 [2.2.0]'' New features: "Notes" are free-form text that is inserted in the header of a TWDIV export file.  When exporting to a server, the "notify" checkbox indicates that server-side script processing should send an email message when the export file is stored on the server.  Comma-separated addresses may be typed in, or pre-defined in the SiteNotify tiddler.
''2006.03.29 [2.1.3]'' added calls to convertUnicodeToUTF8() for generated output, so it better handles international characters.
''2006.02.12 [2.1.2]'' added var to unintended global 'tags' in matchTags(). Avoids FF1501 bug when filtering by tags.  (based on report by TedPavlic)
''2006.02.04 [2.1.1]'' added var to variables that were unintentionally global.  Avoids FireFox crash bug when referencing global variables
''2006.02.02 [2.1.0]'' Added support for output of complete TiddlyWiki documents.  Let's you use ExportTiddlers to generate 'starter' documents from selected tiddlers.
''2006.01.21 [2.0.1]'' Defer initial panel creation and only register a notification function when panel first is created
in saveChanges 'hijack', create panel as needed.  Note: if window.event is not available to identify the click location, the export panel is positioned relative to the 'tiddlerDisplay' element of the TW document.
''2005.12.27 [2.0.0]'' Update for TW2.0
Defer initial panel creation and only register a notification function when panel first is created
''2005.12.24 [0.9.5]'' Minor adjustments to CSS to force correct link colors regardless of TW stylesheet selection
''2005.12.16 [0.9.4]'' Dynamically create/remove exportPanel as needed to ensure only one instance of interface elements exists, even if there are multiple instances of macro embedding.
''2005.11.15 [0.9.2]'' added non-Ajax post function to bypass javascript security restrictions on cross-domain I/O.  Moved AJAX functions to separate tiddler (no longer needed here).  Generalized HTTP server to support UnaWiki servers
''2005.11.08 [0.9.1]'' moved HTML, CSS and control initialization into exportInit() function and call from macro handler instead of at load time.  This allows exportPanel to be placed within the same containing element as the "export tiddlers" button, so that relative positioning can be achieved.
''2005.10.28 [0.9.0]'' added 'select opened tiddlers' feature
Based on a suggestion by Geoff Slocock
''2005.10.24 [0.8.3]'' Corrected hijack of 'save changes' when using http:
''2005.10.18 [0.8.2]'' added AJAX functions
''2005.10.18 [0.8.1]'' Corrected timezone handling when filtering for date ranges.
Improved error checking/reporting for invalid filter values and filters that don't match any tiddlers.
Exporting localfile-to-localfile is working for IE and FF
Exporting server-to-localfile works in IE (after ActiveX warnings), but has security issues in FF
Cross-domain exporting (localfile/server-to-server) is under development
Cookies to remember filter settings - coming soon
More style tweaks, minor text changes and some assorted layout cleanup.
''2005.10.17 [0.8.0]'' First pre-release.
''2005.10.16 [0.7.0]'' filter by tags
''2005.10.15 [0.6.0]'' filter by title/text
''2005.10.14 [0.5.0]'' export to local file (DIV or XML)
''2005.10.14 [0.4.0]'' filter by start/end date
''2005.10.13 [0.3.0]'' panel interaction
''2005.10.11 [0.2.0]'' panel layout
''2005.10.10 [0.1.0]'' code framework
''2005.10.09 [0.0.0]''development started
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]
// // version
version.extensions.exportTiddlers = {major: 2, minor: 2, revision: 4, date: new Date(2006,11,8)};

// // macro handler
config.macros.exportTiddlers = {
	label: "export tiddlers",
	prompt: "Copy selected tiddlers to an export document",
	newdefault: "export.html",
	datetimefmt: "0MM/0DD/YYYY 0hh:0mm:0ss" // for "filter date/time" edit fields

config.macros.exportTiddlers.handler = function(place,macroName,params) {
	if (params[0]!="inline")
		{ createTiddlyButton(place,this.label,this.prompt,onClickExportMenu); return; }
	var panel=createExportPanel(place);

function createExportPanel(place) {
	var panel=document.getElementById("exportPanel");
	if (panel) { panel.parentNode.removeChild(panel); }
	return panel;

function onClickExportMenu(e)
	if (!e) var e = window.event;
	var parent=resolveTarget(e).parentNode;
	var panel = document.getElementById("exportPanel");
	if (panel==undefined || panel.parentNode!=parent)
	var isOpen = panel.style.display=="block";
		anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));
		panel.style.display = isOpen ? "none" : "block" ;
	if (panel.style.display!="none") refreshExportList(0); // update list when panel is made visible
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();

// // Hijack saveChanges - diverts 'notFileUrlError' to display export control panel instead
window.saveChanges = function()
	if (document.location.protocol=="file:") { coreSaveChanges(); return; }
	var e = window.event;
	var parent=e?resolveTarget(e).parentNode:document.body;
	var panel = document.getElementById("exportPanel");
	if (panel==undefined || panel.parentNode!=parent) panel=createExportPanel(parent);
	if (parent==document.body) { panel.style.left="30%"; panel.style.top="30%"; }
	panel.style.display = "block" ;

// // IE needs explicit scoping for functions called by browser events

// // CSS for floating export control panel
config.macros.exportTiddlers.css = '\
#exportPanel {\
	display: none; position:absolute; z-index:12; width:35em; right:105%; top:6em;\
	background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\
	border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\
	padding: 0.5em; margin:0em; -moz-border-radius:1em;\
#exportPanel a, #exportPanel td a { color:#009; display:inline; margin:0px; padding:1px; }\
#exportPanel table { width:100%; border:0px; padding:0px; margin:0px; font-size:8pt; line-height:110%; background:transparent; }\
#exportPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }\
#exportPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }\
#exportPanel select { width:98%;margin:0px;font-size:8pt;line-height:110%;}\
#exportPanel input  { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%; }\
#exportPanel textarea  { width:98%;padding:0px;margin:0px;overflow:auto;font-size:8pt; }\
#exportPanel .box { border:1px solid black; padding:3px; margin-bottom:5px; background:#f8f8f8; -moz-border-radius:5px; }\
#exportPanel .topline { border-top:2px solid black; padding-top:3px; margin-bottom:5px; }\
#exportPanel .rad { width:auto;border:0 }\
#exportPanel .chk { width:auto;border:0 }\
#exportPanel .btn { width:auto; }\
#exportPanel .btn1 { width:98%; }\
#exportPanel .btn2 { width:48%; }\
#exportPanel .btn3 { width:32%; }\
#exportPanel .btn4 { width:24%; }\
#exportPanel .btn5 { width:19%; }\

// // HTML for export control panel interface
config.macros.exportTiddlers.html = '\
<!-- output target and format -->\
<table cellpadding="0" cellspacing="0"><tr><td width=50%>\
	export to\
	<select size=1 id="exportTo" onchange="exportShowPanel(this.value);">\
	<option value="file:" SELECTED>this computer</option>\
	<option value="http:">web server (http)</option>\
	<option value="https:">secure web server (https)</option>\
	<option value="ftp:">file server (ftp)</option>\
</td><td width=50%>\
	output format\
	<select id="exportFormat" size=1>\
	<option value="DIV">TiddlyWiki export file</option>\
	<option value="TW">TiddlyWiki document</option>\
	<option value="XML">RSS feed (XML)</option>\
<!-- export to local file  -->\
<div id="exportLocalPanel" style="margin-top:5px;">\
local path/filename<br>\
<input type="text" id="exportFilename" size=40 style="width:93%"><input \
	type="button" id="exportBrowse" value="..." title="select or enter a local folder/file..." style="width:5%" \
<!--<input type="file" id="exportFilename" size=57 style="width:100%"><br>-->\
<!-- export to http server -->\
<div id="exportHTTPPanel" style="display:none;margin-top:5px;">\
<table><tr><td align=left>\
	server location, script, and parameters<br>\
</td><td align=right>\
	<input type="checkbox" class="chk" id="exportNotify"\
		onClick="document.getElementById(\'exportSetNotifyPanel\').style.display=this.checked?\'block\':\'none\'"> notify\
<input type="text" id="exportHTTPServerURL" onfocus="this.select()"><br>\
<div id="exportSetNotifyPanel" style="display:none">\
	send email notices to<br>\
	<input type="text" id="exportNotifyTo" onfocus="this.select()"><br>\
<!-- export to ftp server -->\
<div id="exportFTPPanel" style="display:none;margin-top:5px;">\
<table cellpadding="0" cellspacing="0" width="32%"><tr valign="top"><td>\
	host server<br>\
	<input type="text" id="exportFTPHost" onfocus="this.select()"><br>\
</td><td width="32%">\
	<input type="text" id="exportFTPID" onfocus="this.select()"><br>\
</td><td width="32%">\
	<input type="password" id="exportFTPPW" onfocus="this.select()"><br>\
FTP path/filename<br>\
<input type="text" id="exportFTPFilename" onfocus="this.select()"><br>\
<!-- notes -->\
<textarea id="exportNotes" rows=3 cols=40 style="height:4em;margin-bottom:5px;" onfocus="this.select()"></textarea> \
<!-- list of tiddlers -->\
<table><tr align="left"><td>\
	<a href="JavaScript:;" id="exportSelectAll"\
		onclick="onClickExportButton(this)" title="select all tiddlers">\
	<a href="JavaScript:;" id="exportSelectChanges"\
		onclick="onClickExportButton(this)" title="select tiddlers changed since last save">\
		&nbsp;changes&nbsp;</a> \
	<a href="JavaScript:;" id="exportSelectOpened"\
		onclick="onClickExportButton(this)" title="select tiddlers currently being displayed">\
		&nbsp;opened&nbsp;</a> \
	<a href="JavaScript:;" id="exportToggleFilter"\
		onclick="onClickExportButton(this)" title="show/hide selection filter">\
		&nbsp;filter&nbsp;</a>  \
</td><td align="right">\
	<a href="JavaScript:;" id="exportListSmaller"\
		onclick="onClickExportButton(this)" title="reduce list size">\
	<a href="JavaScript:;" id="exportListLarger"\
		onclick="onClickExportButton(this)" title="increase list size">\
<select id="exportList" multiple size="10" style="margin-bottom:5px;"\
<!-- selection filter -->\
<div id="exportFilterPanel" style="display:none">\
<table><tr align="left"><td>\
	selection filter\
</td><td align="right">\
	<a href="JavaScript:;" id="exportHideFilter"\
		onclick="onClickExportButton(this)" title="hide selection filter">hide</a>\
<div class="box">\
<input type="checkbox" class="chk" id="exportFilterStart" value="1"\
	onclick="exportShowFilterFields(this)"> starting date/time<br>\
<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">\
	<select size=1 id="exportFilterStartBy" onchange="exportShowFilterFields(this);">\
		<option value="0">today</option>\
		<option value="1">yesterday</option>\
		<option value="7">a week ago</option>\
		<option value="30">a month ago</option>\
		<option value="site">SiteDate</option>\
		<option value="file">file date</option>\
		<option value="other">other (mm/dd/yyyy hh:mm)</option>\
</td><td width="50%">\
	<input type="text" id="exportStartDate" onfocus="this.select()"\
<input type="checkbox" class="chk" id="exportFilterEnd" value="1"\
	onclick="exportShowFilterFields(this)"> ending date/time<br>\
<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">\
	<select size=1 id="exportFilterEndBy" onchange="exportShowFilterFields(this);">\
		<option value="0">today</option>\
		<option value="1">yesterday</option>\
		<option value="7">a week ago</option>\
		<option value="30">a month ago</option>\
		<option value="site">SiteDate</option>\
		<option value="file">file date</option>\
		<option value="other">other (mm/dd/yyyy hh:mm)</option>\
</td><td width="50%">\
	<input type="text" id="exportEndDate" onfocus="this.select()"\
<input type="checkbox" class="chk" id=exportFilterTags value="1"\
	onclick="exportShowFilterFields(this)"> match tags<br>\
<input type="text" id="exportTags" onfocus="this.select()">\
<input type="checkbox" class="chk" id=exportFilterText value="1"\
	onclick="exportShowFilterFields(this)"> match titles/tiddler text<br>\
<input type="text" id="exportText" onfocus="this.select()">\
</div> <!--box-->\
</div> <!--panel-->\
<!-- action buttons -->\
<div style="text-align:center">\
<input type=button class="btn3" onclick="onClickExportButton(this)"\
	id="exportFilter" value="apply filter">\
<input type=button class="btn3" onclick="onClickExportButton(this)"\
	id="exportStart" value="export tiddlers">\
<input type=button class="btn3" onclick="onClickExportButton(this)"\
	id="exportClose" value="close">\

// // initialize interface
// // exportShowPanel(which)
function exportShowPanel(which) {
	var index=0; var panel='exportLocalPanel';
	switch (which) {
		case 'file:':
		case undefined:
			index=0; panel='exportLocalPanel'; break;
		case 'http:':
			index=1; panel='exportHTTPPanel'; break;
		case 'https:':
			index=2; panel='exportHTTPPanel'; break;
		case 'ftp:':
			index=3; panel='exportFTPPanel'; break;
			alert("Sorry, export to "+which+" is not yet available");

// // exportInitPanel(which)
function exportInitPanel(which) {
	switch (which) {
		case "file:": // LOCAL EXPORT PANEL: file/path:
			// ** no init - security issues in IE **
		case "http:": // WEB EXPORT PANEL
		case "https:": // SECURE WEB EXPORT PANEL
			// url
			if (store.tiddlerExists("unawiki_download")) {
				var theURL=store.getTiddlerText("unawiki_download");
				var title=(store.tiddlerExists("unawiki_host"))?"unawiki_host":"SiteHost";
				var theHost=store.getTiddlerText(title);
				if (!theHost || !theHost.length) theHost=document.location.host;
				if (!theHost || !theHost.length) theHost=title;
			// server script/params
			var title=(store.tiddlerExists("unawiki_host"))?"unawiki_host":"SiteHost";
			var theHost=store.getTiddlerText(title);
			if (!theHost || !theHost.length) theHost=document.location.host;
			if (!theHost || !theHost.length) theHost=title;
			// get POST
			var title=(store.tiddlerExists("unawiki_post"))?"unawiki_post":"SitePost";
			var thePost=store.getTiddlerText(title);
			if (!thePost || !thePost.length) thePost="/"+title;
			// get PARAMS
			var title=(store.tiddlerExists("unawiki_params"))?"unawiki_params":"SiteParams";
			var theParams=store.getTiddlerText(title);
			if (!theParams|| !theParams.length) theParams=title;
			var serverURL = which+"//"+theHost+thePost+"?"+theParams;
			// get NOTIFY
			var theAddresses=store.getTiddlerText("SiteNotify");
			if (!theAddresses|| !theAddresses.length) theAddresses="SiteNotify";
		case "ftp:": // FTP EXPORT PANEL
			// host
			var siteHost=store.getTiddlerText("SiteHost");
			if (!siteHost || !siteHost.length) siteHost=document.location.host;
			if (!siteHost || !siteHost.length) siteHost="SiteHost";
			// username
			var siteID=store.getTiddlerText("SiteID");
			if (!siteID || !siteID.length) siteID=config.options.txtUserName;
			// password
			// file/path

// // exportInitFilter()
function exportInitFilter() {
	// start date
	// end date
	// tags
	// text
	// show/hide filter input fields

// // exportShowFilterFields(which)
function exportShowFilterFields(which) {
	var show;

	var val=document.getElementById('exportFilterStartBy').value;
	 if (which && (which.id=='exportFilterStartBy') && (val=='other'))

	var val=document.getElementById('exportFilterEndBy').value;
	 if (which && (which.id=='exportFilterEndBy') && (val=='other'))



// // onClickExportButton(which): control interactions
function onClickExportButton(which)
	// DEBUG alert(which.id);
	var theList=document.getElementById('exportList'); if (!theList) return;
	var count = 0;
	var total = store.getTiddlers('title').length;
	switch (which.id)
		case 'exportFilter':
			var panel=document.getElementById('exportFilterPanel');
			if (count==-1) { panel.style.display='block'; break; }
			clearMessage(); displayMessage("filtered "+formatExportMessage(count,total));
			if (count==0) { alert("No tiddlers were selected"); panel.style.display='block'; }
		case 'exportStart':
		case 'exportHideFilter':
		case 'exportToggleFilter':
			var panel=document.getElementById('exportFilterPanel')
		case 'exportSelectChanges':
			var lastmod=new Date(document.lastModified);
			for (var t = 0; t < theList.options.length; t++) {
				if (theList.options[t].value=="") continue;
				var tiddler=store.getTiddler(theList.options[t].value); if (!tiddler) continue;
				count += (tiddler.modified>lastmod)?1:0;
			clearMessage(); displayMessage(formatExportMessage(count,total));
			if (count==0) alert("There are no unsaved changes");
		case 'exportSelectAll':
			for (var t = 0; t < theList.options.length; t++) {
				if (theList.options[t].value=="") continue;
				count += 1;
			clearMessage(); displayMessage(formatExportMessage(count,count));
		case 'exportSelectOpened':
			for (var t = 0; t < theList.options.length; t++) theList.options[t].selected=false;
			var tiddlerDisplay = document.getElementById("tiddlerDisplay");
			for (var t=0;t<tiddlerDisplay.childNodes.length;t++) {
				var tiddler=tiddlerDisplay.childNodes[t].id.substr(7);
				for (var i = 0; i < theList.options.length; i++) {
					if (theList.options[i].value!=tiddler) continue;
					theList.options[i].selected=true; count++; break;
			clearMessage(); displayMessage(formatExportMessage(count,total));
			if (count==0) alert("There are no tiddlers currently opened");
		case 'exportListSmaller':	// decrease current listbox size
			var min=5;
		case 'exportListLarger':	// increase current listbox size
			var max=(theList.options.length>25)?theList.options.length:25;
		case 'exportClose':

// // list display
function formatExportMessage(count,total)
	var txt=total+' tiddler'+((total!=1)?'s':'')+" - ";
	txt += (count==0)?"none":(count==total)?"all":count;
	txt += " selected for export";
	return txt;

function refreshExportList(selectedIndex)
	var theList  = document.getElementById("exportList");
	var sort;
	if (!theList) return;
	// get the sort order
	if (!selectedIndex)   selectedIndex=0;
	if (selectedIndex==0) sort='modified';
	if (selectedIndex==1) sort='title';
	if (selectedIndex==2) sort='modified';
	if (selectedIndex==3) sort='modifier';

	// get the alphasorted list of tiddlers
	var tiddlers = store.getTiddlers('title');
	// unselect headings and count number of tiddlers actually selected
	var count=0;
	for (var i=0; i<theList.options.length; i++) {
		if (theList.options[i].value=="") theList.options[i].selected=false;
	// disable "export" button if no tiddlers selected
	// update listbox heading to show selection count
	if (theList.options.length) { clearMessage(); displayMessage(formatExportMessage(count,tiddlers.length)); }

	// if a [command] item, reload list... otherwise, no further refresh needed
	if (selectedIndex>3)  return;

	// clear current list contents
	while (theList.length > 0) { theList.options[0] = null; }
	// add heading and control items to list
	var i=0;
	var indent=String.fromCharCode(160)+String.fromCharCode(160);
		new Option(tiddlers.length+" tiddlers in document", "",false,false);
		new Option(((sort=="title"        )?">":indent)+' [by title]', "",false,false);
		new Option(((sort=="modified")?">":indent)+' [by date]', "",false,false);
		new Option(((sort=="modifier")?">":indent)+' [by author]', "",false,false);
	// output the tiddler list
		case "title":
			for(var t = 0; t < tiddlers.length; t++)
				theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);
		case "modifier":
		case "modified":
			var tiddlers = store.getTiddlers(sort);
			// sort descending for newest date first
			tiddlers.sort(function (a,b) {if(a[sort] == b[sort]) return(0); else return (a[sort] > b[sort]) ? -1 : +1; });
			var lastSection = "";
			for(var t = 0; t < tiddlers.length; t++)
				var tiddler = tiddlers[t];
				var theSection = "";
				if (sort=="modified") theSection=tiddler.modified.toLocaleDateString();
				if (sort=="modifier") theSection=tiddler.modifier;
				if (theSection != lastSection)
					theList.options[i++] = new Option(theSection,"",false,false);
					lastSection = theSection;
				theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);
	theList.selectedIndex=selectedIndex;		  // select current control item

// // list filtering
function getFilterDate(val,id)
	var result=0;
	switch (val) {
		case 'site':
			var timestamp=store.getTiddlerText("SiteDate");
			if (!timestamp) timestamp=document.lastModified;
			result=new Date(timestamp);
		case 'file':
			result=new Date(document.lastModified);
		case 'other':
			result=new Date(document.getElementById(id).value);
		default: // today=0, yesterday=1, one week=7, two weeks=14, a month=31
			var now=new Date(); var tz=now.getTimezoneOffset()*60000; now-=tz;
			var oneday=86400000;
			if (id=='exportStartDate')
				result=new Date((Math.floor(now/oneday)-val)*oneday+tz);
				result=new Date((Math.floor(now/oneday)-val+1)*oneday+tz-1);
	// DEBUG alert('getFilterDate('+val+','+id+')=='+result+"\nnow="+now);
	return result;

function filterExportList()
	var theList  = document.getElementById("exportList"); if (!theList) return -1;

	var filterStart=document.getElementById("exportFilterStart").checked;
	var val=document.getElementById("exportFilterStartBy").value;
	var startDate=getFilterDate(val,'exportStartDate');

	var filterEnd=document.getElementById("exportFilterEnd").checked;
	var val=document.getElementById("exportFilterEndBy").value;
	var endDate=getFilterDate(val,'exportEndDate');

	var filterTags=document.getElementById("exportFilterTags").checked;
	var tags=document.getElementById("exportTags").value;

	var filterText=document.getElementById("exportFilterText").checked;
	var text=document.getElementById("exportText").value;

	if (!(filterStart||filterEnd||filterTags||filterText)) {
		alert("Please set the selection filter");
		return -1;
	if (filterStart&&filterEnd&&(startDate>endDate)) {
		var msg="starting date/time:\n"
		msg+="is later than ending date/time:\n"
		return -1;

	// scan list and select tiddlers that match all applicable criteria
	var total=0;
	var count=0;
	for (var i=0; i<theList.options.length; i++) {
		// get item, skip non-tiddler list items (section headings)
		var opt=theList.options[i]; if (opt.value=="") continue;
		// get tiddler, skip missing tiddlers (this should NOT happen)
		var tiddler=store.getTiddler(opt.value); if (!tiddler) continue; 
		var sel=true;
		if ( (filterStart && tiddler.modified<startDate)
		|| (filterEnd && tiddler.modified>endDate)
		|| (filterTags && !matchTags(tiddler,tags))
		|| (filterText && (tiddler.text.indexOf(text)==-1) && (tiddler.title.indexOf(text)==-1)))
	return count;

function matchTags(tiddler,cond)
	if (!cond||!cond.trim().length) return false;

	// build a regex of all tags as a big-old regex that 
	// OR's the tags together (tag1|tag2|tag3...) in length order
	var tgs = store.getTags();
	if ( tgs.length == 0 ) return results ;
	var tags = tgs.sort( function(a,b){return (a[0].length<b[0].length)-(a[0].length>b[0].length);});
	var exp = "(" + tags.join("|") + ")" ;
	exp = exp.replace( /(,[\d]+)/g, "" ) ;
	var regex = new RegExp( exp, "ig" );

	// build a string such that an expression that looks like this: tag1 AND tag2 OR NOT tag3
	// turns into : /tag1/.test(...) && /tag2/.test(...) || ! /tag2/.test(...)
	cond = cond.replace( regex, "/$1\\|/.test(tiddlerTags)" );
	cond = cond.replace( /\sand\s/ig, " && " ) ;
	cond = cond.replace( /\sor\s/ig, " || " ) ;
	cond = cond.replace( /\s?not\s/ig, " ! " ) ;

	// if a boolean uses a tag that doesn't exist - it will get left alone 
	// (we only turn existing tags into actual tests).
	// replace anything that wasn't found as a tag, AND, OR, or NOT with the string "false"
	// if the tag doesn't exist then /tag/.test(...) will always return false.
	cond = cond.replace( /(\s|^)+[^\/\|&!][^\s]*/g, "false" ) ;

	// make a string of the tags in the tiddler and eval the 'cond' string against that string 
	// if it's TRUE then the tiddler qualifies!
	var tiddlerTags = (tiddler.tags?tiddler.tags.join("|"):"")+"|" ;
	try { if ( eval( cond ) ) return true; }
	catch( e ) { displayMessage("Error in tag filter '" + e + "'" ); }
	return false;

// // output data formatting
// // exportHeader(format)
function exportHeader(format)
	switch (format) {
		case "TW":	return exportTWHeader();
		case "DIV":	return exportDIVHeader();
		case "XML":	return exportXMLHeader();

// // exportFooter(format)
function exportFooter(format)
	switch (format) {
		case "TW":	return exportDIVFooter();
		case "DIV":	return exportDIVFooter();
		case "XML":	return exportXMLFooter();

// // exportTWHeader()
function exportTWHeader()
	// Get the URL of the document
	var originalPath = document.location.href;
	// Check we were loaded from a file URL
	if(originalPath.substr(0,5) != "file:")
		{ alert(config.messages.notFileUrlError); return; }
	// Remove any location part of the URL
	var hashPos = originalPath.indexOf("#"); if(hashPos != -1) originalPath = originalPath.substr(0,hashPos);
	// Convert to a native file format assuming
	// "file:///x:/path/path/path..." - pc local file --> "x:\path\path\path..."
	// "file://///server/share/path/path/path..." - FireFox pc network file --> "\\server\share\path\path\path..."
	// "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."
	// "file://server/share/path/path/path..." - pc network file --> "\\server\share\path\path\path..."
	var localPath;
	if(originalPath.charAt(9) == ":") // pc local file
		localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file://///") == 0) // FireFox pc network file
		localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file:///") == 0) // mac/unix local file
		localPath = unescape(originalPath.substr(7));
	else if(originalPath.indexOf("file:/") == 0) // mac/unix local file
		localPath = unescape(originalPath.substr(5));
	else // pc network file
		localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\");
	// Load the original file
	var original = loadFile(localPath);
	if(original == null)
		{ alert(config.messages.cantSaveError); return; }
	// Locate the storeArea div's
	var posOpeningDiv = original.indexOf(startSaveArea);
	var posClosingDiv = original.lastIndexOf(endSaveArea);
	if((posOpeningDiv == -1) || (posClosingDiv == -1))
		{ alert(config.messages.invalidFileError.format([localPath])); return; }
	return original.substr(0,posOpeningDiv+startSaveArea.length)

// // exportDIVHeader()
function exportDIVHeader()
	var out=[];
	var now = new Date();
	var title = convertUnicodeToUTF8(wikifyPlain("SiteTitle").htmlEncode());
	var subtitle = convertUnicodeToUTF8(wikifyPlain("SiteSubtitle").htmlEncode());
	var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());
	var twver = version.major+"."+version.minor+"."+version.revision;
	var pver = version.extensions.exportTiddlers.major+"."
	out.push("<style type=\"text/css\">");
	out.push("#storeArea {display:block;margin:1em;}");
	out.push("#storeArea div");
	out.push("{padding:0.5em;margin:1em;border:2px solid black;height:10em;overflow:auto;}");
	out.push("<div id=\"javascriptWarning\">");
	out.push("TiddlyWiki export file<br>");
	out.push("Source: <b>"+convertUnicodeToUTF8(document.location.href)+"</b><br>");
	out.push("Title: <b>"+title+"</b><br>");
	out.push("Subtitle: <b>"+subtitle+"</b><br>");
	out.push("Created: <b>"+now.toLocaleString()+"</b> by <b>"+user+"</b><br>");
	out.push("TiddlyWiki "+twver+" / "+"ExportTiddlersPlugin "+pver+"<br>");
	out.push("<div id=\"storeArea\">");
	return out;

// // exportDIVFooter()
function exportDIVFooter()
	var out=[];
	return out;

// // exportXMLHeader()
function exportXMLHeader()
	var out=[];
	var now = new Date();
	var u = store.getTiddlerText("SiteUrl",null);
	var title = convertUnicodeToUTF8(wikifyPlain("SiteTitle").htmlEncode());
	var subtitle = convertUnicodeToUTF8(wikifyPlain("SiteSubtitle").htmlEncode());
	var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());
	var twver = version.major+"."+version.minor+"."+version.revision;
	var pver = version.extensions.exportTiddlers.major+"."
	out.push("<" + "?xml version=\"1.0\"?" + ">");
	out.push("<rss version=\"2.0\">");
	out.push("<title>" + title + "</title>");
	if(u) out.push("<link>" + convertUnicodeToUTF8(u.htmlEncode()) + "</link>");
	out.push("<description>" + subtitle + "</description>");
	out.push("<copyright>Copyright " + now.getFullYear() + " " + user + "</copyright>");
	out.push("<pubDate>" + now.toGMTString() + "</pubDate>");
	out.push("<lastBuildDate>" + now.toGMTString() + "</lastBuildDate>");
	out.push("<generator>TiddlyWiki "+twver+" plus ExportTiddlersPlugin "+pver+"</generator>");
	return out;

// // exportXMLFooter()
function exportXMLFooter()
	var out=[];
	return out;

// // exportData()
function exportData(theList,theFormat)
	// scan export listbox and collect DIVs or XML for selected tiddler content
	var out=[];
	for (var i=0; i<theList.options.length; i++) {
		// get item, skip non-selected items and section headings
		var opt=theList.options[i]; if (!opt.selected||(opt.value=="")) continue;
		// get tiddler, skip missing tiddlers (this should NOT happen)
		var thisTiddler=store.getTiddler(opt.value); if (!thisTiddler) continue; 
		if (theFormat=="TW")	out.push(convertUnicodeToUTF8(thisTiddler.saveToDiv()));
		if (theFormat=="DIV")	out.push(convertUnicodeToUTF8(thisTiddler.title+"\n"+thisTiddler.saveToDiv()));
		if (theFormat=="XML")	out.push(convertUnicodeToUTF8(thisTiddler.saveToRss()));
	return out;

// // exportTiddlers(): output selected data to local or server
function exportTiddlers()
	var theList  = document.getElementById("exportList"); if (!theList) return;

	// get the export settings
	var theProtocol = document.getElementById("exportTo").value;
	var theFormat = document.getElementById("exportFormat").value;

	// assemble output: header + tiddlers + footer
	var theData=exportData(theList,theFormat);
	var count=theData.length;
	var out=[]; var txt=out.concat(exportHeader(theFormat),theData,exportFooter(theFormat)).join("\n");
	var msg="";
	switch (theProtocol) {
		case "file:":
			var theTarget = document.getElementById("exportFilename").value.trim();
			if (!theTarget.length) msg = "A local path/filename is required\n";
			if (!msg && saveFile(theTarget,txt))
				msg=count+" tiddler"+((count!=1)?"s":"")+" exported to local file";
			else if (!msg)
				msg+="An error occurred while saving to "+theTarget;
		case "http:":
		case "https:":
			var theTarget = document.getElementById("exportHTTPServerURL").value.trim();
			if (!theTarget.length) msg = "A server URL is required\n";
			if (document.getElementById('exportNotify').checked)
			if (document.getElementById('exportNotes').value.trim().length)
			if (!msg && exportPost(theTarget+encodeURIComponent(txt)))
				msg=count+" tiddler"+((count!=1)?"s":"")+" exported to "+theProtocol+" server";
			else if (!msg)
				msg+="An error occurred while saving to "+theTarget;
		case "ftp:":
			msg="Sorry, export to "+theLocation+" is not yet available";
	clearMessage(); displayMessage(msg,theTarget);

// // exportPost(url): cross-domain post uses hidden iframe to submit url and capture responses
function exportPost(url)
	var f=document.getElementById("exportFrame"); if (f) document.body.removeChild(f);
	f=document.createElement("iframe"); f.id="exportFrame";
	f.style.width="0px"; f.style.height="0px"; f.style.border="0px";
	var d=f.document;
	if (f.contentDocument) d=f.contentDocument; // For NS6
	else if (f.contentWindow) d=f.contentWindow.document; // For IE5.5 and IE6
 	return true;

// // promptForFilename(msg,path,file) uses platform/browser specific functions to get local filespec
function promptForExportFilename(here)
	var msg=here.title; // use tooltip as dialog box message
	var path=getLocalPath(document.location.href);
	var slashpos=path.lastIndexOf("/"); if (slashpos==-1) slashpos=path.lastIndexOf("\\"); 
	if (slashpos!=-1) path = path.substr(0,slashpos+1); // remove filename from path, leave the trailing slash
	var file=config.macros.exportTiddlers.newdefault;
	var result="";
	if(window.Components) { // moz
		try {
			var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
			var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
			picker.init(window, msg, nsIFilePicker.modeSave);
			var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
			if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;
		catch(e) { alert('error during local file access: '+e.toString()) }
	else { // IE
		try { // XP only
			var s = new ActiveXObject('UserAccounts.CommonDialog');
			s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';
			s.FilterIndex=3; // default to HTML files;
			if (s.showOpen()) var result=s.FileName;
		catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE
	return result;
This course explores the [[dialogue]] between feminist concerns and moral theory, revisiting along the way what might count as "a feminist concern". After a brief review of several canonical moral theories, we will ask whether their language (reason, fairness, equality, utility, human nature, rights) sufficiently allows articulation of feminist problems. If gender categories and intersecting deep social identities have resiliently resisted moral scrutiny, can distinctively feminist contributions to moral theory provide better critical tools? 
!On one hand, we will evaluate attempts to ''synthesize'' feminist criticism with canonical moral ideas from Aristotle, Confucius, Hume, Kant, Marx, and Mill, as well as Gilligan's and Noddings' care-based analyses of moral interaction. On the other hand, some recent feminists have ''questioned the point'' and function of moral theorizing in response to oppression: does the very idea of moral judgment involve arrogance or objectification? We examine how critical inquiry about gender inspires deep questions about moral theory for authors such as bell hooks, Marilyn Frye, Maria Lugones, Sarah Lucia Hoagland, Margaret Walker, and Susan Babbitt, among others.
!This course, ''PHIL/WMST 277'', will serve as a Gateway course for the [[WMST / FG&S Studies|http://www.wesleyan.edu/wmst/]] major.
Many specialized software tools are developed for academic purposes, from bibliographic software to grade-keepers and test-generators. After all, almost all of what we need to handle in our work has ''data structure'' to it. Still, many sound pedagogical uses of textual data have never been anticipated by a commercial programmer. 
Using a user-friendly, flexible, and powerful database engine ([[FileMakerPro|www.filemaker.com]]) has allowed me to track and navigate everything from bibliography and text excerpts to syllabus structure, from archived feedback for students to group-based project-tracking and individually-customized student exams — and to interrelate any of these projects without limitations. Though most of this academic technology is not directly visible to students, my FileMaker footwork behind the scenes makes it possible to ''direct attention in new ways'' that otherwise would be too cumbersome.
!I am always happy to field inquiries. 
|''Version:''|1.0.8 (2007-04-12)|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|&copy; 2005-2007 [[abego Software|http://www.abego-software.de]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|

Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.

|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|
|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|
|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and  {{{context}}}.|
|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and  {{{context}}}.|
|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|
|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]]  is used.|
|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|

See details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].

!Revision history
* v1.0.8 (2007-04-12)
** Adapted to latest TiddlyWiki 2.2 Beta importTiddlyWiki API (introduced with changeset 2004). TiddlyWiki 2.2 Beta builds prior to changeset 2004 are no longer supported (but TiddlyWiki 2.1 and earlier, of cause)
* v1.0.7 (2007-03-28)
** Also support "pre" formatted TiddlyWikis (introduced with TW 2.2) (when using "in" clause to work on external tiddlers)
* v1.0.6 (2006-09-16)
** Context provides "viewerTiddler", i.e. the tiddler used to view the macro. Most times this is equal to the "inTiddler", but when using the "tiddler" macro both may be different.
** Support "begin", "end" and "none" expressions in "write" action
* v1.0.5 (2006-02-05)
** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.
** Support Firefox
** Internal
*** Make "JSLint" conform
*** "Only install once"
* v1.0.4 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.3 (2005-12-22)
** Features: 
*** Write output to a file supports multi-byte environments (Thanks to Bram Chen) 
*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)
** Enhancements:
*** Improved error messages on InternetExplorer.
* v1.0.2 (2005-12-10)
** Features: 
*** context object also holds reference to store (TiddlyWiki)
** Fixed Bugs: 
*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)
* v1.0.1 (2005-12-08)
** Features: 
*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".
*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.
*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).
*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .
*** Improved script evaluation (for where/sort clause and write scripts).
* v1.0.0 (2005-11-20)
** initial version


//		   ForEachTiddlerPlugin

// Only install once
if (!version.extensions.ForEachTiddlerPlugin) {

if (!window.abego) window.abego = {};

version.extensions.ForEachTiddlerPlugin = {
	major: 1, minor: 0, revision: 8, 
	date: new Date(2007,3,12), 
	source: "http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin",
	licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",
	copyright: "Copyright (c) abego Software GmbH, 2005-2007 (www.abego-software.de)"

// For backward compatibility with TW 1.2.x
if (!TiddlyWiki.prototype.forEachTiddler) {
	TiddlyWiki.prototype.forEachTiddler = function(callback) {
		for(var t in this.tiddlers) {

// forEachTiddler Macro

version.extensions.forEachTiddler = {
	major: 1, minor: 0, revision: 8, date: new Date(2007,3,12), provider: "http://tiddlywiki.abego-software.de"};

// ---------------------------------------------------------------------------
// Configurations and constants 
// ---------------------------------------------------------------------------

config.macros.forEachTiddler = {
	 // Standard Properties
	 label: "forEachTiddler",
	 prompt: "Perform actions on a (sorted) selection of tiddlers",

	 // actions
	 actions: {
		 addToList: {},
		 write: {}

// ---------------------------------------------------------------------------
//  The forEachTiddler Macro Handler 
// ---------------------------------------------------------------------------

config.macros.forEachTiddler.getContainingTiddler = function(e) {
	while(e && !hasClass(e,"tiddler"))
		e = e.parentNode;
	var title = e ? e.getAttribute("tiddler") : null; 
	return title ? store.getTiddler(title) : null;

config.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	// config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);

	if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);
	// --- Parsing ------------------------------------------

	var i = 0; // index running over the params
	// Parse the "in" clause
	var tiddlyWikiPath = undefined;
	if ((i < params.length) && params[i] == "in") {
		if (i >= params.length) {
			this.handleError(place, "TiddlyWiki path expected behind 'in'.");
		tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");

	// Parse the where clause
	var whereClause ="true";
	if ((i < params.length) && params[i] == "where") {
		whereClause = this.paramEncode((i < params.length) ? params[i] : "");

	// Parse the sort stuff
	var sortClause = null;
	var sortAscending = true; 
	if ((i < params.length) && params[i] == "sortBy") {
		if (i >= params.length) {
			this.handleError(place, "sortClause missing behind 'sortBy'.");
		sortClause = this.paramEncode(params[i]);

		if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {
			 sortAscending = params[i] == "ascending";

	// Parse the script
	var scriptText = null;
	if ((i < params.length) && params[i] == "script") {
		scriptText = this.paramEncode((i < params.length) ? params[i] : "");

	// Parse the action. 
	// When we are already at the end use the default action
	var actionName = "addToList";
	if (i < params.length) {
	   if (!config.macros.forEachTiddler.actions[params[i]]) {
			this.handleError(place, "Unknown action '"+params[i]+"'.");
		} else {
			actionName = params[i]; 
	// Get the action parameter
	// (the parsing is done inside the individual action implementation.)
	var actionParameter = params.slice(i);

	// --- Processing ------------------------------------------
	try {
				place: place, 
				inTiddler: tiddler,
				whereClause: whereClause, 
				sortClause: sortClause, 
				sortAscending: sortAscending, 
				actionName: actionName, 
				actionParameter: actionParameter, 
				scriptText: scriptText, 
				tiddlyWikiPath: tiddlyWikiPath});

	} catch (e) {
		this.handleError(place, e);

// Returns an object with properties "tiddlers" and "context".
// tiddlers holds the (sorted) tiddlers selected by the parameter,
// context the context of the execution of the macro.
// The action is not yet performed.
// @parameter see performMacro
config.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {

	var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);

	var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;
	context["tiddlyWiki"] = tiddlyWiki;
	// Get the tiddlers, as defined by the whereClause
	var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);
	context["tiddlers"] = tiddlers;

	// Sort the tiddlers, when sorting is required.
	if (parameter.sortClause) {
		this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);

	return {tiddlers: tiddlers, context: context};

// Returns the (sorted) tiddlers selected by the parameter.
// The action is not yet performed.
// @parameter see performMacro
config.macros.forEachTiddler.getTiddlers = function(parameter) {
	return this.getTiddlersAndContext(parameter).tiddlers;

// Performs the macros with the given parameter.
// @param parameter holds the parameter of the macro as separate properties.
//				  The following properties are supported:
//						place
//						whereClause
//						sortClause
//						sortAscending
//						actionName
//						actionParameter
//						scriptText
//						tiddlyWikiPath
//					All properties are optional. 
//					For most actions the place property must be defined.
config.macros.forEachTiddler.performMacro = function(parameter) {
	var tiddlersAndContext = this.getTiddlersAndContext(parameter);

	// Perform the action
	var actionName = parameter.actionName ? parameter.actionName : "addToList";
	var action = config.macros.forEachTiddler.actions[actionName];
	if (!action) {
		this.handleError(parameter.place, "Unknown action '"+actionName+"'.");

	var actionHandler = action.handler;
	actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);

// ---------------------------------------------------------------------------
//  The actions 
// ---------------------------------------------------------------------------

// Internal.
// --- The addToList Action -----------------------------------------------
config.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {
	// Parse the parameter
	var p = 0;

	// Check for extra parameters
	if (parameter.length > p) {
		config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);

	// Perform the action.
	var list = document.createElement("ul");
	for (var i = 0; i < tiddlers.length; i++) {
		var tiddler = tiddlers[i];
		var listItem = document.createElement("li");
		createTiddlyLink(listItem, tiddler.title, true);

abego.parseNamedParameter = function(name, parameter, i) {
	var beginExpression = null;
	if ((i < parameter.length) && parameter[i] == name) {
		if (i >= parameter.length) {
			throw "Missing text behind '%0'".format([name]);
		return config.macros.forEachTiddler.paramEncode(parameter[i]);
	return null;

// Internal.
// --- The write Action ---------------------------------------------------
config.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {
	// Parse the parameter
	var p = 0;
	if (p >= parameter.length) {
		this.handleError(place, "Missing expression behind 'write'.");

	var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);

	// Parse the "begin" option
	var beginExpression = abego.parseNamedParameter("begin", parameter, p);
	if (beginExpression !== null) 
		p += 2;
	var endExpression = abego.parseNamedParameter("end", parameter, p);
	if (endExpression !== null) 
		p += 2;
	var noneExpression = abego.parseNamedParameter("none", parameter, p);
	if (noneExpression !== null) 
		p += 2;

	// Parse the "toFile" option
	var filename = null;
	var lineSeparator = undefined;
	if ((p < parameter.length) && parameter[p] == "toFile") {
		if (p >= parameter.length) {
			this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");
		filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));
		if ((p < parameter.length) && parameter[p] == "withLineSeparator") {
			if (p >= parameter.length) {
				this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");
			lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);
	// Check for extra parameters
	if (parameter.length > p) {
		config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);

	// Perform the action.
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);
	var count = tiddlers.length;
	var text = "";
	if (count > 0 && beginExpression)
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);
	for (var i = 0; i < count; i++) {
		var tiddler = tiddlers[i];
		text += func(tiddler, context, count, i);
	if (count > 0 && endExpression)
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);

	if (count == 0 && noneExpression) 
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(noneExpression, context)(undefined, context, count, undefined);

	if (filename) {
		if (lineSeparator !== undefined) {
			lineSeparator = lineSeparator.replace(/\\n/mg, "\n").replace(/\\r/mg, "\r");
			text = text.replace(/\n/mg,lineSeparator);
		saveFile(filename, convertUnicodeToUTF8(text));
	} else {
		var wrapper = createTiddlyElement(place, "span");
		wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);

// ---------------------------------------------------------------------------
//  Helpers
// ---------------------------------------------------------------------------

// Internal.
config.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {
	return {
		place : placeParam, 
		whereClause : whereClauseParam, 
		sortClause : sortClauseParam, 
		sortAscending : sortAscendingParam, 
		script : scriptText,
		actionName : actionNameParam, 
		actionParameter : actionParameterParam,
		tiddlyWikiPath : tiddlyWikiPathParam,
		inTiddler : inTiddlerParam, // the tiddler containing the <<forEachTiddler ...>> macro call.
		viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result

// Internal.
// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of 
// the given path.
config.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {
	if (!idPrefix) {
		idPrefix = "store";
	var lenPrefix = idPrefix.length;
	// Read the content of the given file
	var content = loadFile(this.getLocalPath(path));
	if(content === null) {
		throw "TiddlyWiki '"+path+"' not found.";
	var tiddlyWiki = new TiddlyWiki();

	// Starting with TW 2.2 there is a helper function to import the tiddlers
	if (tiddlyWiki.importTiddlyWiki) {
		if (!tiddlyWiki.importTiddlyWiki(content))
			throw "File '"+path+"' is not a TiddlyWiki.";
		tiddlyWiki.dirty = false;
		return tiddlyWiki;
	// The legacy code, for TW < 2.2
	// Locate the storeArea div's
	var posOpeningDiv = content.indexOf(startSaveArea);
	var posClosingDiv = content.lastIndexOf(endSaveArea);
	if((posOpeningDiv == -1) || (posClosingDiv == -1)) {
		throw "File '"+path+"' is not a TiddlyWiki.";
	var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);
	// Create a "div" element that contains the storage text
	var myStorageDiv = document.createElement("div");
	myStorageDiv.innerHTML = storageText;
	// Create all tiddlers in a new TiddlyWiki
	// (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)
	var store = myStorageDiv.childNodes;
	for(var t = 0; t < store.length; t++) {
		var e = store[t];
		var title = null;
			title = e.getAttribute("tiddler");
		if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)
			title = e.id.substr(lenPrefix);
		if(title && title !== "") {
			var tiddler = tiddlyWiki.createTiddler(title);
	tiddlyWiki.dirty = false;

	return tiddlyWiki;

// Internal.
// Returns a function that has a function body returning the given javaScriptExpression.
// The function has the parameters:
//	 (tiddler, context, count, index)
config.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {
	var script = context["script"];
	var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";
	var fullText = (script ? script+";" : "")+functionText+";theFunction;";
	return eval(fullText);

// Internal.
config.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {
	var result = [];
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);
	tiddlyWiki.forEachTiddler(function(title,tiddler) {
		if (func(tiddler, context, undefined, undefined)) {
	return result;

// Internal.
config.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {
	var message = "Extra parameter behind '"+actionName+"':";
	for (var i = firstUnusedIndex; i < parameter.length; i++) {
		message += " "+parameter[i];
	this.handleError(place, message);

// Internal.
config.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {
	var result = 
		(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) 
			? 0
			: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
			   ? -1 
			   : +1; 
	return result;

// Internal.
config.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {
	var result = 
		(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) 
			? 0
			: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
			   ? +1 
			   : -1; 
	return result;

// Internal.
config.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {
	// To avoid evaluating the sortClause whenever two items are compared 
	// we pre-calculate the sortValue for every item in the array and store it in a 
	// temporary property ("forEachTiddlerSortValue") of the tiddlers.
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);
	var count = tiddlers.length;
	var i;
	for (i = 0; i < count; i++) {
		var tiddler = tiddlers[i];
		tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);

	// Do the sorting
	tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);

	// Delete the temporary property that holds the sortValue.	
	for (i = 0; i < tiddlers.length; i++) {
		delete tiddlers[i].forEachTiddlerSortValue;

// Internal.
config.macros.forEachTiddler.trace = function(message) {

// Internal.
config.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {
	var message ="<<"+macroName;
	for (var i = 0; i < params.length; i++) {
		message += " "+params[i];
	message += ">>";

// Internal.
// Creates an element that holds an error message
config.macros.forEachTiddler.createErrorElement = function(place, exception) {
	var message = (exception.description) ? exception.description : exception.toString();
	return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);

// Internal.
// @param place [may be null]
config.macros.forEachTiddler.handleError = function(place, exception) {
	if (place) {
		this.createErrorElement(place, exception);
	} else {
		throw exception;

// Internal.
// Encodes the given string.
// Replaces 
//	 "$))" to ">>"
//	 "$)" to ">"
config.macros.forEachTiddler.paramEncode = function(s) {
	var reGTGT = new RegExp("\\$\\)\\)","mg");
	var reGT = new RegExp("\\$\\)","mg");
	return s.replace(reGTGT, ">>").replace(reGT, ">");

// Internal.
// Returns the given original path (that is a file path, starting with "file:")
// as a path to a local file, in the systems native file format.
// Location information in the originalPath (i.e. the "#" and stuff following)
// is stripped.
config.macros.forEachTiddler.getLocalPath = function(originalPath) {
	// Remove any location part of the URL
	var hashPos = originalPath.indexOf("#");
	if(hashPos != -1)
		originalPath = originalPath.substr(0,hashPos);
	// Convert to a native file format assuming
	// "file:///x:/path/path/path..." - pc local file --> "x:\path\path\path..."
	// "file://///server/share/path/path/path..." - FireFox pc network file --> "\\server\share\path\path\path..."
	// "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."
	// "file://server/share/path/path/path..." - pc network file --> "\\server\share\path\path\path..."
	var localPath;
	if(originalPath.charAt(9) == ":") // pc local file
		localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file
		localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file:///") === 0) // mac/unix local file
		localPath = unescape(originalPath.substr(7));
	else if(originalPath.indexOf("file:/") === 0) // mac/unix local file
		localPath = unescape(originalPath.substr(5));
	else // pc network file
		localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\");	
	return localPath;

// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
	".forEachTiddlerError{color: #ffffff;background-color: #880000;}",

// End of forEachTiddler Macro

// String.startsWith Function
// Returns true if the string starts with the given prefix, false otherwise.
version.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
String.prototype.startsWith = function(prefix) {
	var n =  prefix.length;
	return (this.length >= n) && (this.slice(0, n) == prefix);

// String.endsWith Function
// Returns true if the string ends with the given suffix, false otherwise.
version.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
String.prototype.endsWith = function(suffix) {
	var n = suffix.length;
	return (this.length >= n) && (this.right(n) == suffix);

// String.contains Function
// Returns true when the string contains the given substring, false otherwise.
version.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
String.prototype.contains = function(substring) {
	return this.indexOf(substring) >= 0;

// Array.indexOf Function
// Returns the index of the first occurance of the given item in the array or 
// -1 when no such item exists.
// @param item [may be null]
version.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
Array.prototype.indexOf = function(item) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == item) {
			return i;
	return -1;

// Array.contains Function
// Returns true when the array contains the given item, otherwise false. 
// @param item [may be null]
version.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
Array.prototype.contains = function(item) {
	return (this.indexOf(item) >= 0);

// Array.containsAny Function
// Returns true when the array contains at least one of the elements 
// of the item. Otherwise (or when items contains no elements) false is returned.
version.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
Array.prototype.containsAny = function(items) {
	for(var i = 0; i < items.length; i++) {
		if (this.contains(items[i])) {
			return true;
	return false;

// Array.containsAll Function
// Returns true when the array contains all the items, otherwise false.
// When items is null false is returned (even if the array contains a null).
// @param items [may be null] 
version.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
Array.prototype.containsAll = function(items) {
	for(var i = 0; i < items.length; i++) {
		if (!this.contains(items[i])) {
			return false;
	return true;

} // of "install only once"

// Used Globals (for JSLint) ==============
// ... DOM
/*global 	document */
// ... TiddlyWiki Core
/*global 	convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, 
			displayMessage, endSaveArea, hasClass, loadFile, saveFile, 
			startSaveArea, store, wikify */

!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.


[[George Herbert Mead|http://www.iep.utm.edu/m/mead.htm]], a social psychologist, philosopher, and close friend of [[John Dewey]]'s, approached the development of self as the product of social interaction, and sought to cast moral problem-solving as a dynamic process which doesn't simply put constraints on a pre-moral self, but rather gives the self substance and significance. His [[interactionist model]] has been more influential within sociology and psychology than within philosophy, though his ideas are both philosophically and morally insightful.  
!!It is ... a [[mistake to separate|ecological theory]] the cultural environment from the natural environment, as if there were a world of ''mental'' products distinct from the world of ''material'' products. ''There is only one world'', however diverse, and all animals live in it, although we human animals have ''altered'' it to suit ourselves. We have done so wastefully, ''thoughtlessly'', and, if we do not mend our ways, fatally.
!!!!—J.J. Gibson, //The Ecological Approach to Visual Perception//, 1979
''[[Go|http://senseis.xmp.net/]]'' (baduk, weiqi) is a beautiful strategy game: easy to learn and more difficult than chess to master. Wesleyan's Go Club meets during the academic year on Fridays and Sundays at the Mansfield- Freeman Center for East Asian Studies, 4:30 pm. [[Contact Evan Morse|mailto:emorse@wesleyan.edu]]
MainMenu DefaultTiddlers SiteTitle SiteSubtitle StyleSheet ConfigTiddlers HiddenTiddlers StickySettings SiteUrl

[[•]] ToRead ColleagueNotes DraftPapersList [[Welcome...]]

	// get the tiddler element
	var t=story.findContainingTiddler(place);
	if (t && t.id!="tiddlerHideTiddlerTitle") 
		for (var i=0; i<t.childNodes.length; i++)
			if (hasClass(t.childNodes[i],"title")||hasClass(t.childNodes[i],"subtitle"))
!!Thus, within academic sociology, the internal connection that often holds between the emergence of social movements and the moral ''experience of disrespect'' has, to a large extent, been theoretically severed at the start. The motives for rebellion, protest, and [[resistance|critical resistance]] have generally been transformed into categories of 'interest'... without ever being linked... to the everyday web of ''moral feelings''.
!!!!—Axel Honneth, //The Struggle for Recognition: The Moral Grammar of Social Conflicts// (1996)
!!The legacy of harm is that we are ''alienated'' from our understanding of ourselves as moral beings, and from each other.... We become resistant and/or paralyzed because we experience the side effects of the ''incoherence'' of the modern concept of responsibility.
!!!!—Barbara Houston, "Taking Responsibility" (//Philosophy of Education//, 2002)
|!Philosophy 218: Personal Identity and Choice|
The seminar introduces the metaphysical questions associated with identity and with choice, drawing parallels and connections between issues in both domains. We start by exploring classic extreme positions: Plato and the Stoics on the soul and its faculty of choice, Buddha's view of no-self, Mettrie's determinism and Chisholm's argument for the freedom of agents. We then navigate between the extremes by examining the importance of narrative, social identity, complexity of the self, and changes over time.

On the theme of identity, we ask questions such as the following: How do certain experiences and thoughts and physical materials compose one self? Am I the same person over time even through complete transformations of experience, thought and material? Can I choose which elements of my existence to count as essential? Some argue the concept of a unified and enduring self is illusory; at the other extreme some argue that individual souls have a necessary and permanent integrity. What kind of compromise views are coherent? Do some personalities have more integrity, and others less? Is it important to have a unified self?

Regarding choice and freedom, we find a related debate, ranging from those who deny free will altogether to those who define humanity's essence in terms of choice and agency. Yet the most interesting views answer the question "Are we free?" by suggesting "It depends..." But on what does it depend? What could lead us to say some choices are more free than others? Are some lives more free than others on the whole? Is more choice always a good thing?

Besides serving as an introduction to philosophical reasoning, the course will draw interdisciplinary connections on themes such as social identities, religious experience, political freedom, and legal responsibility.

|For Fall 2009: This First Year Seminar is part of Wesleyan's ''Learning and Living Program''. Students who register for this class will live together in the same residence hall. Because students are living in close proximity to one another, intellectual discussions and collaborative learning will extend beyond the classroom. This arrangement facilitates group assignments and projects, and allows for the growth of a strong community of students through daily interaction. Strengthening students' intellectual and residential community enhances the undergraduate experience for Learning and Living seminar participants.|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|Description|Insert Javascript executable code directly into your tiddler content.|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
>see [[InlineJavascriptPluginInfo]]
2008.06.11 [1.9.3] added $(...) function as 'shorthand' convenience syntax for document.getElementById()
2008.03.03 [1.9.2] corrected declaration of wikifyPlainText() for 'TW 2.1.x compatibility fallback' (fixes Safari "parse error")
2008.02.23 [1.9.1] in onclick function, use string instead of array for 'bufferedHTML' attribute on link element (fixes IE errors)
2008.02.21 [1.9.0] 'onclick' scripts now allow returned text (or document.write() calls) to be wikified into a span that immediately follows the onclick link.  Also, added default 'return false' handling if no return value provided (prevents HREF from being triggered -- return TRUE to allow HREF to be processed).  Thanks to Xavier Verges for suggestion and preliminary code.
|please see [[InlineJavascriptPluginInfo]] for additional revision details|
2005.11.08 [1.0.0] initial release
version.extensions.inlineJavascript= {major: 1, minor: 9, revision: 3, date: new Date(2008,6,11)};

config.formatters.push( {
	name: "inlineJavascript",
	match: "\\<script",
	lookahead: "\\<script(?: src=\\\"((?:.|\\n)*?)\\\")?(?: label=\\\"((?:.|\\n)*?)\\\")?(?: title=\\\"((?:.|\\n)*?)\\\")?(?: key=\\\"((?:.|\\n)*?)\\\")?( show)?\\>((?:.|\\n)*?)\\</script\\>",

	handler: function(w) {
		var lookaheadRegExp = new RegExp(this.lookahead,"mg");
		lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var src=lookaheadMatch[1];
			var label=lookaheadMatch[2];
			var tip=lookaheadMatch[3];
			var key=lookaheadMatch[4];
			var show=lookaheadMatch[5];
			var code=lookaheadMatch[6];
			if (src) { // load a script library
				// make script tag, set src, add to body to execute, then remove for cleanup
				var script = document.createElement("script"); script.src = src;
				document.body.appendChild(script); document.body.removeChild(script);
			if (code) { // there is script code
				if (show) // show inline script code in tiddler output
				if (label) { // create a link to an 'onclick' script
					// add a link, define click handler, save code in link (pass 'place'), set link attributes
					var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",wikifyPlainText(label));
					var fixup=code.replace(/document.write\s*\(/gi,'place.bufferedHTML+=(');
					link.code="function _out(place){"+fixup+"\n};_out(this);"
						try{ var r=eval(this.code);
							if(this.bufferedHTML.length || (typeof(r)==="string")&&r.length)
								var s=this.parentNode.insertBefore(document.createElement("span"),this.nextSibling);
							if((typeof(r)==="string")&&r.length) {
								return false;
							} else return r!==undefined?r:false;
						} catch(e){alert(e.description||e.toString());return false;}
					var URIcode='javascript:void(eval(decodeURIComponent(%22(function(){try{';
					URIcode+=encodeURIComponent(encodeURIComponent(code.replace(/\n/g,' ')));
					if (key) link.accessKey=key.substr(0,1); // single character only
				else { // run inline script code
					var fixup=code.replace(/document.write\s*\(/gi,'place.innerHTML+=(');
					var code="function _out(place){"+fixup+"\n};_out(w.output);"
					try { var out=eval(code); } catch(e) { out=e.description?e.description:e.toString(); }
					if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
} )

// // Backward-compatibility for TW2.1.x and earlier
if (typeof(wikifyPlainText)=="undefined") window.wikifyPlainText=function(text,limit,tiddler) {
	if(limit > 0) text = text.substr(0,limit);
	var wikifier = new Wikifier(text,formatter,null,tiddler);
	return wikifier.wikifyPlain();

// // $(...) function: 'shorthand' convenience syntax for document.getElementById()
if (typeof($)=="undefined") { // avoid redefinition
function $() {
	var elements=new Array();
	for (var i=0; i<arguments.length; i++) {
		var element=arguments[i];
		if (typeof element=='string') element=document.getElementById(element);
		if (arguments.length==1) return element;
	return elements;
This entry-level discussion/lecture course at Wesleyan takes a tour through several landmark approaches to moral thinking. Our goals include not just familiarity with the positions studied, but careful ''analysis'' of philosophical reasoning and practice in constructive moral ''dialogue''. This course is among those which encourage fluency with [[philosophical reasoning|http://reasoningwell.tiddlyspot.com]].
!Our Fall 2005 ''[[PHIL 212 site|212fa05.html]]'' has been archived.
!!... a genuinely normative call must serve as an authoritative source of action, but it must not //complete// the determination of the action, so that it leaves its target free to responsibly and authoritatively respond to its authority.
!!!!–Rebecca Kukla, "The Ontology and Temporality of Conscience" in //Continental Philosophy Review// v. 35 (2002)
!!Because our ''conceptual systems'' grow out of our bodies, meaning is ''grounded in and though our bodies''. Because a vast range of our concepts are [[metaphorical|metaphors]], meaning is ''not entirely literal'' and the classical correspondence theory of truth is false. ... That does not mean that truth is purely subjective... Rather, our [[common embodiment|social affordances]] allows for common, ''stable truths''.
!!!!-- Lakoff and Johnson, //Philosophy in the Flesh// 1999
|Description:|Intelligently limit the number of backup files you create|
|Version:|3.0.1 ($Rev: 2320 $)|
|Date:|$Date: 2007-06-18 22:37:46 +1000 (Mon, 18 Jun 2007) $|
|Author:|Simon Baird|
You end up with just backup one per year, per month, per weekday, per hour, minute, and second.  So total number won't exceed about 200 or so. Can be reduced by commenting out the seconds/minutes/hours line from modes array
Works in IE and Firefox only.  Algorithm by Daniel Baird. IE specific code by by Saq Imtiaz.

var MINS  = 60 * 1000;
var HOURS = 60 * MINS;
var DAYS  = 24 * HOURS;

if (!config.lessBackups) {
	config.lessBackups = {
		// comment out the ones you don't want or set config.lessBackups.modes in your 'tweaks' plugin
		modes: [
			["YYYY",  365*DAYS], // one per year for ever
			["MMM",   31*DAYS],  // one per month
			["ddd",   7*DAYS],   // one per weekday
			//["d0DD",  1*DAYS],   // one per day of month
			["h0hh",  24*HOURS], // one per hour
			["m0mm",  1*HOURS],  // one per minute
			//["s0ss",  1*MINS],   // one per second
			["latest",0]         // always keep last version. (leave this).

window.getSpecialBackupPath = function(backupPath) {

	var now = new Date();

	var modes = config.lessBackups.modes;

	for (var i=0;i<modes.length;i++) {

		// the filename we will try
		var specialBackupPath = backupPath.replace(/(\.)([0-9]+\.[0-9]+)(\.html)$/,

		// open the file
		try {
			if (config.browser.isIE) {
				var fsobject = new ActiveXObject("Scripting.FileSystemObject")
				var fileExists  = fsobject.FileExists(specialBackupPath);
				if (fileExists) {
					var fileObject = fsobject.GetFile(specialBackupPath);
					var modDate = new Date(fileObject.DateLastModified).valueOf();
			else {
				var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
				var fileExists = file.exists();
				if (fileExists) {
					var modDate = file.lastModifiedTime;
		catch(e) {
			// give up
			return backupPath;

		// expiry is used to tell if it's an 'old' one. Eg, if the month is June and there is a
		// June file on disk that's more than an month old then it must be stale so overwrite
		// note that "latest" should be always written because the expiration period is zero (see above)
		var expiry = new Date(modDate + modes[i][1]);
		if (!fileExists || now > expiry)
			return specialBackupPath;

// hijack the core function
window.getBackupPath_mptw_orig = window.getBackupPath;
window.getBackupPath = function(localPath) {
	return getSpecialBackupPath(getBackupPath_mptw_orig(localPath));


[[Sneddon on Strawson|images/SneddonStrawson.pdf]]
[[Calhoun, "Responsibility and Reproach"|images/CalhounR&R2.pdf]]
@@font-size:0pt;[img[Wesleyan University|http://espringer.web.wesleyan.edu/images/weslogo130.gif][http://www.wesleyan.edu]]@@

[[contact me]]

+++[About E Springer]
<script label="<nowiki>[x]</nowiki>" title="hide this panel">
	var panel=place;
	while (panel && !hasClass(panel,'sliderPanel') && !hasClass(panel,'floatingPanel'))
		{ panel=panel.parentNode; }
	if (!panel) { alert('not in a slider'); return false; }
	var cookie=panel.button.sliderCookie;
	if (cookie && cookie.length) {
		if (config.options[cookie]!=panel.button.defOpen)
		else { // remove cookie if slider is in default display state
			var ex=new Date(); ex.setTime(ex.getTime()-1000);
			document.cookie = cookie+"=novalue; path=/; expires="+ex.toGMTString();
	return false;
</script><script>place.lastChild.style.fontWeight="normal"</script>~~[[Elise Springer]]~~
~~[[beyond philosophy]]~~
~~[[download CV|http://espringer.web.wesleyan.edu/SpringerCVshort.pdf]]~~


+++[Research Items|click to show/hide]
<script label="<nowiki>[x]</nowiki>" title="hide this panel">
	var panel=place;
	while (panel && !hasClass(panel,'sliderPanel') && !hasClass(panel,'floatingPanel'))
		{ panel=panel.parentNode; }
	if (!panel) { alert('not in a slider'); return false; }
	var cookie=panel.button.sliderCookie;
	if (cookie && cookie.length) {
		if (config.options[cookie]!=panel.button.defOpen)
		else { // remove cookie if slider is in default display state
			var ex=new Date(); ex.setTime(ex.getTime()-1000);
			document.cookie = cookie+"=novalue; path=/; expires="+ex.toGMTString();
	return false;
</script><script>place.lastChild.style.fontWeight="normal"</script>~~[[research project]]~~
~~[[papers presented]]~~
~~[[current reading|reading...]]~~
~~[[thinking about...]]~~
~~[[publication projects]]~~

+++[On Campus|click to show/hide]
<script label="<nowiki>[x]</nowiki>" title="hide this panel">
	var panel=place;
	while (panel && !hasClass(panel,'sliderPanel') && !hasClass(panel,'floatingPanel'))
		{ panel=panel.parentNode; }
	if (!panel) { alert('not in a slider'); return false; }
	var cookie=panel.button.sliderCookie;
	if (cookie && cookie.length) {
		if (config.options[cookie]!=panel.button.defOpen)
		else { // remove cookie if slider is in default display state
			var ex=new Date(); ex.setTime(ex.getTime()-1000);
			document.cookie = cookie+"=novalue; path=/; expires="+ex.toGMTString();
	return false;
~~[[Identity & Choice (218 FYS)|Identity & Choice]]~~
~~[[Amer Pragmatist Phil (321)|Pragmatist Philosophy]]~~
~~[[Ethics (212)|Introduction to Ethics]]~~
~~[[Seminar on Evil (343)|Evil, Blame & Understanding]]~~
~~[[Fem. Moral Theory (277)|Feminist Phil. & Moral Theory]]~~
~~[[all courses|courses]]~~

~~[[office hours]]~~
~~[[iTunes access|music library access]]~~
~~[[teaching technology]]~~

~~[[Ethics in Society|http://www.wesleyan.edu/ethics/]]~~
~~[[Wes Go club|Go club]]~~
~~[[Informal Reasoning|http://parmenides.objectis.net/reason/]]~~
~~[[Philosophy Dept.|http://www.wesleyan.edu/phil/]]~~
+++[About this site|click to show/hide]
~~Built with [[TiddlyWiki]].~~
~~[[Tips and more info|site explanation]]~~
<<option chkAnimate>> ^^~~Enable Animations~~^^
+++[ ] <<tiddler AdminStuff>>
       '! tiddler.tags.containsAny([["excludeLists"]])'
   script '
       abego.redirectAliases = function(tiddler, redirectPattern) {
           var result = "";
           var s = store.getValue(tiddler,"alias");
           if (s) {
               var p = s.parseParams("list",null,false,true);
               for(var i=1; i<p.length; i++)
                   result += redirectPattern.format([p[i].value]);
           return result;
       '"<<redirect \""+tiddler.title+"\" [["+tiddler.title+"]]$))\n"+
       "<<redirect \""+tiddler.title.toLowerCase()+"\" [["+tiddler.title+"]]$))\n"+
       abego.redirectAliases(tiddler,"<<redirect \"%0\" [["+tiddler.title+"]]$))\n")'
<<redirect "dialogical" [[dialogue]]>>
<!-- Start of StatCounter Code -->
<script type="text/javascript">

<script type="text/javascript" src="http://www.statcounter.com/counter/counter.js"></script><noscript><div class="statcounter"><a href="http://www.statcounter.com/free_hit_counter.html" target="_blank"><img class="statcounter" src="http://c7.statcounter.com/732261/0/b97f4d92/1/" alt="php hit counter" ></a></div></noscript>
<!-- End of StatCounter Code -->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml'/>

<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #dda; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#744; font-size: 28px; font-family:Tahoma; background-color:#ffd;"><blink>Loading</blink><br><b>Elise Springer's</b><br>philosophy homepage<br>at Wesleyan University<blink> ...</blink><br>Thanks for being patient!<br><br><span style="font-size: 14px; color:#567;">Page uses Javascript, and functions best on <a href="http://www.getfirefox.com">Firefox</a></span></div>
!!''Moral advance'' consists ''not in'' adapting individual natures to the ''fixed realities'' of a moral universe, but in constantly reconstructing and [[recreating the world as the individuals evolve|diachronic ethics]].  
!!!!-- G.H. Mead, "The Philosophical Basis of Ethics"
!!''Dissident speech'' must address more than one audience if it is to achieve its political aims.... For this reason, I have urged that it would be ''self-defeating'' for a socially excluded group ''to speak with a single voice'' in a single register... [[Counterfigurations|metaphors]] must be [[tailored to diverse audiences|truth and uptake]]
!!!!—Diana T. Meyers, //Subjection and Subjectivity// (1994)
!!''Relativists'' often see their view as conducive to ''respect''. But relativism isn’t necessary or sufficient for respect, and the mere expression of [[moral criticism|critical virtue]] should not be conflated with violence or coercion.'' 
!!!!—Michele ~Moody-Adams, //Fieldwork in Familiar Places//
My most recent publication, in //Ethical Theory and Moral Practice// (August 2008) asks how moral criticism affects its hearers.
>Social psychologists have evidence that evaluative feedback on others’ choices sometimes has unwelcome negative effects on hearers’ motivation. Holroyd’s article (Holroyd J. Ethical Theory Moral Pract 10:267–278, 2007) draws attention to one such result, the undermining effect, that should help to challenge moral philosophers’ complacency about blame and praise. The cause for concern is actually greater than she indicates, both because there are multiple kinds of negative effect on hearer motivation, and because these are not, as she hopes, reliably counteracted by implicit features of praise and blame. The communicative ideal that she articulates does point us in the right direction, but it requires further elaboration. Once it is spelled out, we find that realizing this ideal, in light of the empirical research, requires rethinking the role of verdict-like judgments within moral feedback.
[[Online access is available|http://springerlink.com/content/u714702563071422/?p=5f425f9ebe554978b235cdeed9cde901&pi=4]]  via academic subscription online or [[here|http://espringer.web.wesleyan.edu/pub/SpringerMoralFeedbackETMP08.pdf]]; if you are interested but cannot access the link please [[email me|contact me]].
This intermediate philosophy course will examine several philosophical accounts of moral responsibility, with attention to several recurring themes: 
# For what do we hold people responsible: For their intentions? For consequences of their actions? For their character? For their response to others' deeds? 
# What do we presuppose about people or groups when we hold them responsible? 
# Is moral responsibility for something a static thing we discover, or does it emerge and shift with time and social context? 
# What is our aim and purpose in holding ourselves and others responsible, and how is that purpose best achieved?
  var tids=store.getTaggedTiddlers("epigraphs");
  if (tids.length)
    return "<<tiddler [["+tids[Math.floor(Math.random()*tids.length)].title+"]]>>";
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|Description|show content in nest-able sliding/floating panels, without creating separate tiddlers for each panel's content|
>see [[NestedSlidersPluginInfo]]
<<option chkFloatingSlidersAnimate>> allow floating sliders to animate when opening/closing
>Note: This setting can cause 'clipping' problems in some versions of InternetExplorer.
>In addition, for floating slider animation to occur you must also allow animation in general (see [[AdvancedOptions]]).
2008.06.07 - 2.4.5 in 'onmouseover' handler for 'open on hover' slider buttons,<br>use call() method when invoking document.onclick function (avoids error in IE)
|please see [[NestedSlidersPluginInfo]] for additional revision details|
2005.11.03 - 1.0.0 initial public release.  Thanks to RodneyGomes, GeoffSlocock, and PaulPetterson for suggestions and experiments.
version.extensions.nestedSliders = {major: 2, minor: 4, revision: 5, date: new Date(2008,6,7)};

// options for deferred rendering of sliders that are not initially displayed
if (config.options.chkFloatingSlidersAnimate===undefined)
	config.options.chkFloatingSlidersAnimate=false; // avoid clipping problems in IE

// default styles for 'floating' class
setStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \
	background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");

config.formatters.push( {
	name: "nestedSliders",
	match: "\\n?\\+{3}",
	terminator: "\\s*\\={3}\\n?",
	lookahead: "\\n?\\+{3}(\\+)?(\\([^\\)]*\\))?(\\!*)?(\\^(?:[^\\^\\*\\@\\[\\>]*\\^)?)?(\\*)?(\\@)?(?:\\{\\{([\\w]+[\\s\\w]*)\\{)?(\\[[^\\]]*\\])?(\\[[^\\]]*\\])?(?:\\}{3})?(\\#[^:]*\\:)?(\\>)?(\\.\\.\\.)?\\s*",
	handler: function(w)
			lookaheadRegExp = new RegExp(this.lookahead,"mg");
			lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = lookaheadRegExp.exec(w.source)
			if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
				var defopen=lookaheadMatch[1];
				var cookiename=lookaheadMatch[2];
				var header=lookaheadMatch[3];
				var panelwidth=lookaheadMatch[4];
				var transient=lookaheadMatch[5];
				var hover=lookaheadMatch[6];
				var buttonClass=lookaheadMatch[7];
				var label=lookaheadMatch[8];
				var openlabel=lookaheadMatch[9];
				var panelID=lookaheadMatch[10];
				var blockquote=lookaheadMatch[11];
				var deferred=lookaheadMatch[12];

				// location for rendering button and panel
				var place=w.output;

				// default to closed, no cookie, no accesskey, no alternate text/tip
				var show="none"; var cookie=""; var key="";
				var closedtext=">"; var closedtip="";
				var openedtext="<"; var openedtip="";

				// extra "+", default to open
				if (defopen) show="block";

				// cookie, use saved open/closed state
				if (cookiename) {
					if (config.options[cookie]==undefined)
						{ config.options[cookie] = (show=="block") }

				// parse label/tooltip/accesskey: [label=X|tooltip]
				if (label) {
					var parts=label.trim().slice(1,-1).split("|");
					if (closedtext.substr(closedtext.length-2,1)=="=")	
						{ key=closedtext.substr(closedtext.length-1,1); closedtext=closedtext.slice(0,-2); }
					if (parts.length) closedtip=openedtip=parts.join("|");
					else { closedtip="show "+closedtext; openedtip="hide "+closedtext; }

				// parse alternate label/tooltip: [label|tooltip]
				if (openlabel) {
					var parts=openlabel.trim().slice(1,-1).split("|");
					if (parts.length) openedtip=parts.join("|");
					else openedtip="hide "+openedtext;

				var title=show=='block'?openedtext:closedtext;
				var tooltip=show=='block'?openedtip:closedtip;

				// create the button
				if (header) { // use "Hn" header format instead of button/link
					var lvl=(header.length>5)?5:header.length;
					var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,buttonClass,title);
					var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider,buttonClass);
				btn.innerHTML=title; // enables use of HTML entities in label

				// set extra button attributes
				btn.sliderCookie = cookie; // save the cookiename (if any) in the button object
				btn.defOpen=defopen!=null; // save default open/closed state (boolean)
				btn.keyparam=key; // save the access key letter ("" if none)
				if (key.length) {
					btn.setAttribute("accessKey",key); // init access key
					btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus
				btn.onmouseover=function(ev) {
					// optional 'open on hover' handling
					if (this.getAttribute("hover")=="true" && this.sliderPanel.style.display=='none') {
						document.onclick.call(document,ev); // close transients
						onClickNestedSlider(ev); // open this slider
					// mouseover on button aligns floater position with button
					if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this,this.sliderPanel);

				// create slider panel
				var panelClass=panelwidth?"floatingPanel":"sliderPanel";
				if (panelID) panelID=panelID.slice(1,-1); // trim off delimiters
				var panel=createTiddlyElement(place,"div",panelID,panelClass,null);
				panel.button = btn; // so the slider panel know which button it belongs to
				btn.sliderPanel=panel; // so the button knows which slider panel it belongs to
				panel.defaultPanelWidth=(panelwidth && panelwidth.length>2)?panelwidth.slice(1,-1):"";
				panel.style.display = show;
				panel.onmouseover=function(event) // mouseover on panel aligns floater position with button
					{ if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this.button,this); }

				// render slider (or defer until shown) 
				w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
				if ((show=="block")||!deferred) {
					// render now if panel is supposed to be shown or NOT deferred rendering
					// align floater position with button
					if (window.adjustSliderPos) window.adjustSliderPos(place,btn,panel);
				else {
					var src = w.source.substr(w.nextMatch);
					var endpos=findMatchingDelimiter(src,"+++","===");
					w.nextMatch += endpos+3;
					if (w.source.substr(w.nextMatch,1)=="\n") w.nextMatch++;

function findMatchingDelimiter(src,starttext,endtext) {
	var startpos = 0;
	var endpos = src.indexOf(endtext);
	// check for nested delimiters
	while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {
		// count number of nested 'starts'
		var startcount=0;
		var temp = src.substring(startpos,endpos-1);
		var pos=temp.indexOf(starttext);
		while (pos!=-1)  { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }
		// set up to check for additional 'starts' after adjusting endpos
		// find endpos for corresponding number of matching 'ends'
		while (startcount && endpos!=-1) {
			endpos = src.indexOf(endtext,endpos+endtext.length);
	return (endpos==-1)?src.length:endpos;
	if (!e) var e = window.event;
	var theTarget = resolveTarget(e);
	while (theTarget && theTarget.sliderPanel==undefined) theTarget=theTarget.parentNode;
	if (!theTarget) return false;
	var theSlider = theTarget.sliderPanel;
	var isOpen = theSlider.style.display!="none";

	// toggle label
	// toggle tooltip

	// deferred rendering (if needed)
	if (theSlider.getAttribute("rendered")=="false") {
		var place=theSlider;
		if (theSlider.getAttribute("blockquote")=="true")
	// show/hide the slider
	if(config.options.chkAnimate && (!hasClass(theSlider,'floatingPanel') || config.options.chkFloatingSlidersAnimate))
		anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));
		theSlider.style.display = isOpen ? "none" : "block";
	// reset to default width (might have been changed via plugin code)
	// align floater panel position with target button
	if (!isOpen && window.adjustSliderPos) window.adjustSliderPos(theSlider.parentNode,theTarget,theSlider);
	// if showing panel, set focus to first 'focus-able' element in panel
	if (theSlider.style.display!="none") {
		var ctrls=theSlider.getElementsByTagName("*");
		for (var c=0; c<ctrls.length; c++) {
			var t=ctrls[c].tagName.toLowerCase();
			if ((t=="input" && ctrls[c].type!="hidden") || t=="textarea" || t=="select")
				{ ctrls[c].focus(); break; }
	var cookie=theTarget.sliderCookie;
	if (cookie && cookie.length) {
		if (config.options[cookie]!=theTarget.defOpen)
		else { // remove cookie if slider is in default display state
			var ex=new Date(); ex.setTime(ex.getTime()-1000);
			document.cookie = cookie+"=novalue; path=/; expires="+ex.toGMTString();

	// prevent SHIFT-CLICK from being processed by browser (opens blank window... yuck!)
	// prevent clicks *within* a slider button from being processed by browser
	// but allow plain click to bubble up to page background (to close transients, if any)
	if (e.shiftKey || theTarget!=resolveTarget(e))
		{ e.cancelBubble=true; if (e.stopPropagation) e.stopPropagation(); }
	Popup.remove(); // close open popup (if any)
	return false;
// click in document background closes transient panels 
document.onclick=function(ev) { if (!ev) var ev=window.event; var target=resolveTarget(ev);

	if (document.nestedSliders_savedOnClick)
		var retval=document.nestedSliders_savedOnClick.apply(this,arguments);
	// if click was inside a popup... leave transient panels alone
	var p=target; while (p) if (hasClass(p,"popup")) break; else p=p.parentNode;
	if (p) return retval;
	// if click was inside transient panel (or something contained by a transient panel), leave it alone
	var p=target; while (p) {
		if ((hasClass(p,"floatingPanel")||hasClass(p,"sliderPanel"))&&p.getAttribute("transient")=="true") break;
	if (p) return retval;
	// otherwise, find and close all transient panels...
	var all=document.all?document.all:document.getElementsByTagName("DIV");
	for (var i=0; i<all.length; i++) {
		 // if it is not a transient panel, or the click was on the button that opened this panel, don't close it.
		if (all[i].getAttribute("transient")!="true" || all[i].button==target) continue;
		// otherwise, if the panel is currently visible, close it by clicking it's button
		if (all[i].style.display!="none") window.onClickNestedSlider({target:all[i].button}) 
	return retval;
// adjust floating panel position based on button position
if (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel) {
	if (hasClass(panel,"floatingPanel")) {
		var rightEdge=document.body.offsetWidth-1;
		var panelWidth=panel.offsetWidth;
		var left=0;
		var top=btn.offsetHeight; 
		if (place.style.position=="relative" && findPosX(btn)+panelWidth>rightEdge) {
			left-=findPosX(btn)+panelWidth-rightEdge; // shift panel relative to button
			if (findPosX(btn)+left<0) left=-findPosX(btn); // stay within left edge
		if (place.style.position!="relative") {
			var left=findPosX(btn);
			var top=findPosY(btn)+btn.offsetHeight;
			var p=place; while (p && !hasClass(p,'floatingPanel')) p=p.parentNode;
			if (p) { left-=findPosX(p); top-=findPosY(p); }
			if (left+panelWidth>rightEdge) left=rightEdge-panelWidth;
			if (left<0) left=0;
		panel.style.left=left+"px"; panel.style.top=top+"px";
// TW2.1 and earlier:
// hijack Slider stop handler so overflow is visible after animation has completed
Slider.prototype.coreStop = Slider.prototype.stop;
Slider.prototype.stop = function()
	{ this.coreStop.apply(this,arguments); this.element.style.overflow = "visible"; }

// TW2.2+
// hijack Morpher stop handler so sliderPanel/floatingPanel overflow is visible after animation has completed
if (version.major+.1*version.minor+.01*version.revision>=2.2) {
	Morpher.prototype.coreStop = Morpher.prototype.stop;
	Morpher.prototype.stop = function() {
		var e=this.element;
		if (hasClass(e,"sliderPanel")||hasClass(e,"floatingPanel")) {
			// adjust panel overflow and position after animation
			e.style.overflow = "visible";
			if (window.adjustSliderPos) window.adjustSliderPos(e.parentNode,e.button,e);
|Description:|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|
|Version:|3.0 ($Rev: 5502 $)|
|Date:|$Date: 2008-06-10 23:31:39 +1000 (Tue, 10 Jun 2008) $|
|Author:|Simon Baird <simon.baird@gmail.com>|
To use these you must add them to the tool bar in your EditTemplate

	saveCloseTiddler: {
		text: 'done/close',
		tooltip: 'Save changes to this tiddler and close it',
		handler: function(ev,src,title) {
			var closeTitle = title;
			var newTitle = story.saveTiddler(title,ev.shiftKey);
			if (newTitle)
				closeTitle = newTitle;
			return config.commands.closeTiddler.handler(ev,src,closeTitle);

	cancelCloseTiddler: {
		text: 'cancel/close',
		tooltip: 'Undo changes to this tiddler and close it',
		handler: function(ev,src,title) {
			// the same as closeTiddler now actually
			return config.commands.closeTiddler.handler(ev,src,title);



 where '! tiddler.tags.contains(["excludeLists"])'
 '"<<redirect \""+tiddler.title+"\" [["+tiddler.title+"]]$))\n"'>>
<<redirect "dialogical" [[dialogue]]>>
Many journals use small pages, and they provide PDF files with only one page centered on each vertical sheet. Even printing double-sided, each forty-page article uses ''20 sheets'' of paper. (Senior thesis printouts, of course, quickly consume reams of paper.) 
!Some academics aspire simply to read and even annotate articles on-screen, but in many situations, a printout is necessary. Students and faculty benefit from reference to printed copies during class discussion, for example. [>img[bad 2-up|http://espringer.web.wesleyan.edu/images/badmultiup.jpg]]
!Meanwhile, using a standard "2-up" printing option is a recipe for eyestrain: each journal-page is framed in a page-shaped box surrounded by lots of whitespace, as shown at right. The text is tiny!
!@@clear(left):display(block):''This is fixable'' using Adobe Acrobat Pro 7 (perhaps other applications work similarly):@@
# Use menu ''File > Page Setup'' and choose ''Paper Size: Letter (Full-bleed)''
# Reduce margins with ''Document > Crop Pages'' (make sure to choose "Page Range: All" at the bottom)
##Recent online articles may be friendly to the ''Remove Whitespace'' option.  
##Older articles must be cropped by trial and error, sometimes differently for odd and even pages. 
##If you'll make long marginal notes, crop less from the sides.
##Some presses lock each PDF against any edits, in which case commands may appear "greyed-out" in your menu.
#  In the printing window, find ''Page Scaling'' option, ''multiple pages per sheet'' and specify ''2'', arranged ''horizontally'' without page borders.
[>img[good 2-up|http://espringer.web.wesleyan.edu/images/goodmultiup.jpg]]Violá, readable text on only ''10 sheets'' of paper: thin, light, and readable! (When you print double-sided, select the Layout option ''short-edged binding'' if you like to flip pages cross-wise rather than upwards.)
''Further suggestion'': If you distribute documents by email or web, you can send PDF files that save recipients the trouble of doing all this themselves (or, save the paper that they wouldn't think twice about wasting). Here's how:
''For Mac OS prior to Snow Leopard'':
# Follow steps above, then choose ''Save PDF as Post-Script'' (in lower-left corner of Print d////ialogue in Acrobat Pro 7 on Mac OS X). //Note, this step will NOT destroy text-search and related functions.//
# Find and ''open'' your post-script file (it'll open by default in Preview, on the Mac).
# ''Re-save'' the document as pdf (and delete the postscript version)
# ''Send'' or post your document, and remind your readers to ''print double-sided'' if they must print.

''For Snow Leopard (OS 10.6)'':
Apparently, the function of printing to PDF file //from// a PDF file is disabled. I recommend the shareware program [[Cheap Impostor|http://www.cheapimpostor.com]] both for making properly-paginated booklets //and// for transforming ordinary portrait-mode PDFs into 2-up landscape PDFs. This application offers users nice control over the size and placement of the resulting two page-like columns of text. 
<div id='header'>
<div id='titleLine'>
<span id='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span id='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
~~[[Elise Springer]]~~
~~[[beyond philosophy]]~~
[[American Pragmatist Philosophy|http://espringer.web.wesleyan.edu/wescourses/2005s/chum321/01/]] explores the tradition of thought that began stirring in R.W. Emerson's call for a living American intellectual movement, and reached its classic articulations in C.S. Peirce, William James, and John Dewey. A seminar on this tradition is among my advanced [[courses]].
!!Thus, within academic sociology, the internal connection that often holds between the emergence of social movements and the moral ''experience of disrespect'' has, to a large extent, been theoretically severed at the start. The motives for rebellion, protest, and [[resistance|critical resistance]] have generally been transformed into categories of 'interest'... without ever being linked... to the everyday web of ''moral feelings''.
!!!!-Axel Honneth, //The Struggle for Recognition: The Moral Grammar of Social Conflicts// (1996)
!!''Dissident speech'' must address more than one audience if it is to achieve its political aims.... For this reason, I have urged that it would be ''self-defeating'' for a socially excluded group ''to speak with a single voice'' in a single register... [[Counterfigurations|metaphors]] must be [[tailored to diverse audiences|truth and uptake]]
!!!!--Diana T. Meyers, //Subjection and Subjectivity// (1994)
!!Not only a person’s  self-conception as  expressed in her principles and ideals but also her binding commitments and motives, not only her capacity to take an impartial or altruistic standpoint, but also ''patterns of salience in perception and imagination'', specific categorial frames for organizing experience, ''posture and tone'' of voice, a sense of ''timing and tact'' — all  these and more — are engaged in and presupposed by active morality. 
!!!!--Amelie Oksensberg Rorty, "What it Takes to Be Good" in Noam & Wren, ed., //The Moral Self// (1992)
!!''Moral advance'' consists ''not in'' adapting individual natures to the ''fixed realities'' of a moral universe, but in constantly reconstructing and [[recreating the world as the individuals evolve|diachronic ethics]].  
!!!!-- G.H. Mead, "The Philosophical Basis of Ethics"
!!''There is no virtue'' which is final; all are initial... The terror of reform is the ''discovery'' that we must cast away our virtues, or ''what we have always esteemed'' such, into the same pit that has consumed our grosser vices: — “Forgive his crimes, forgive his virtues too, / Those smaller faults, half converts to the right” 
!!!!--Ralph Waldo Emerson, "Circles"
!!The legacy of harm is that we are ''alienated'' from our understanding of ourselves as moral beings, and from each other.... We become resistant and/or paralyzed because we experience the side effects of the ''incoherence'' of the modern concept of responsibility.
!!!!--Barbara Houston, "Taking Responsibility" (//Philosophy of Education//, 2002)
!!Feminists’ interest in question of [[responsibility]] should extend beyond a simply ''intellectual curiosity'' that can be satisfied by achieving ''accurate moral judgments'' regarding the party or parties responsible for harmful states of affairs.
!!!!--Alison Bailey, "Taking Responsibility for Community Violence"  (~DesAutels & Waugh, 201)
!!People... express their understandings through ''practices of [[responsibility]]'' in which they assign, accept, or deflect responsibilities for different things… Practices of responsibility are ''constructive''; they may reproduce existing terms of recognition or they may shift them.
!!!!--Margaret Urban Walker, //Moral Understandings// (1998)
!!It is ... a [[mistake to separate|ecological theory]] the cultural environment from the natural environment, as if there were a world of ''mental'' products distinct from the world of ''material'' products. ''There is only one world'', however diverse, and all animals live in it, although we human animals have ''altered'' it to suit ourselves. We have done so wastefully, ''thoughtlessly'', and, if we do not mend our ways, fatally.
!!!!--J.J. Gibson, //The Ecological Approach to Visual Perception//, 1979
!!Because our ''conceptual systems'' grow out of our bodies, meaning is ''grounded in and though our bodies''. Because a vast range of our concepts are [[metaphorical|metaphors]], meaning is ''not entirely literal'' and the classical correspondence theory of truth is false. ... That does not mean that truth is purely subjective... Rather, our [[common embodidiment|social affordances]] allows for common, ''stable truths''.
!!!!-- Lakoff and Johnson, //Philosophy in the Flesh// 1999
!!We have learned ... to approach scientific problems ... ''by ignoring'' — or postponing consideration of — the possibility that ''the larger context'' may influence the smaller... Our hypothesis runs counter to this... The [[observer must be included|responsibility]] within the focus of observation, and what can be studied is always a ''relationship'' or an infinite regress of relationships. Never a “thing”.
!!!!--Gregory Bateson, //Steps to an Ecology of Mind//, 1972
!!The impact on me of realizing that our histories as agents are ''webs'' in which all that is a ''product of our wills'' is supported by things that are ''not'' is an //ethical// impact. It moves me toward humility and mercy, virtues that acknowledge the unfairness of life but also presuppose a morally structured context... [[responsibility]] is an achievement, not a given.
!!!!--Claudia Card, //The Unnatural Lottery//, 1996
!!''Hatred of'' [[evil]] is itself a kind of bondage to evil... resistance if it is to be ''effective'' in preventing the spread of evil should be combined with the greatest degree of [[understanding|moral understanding]] and the smallest degree of force that is compatible with the ''survival of the good'' things that we wish to preserve. 
!!!!--Bertrand Russell, "Knowledge and Wisdom"
!!''Relativists'' often see their view as conducive to ''respect''. But relativism isnt necessary or sufficient for respect, and the mere expression of [[moral criticism|critical virtue]] should not be conflated with violence or coercion.'' 
!!!!--Michele Moody–Adams, //Fieldwork in Familiar Places//
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|Description|Display a randomly selected "quote of the day" from a list defined in a separate tiddler|

>see [[QuoteOfTheDayPluginInfo]]
2008.03.21 [1.4.1] in showNextItem(), corrected handling for random selection so that //initial// index value will randomized correctly instead of always showing first item, even when randomizing.  Thanks to Riccardo Gherardi for finding this.
| Please see [[QuoteOfTheDayPluginInfo]] for previous revision details |
2005.10.21 [1.0.0] Initial Release.  Based on a suggestion by M.Russula
version.extensions.QOTD = {major: 1, minor: 4, revision: 1, date: new Date(2008,3,21)};
config.macros.QOTD = {
	clickTooltip: "click to view another item",
	timerTooltip: "auto-timer stopped...  'mouseout' to restart timer",
	timerClickTooltip: "auto-timer stopped...  click to view another item, or 'mouseout' to restart timer",
	function(place,macroName,params) {
		var tid=params.shift(); // source tiddler containing HR-separated quotes
		var p=params.shift();
		var click=true; // allow click for next item
		var inline=false; // wrap in slider for animation effect
		var random=true; // pick an item at random (default for "quote of the day" usage)
		var folder=false; // use local filesystem folder list
		var cookie=""; // default to no cookie
		var next=0; // default to first item (or random item)
		while (p) {
			if (p.toLowerCase()=="noclick") var click=false;
			if (p.toLowerCase()=="inline") var inline=true;
			if (p.toLowerCase()=="norandom") var random=false;
			if (p.toLowerCase().substr(0,7)=="cookie:") var cookie=p.substr(8);
			if (!isNaN(p)) var delay=p;
		if ((click||delay) && !inline) {
			var panel = createTiddlyElement(null,"div",null,"sliderPanel");
			var here=createTiddlyElement(panel,click?"a":"span",null,"QOTD");
			var here=createTiddlyElement(place,click?"a":"span",null,"QOTD");
		here.id=(new Date()).convertToYYYYMMDDHHMMSSMMM()+Math.random().toString(); // unique ID
		// get items from tiddler or file list
		var list=store.getTiddlerText(tid,"");
		if (!list||!list.length) { // not a tiddler... maybe an image directory?
			var list=this.getImageFileList(tid);
			if (!list.length) { // maybe relative path... fixup and try again
				var h=document.location.href;
				var p=getLocalPath(decodeURIComponent(h.substr(0,h.lastIndexOf("/")+1)));
				var list=this.getImageFileList(p+tid);
		if (!list||!list.length) return false; // no contents... nothing to display!
		if (delay) here.setAttribute("delay",delay);
		if (click) {
			if (!inline) here.style.display="block";
				{ config.macros.QOTD.showNextItem(this); }
		if (config.options["txtQOTD_"+cookie]!=undefined) next=parseInt(config.options["txtQOTD_"+cookie]);
		if (delay) {
				{ clearTimeout(this.ticker); };
				{ this.ticker=setTimeout("config.macros.QOTD.tick('"+this.id+"')",this.getAttribute("delay")); };
	tick: function(id) {
		var here=document.getElementById(id); if (!here) return;
	function (here) {
		// hide containing slider panel (if any)
		var p=here.parentNode;
		if (p.className=="sliderPanel") p.style.display = "none"
		// get a new quote
		var index=here.getAttribute("nextItem"); 
		var items=here.getAttribute("list").split("\n----\n");
		if (index<0||index>=items.length) index=0;
		if (here.getAttribute("random")=="true") index=Math.floor(Math.random()*items.length);
		var txt=items[index];
		// re-render quote display element, and advance index counter
		removeChildren(here); wikify(txt,here);
		index++; here.setAttribute("nextItem",index);
		var cookie=here.getAttribute("cookie");
		if (cookie.length) {
		// redisplay slider panel (if any)
		if (p.className=="sliderPanel") {
			if(anim && config.options.chkAnimate)
				anim.startAnimating(new Slider(p,true,false,"none"));
			else p.style.display="block";
	getImageFileList: function(cwd) { // returns HR-separated list of image files
		function isImage(fn) {
			var ext=fn.substr(fn.length-3,3).toLowerCase();
			return ext=="jpg"||ext=="gif"||ext=="png";
		var files=[];
		if (config.browser.isIE) {
			// IE uses ActiveX to read filesystem info
			var fso = new ActiveXObject("Scripting.FileSystemObject");
			if(!fso.FolderExists(cwd)) return [];
			var dir=fso.GetFolder(cwd);
			for(var f=new Enumerator(dir.Files); !f.atEnd(); f.moveNext())
				if (isImage(f.item().path)) files.push("[img[%0]]".format(["file:///"+f.item().path.replace(/\\/g,"/")]));
		} else {
			// FireFox (mozilla) uses "components" to read filesystem info
			// get security access
			if(!window.Components) return;
			try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); }
			catch(e) { alert(e.description?e.description:e.toString()); return []; }
			// open/validate directory
			var file=Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
			try { file.initWithPath(cwd); } catch(e) { return []; }
			if (!file.exists() || !file.isDirectory()) { return []; }
			var folder=file.directoryEntries;
			while (folder.hasMoreElements()) {
				var f=folder.getNext().QueryInterface(Components.interfaces.nsILocalFile);
				if (f instanceof Components.interfaces.nsILocalFile)
					if (isImage(f.path)) files.push("[img[%0]]".format(["file:///"+f.path.replace(/\\/g,"/")]));
		return files.join("\n----\n");
|Macro|redirect (alias)|
|Author|[[Clint Checketts]] and Paul Petterson|
|Version|1.1 Jan 26, 2006|
|Description|This macro tells TW to find all instances of a word and makes it point to a different link. For example, whenever I put the word 'Clint' in a tiddler I want TiddlyWiki to turn it into a link that points to a tiddler titled 'Clint Checketts' Or the word 'TW' could point to a tiddler called 'TiddlyWiki' It even matches clint (which is lowercase) [[Clint]] leet lEEt LEET|
|Usage|{{{<<redirect TW TiddlyWiki>>}}} |
|Example|<<redirect TW "TiddlyWiki">> <<redirect Clint "Clint Checketts">> (Nothing should appear, its just setting it all up)<<redirectExact lEEt Elite>>|

1.1- Fixed tiddler refresh so a tiddler declaring a redirect will also render the redirect
1.0- Updated to work with TiddlyWiki 2.0 (thanks to Udo Borkowski)
0.9- Original release October 2005

version.extensions.redirectExact = {major: 1, minor: 2, revision: 0, date: new Date(2005,10,24)};
config.macros.redirectExact = {label: "Pickles Rock!"};
config.macros.redirectExact.handler = function(place,macroName,params,wikifier,paramString,tiddler){

version.extensions.redirect = {major: 1, minor: 2, revision: 0, date: new Date(2005,10,24)};
config.macros.redirect = {label: "Pickles Rock!"};

config.macros.redirect.handler = function(place,macroName,params,wikifier,paramString,tiddler){

var redirectExists = false
// Check to see if the wikifier exists
for (var i=0;i<config.formatters.length;i++)
 if (config.formatters[i].name == "redirect"+params[0])
 redirectExists = true;

//If it doesn't exist, add it!
if (!redirectExists){
 for( var i=0; i<config.formatters.length; i++ )
 if ( config.formatters[i].name=='wikiLink') break ;

 if ( i >= config.formatters.length ) {
 var e = "Can't find formatter for wikiLink!" ;
 displayMessage( e ) ;
 throw( e ) ;

var pattern;
 if (macroName == 'redirect'){pattern=params[0].escapeRegExp().replace(/([A-Z])/img, function($1) {return("["+$1.toUpperCase()+$1.toLowerCase()+"]");});
 } else {

 config.formatters.splice( i, 0, {
 name: "redirect"+params[0],
 match: "(?:\\b)(?:\\[\\[)?"+pattern+"(?:\\]\\])?(?:\\b)",
 subst: params[1],
 handler: function(w) {
 var link = createTiddlyLink(w.output,this.subst,false);
 formatter = new Formatter(config.formatters); //update the tiddler
 if(tiddler) story.refreshTiddler(tiddler.title,null,true); //refresh tiddler so the new rule is applied
} // End if
~~[[research project]]~~
~~[[papers presented]]~~
~~[[current reading|reading...]]~~
~~[[thinking about...]]~~
~~[[publication projects]]~~
|Created by|[[Frank Dellaert|http://www.cc.gatech.edu/~dellaert]]|
A TiddlyWikiMacro that inserts an image with a rollover backup image. It takes three mandatory arguments:
* a ''unique'' name to identify the img tag. If not unique, none of the rollover macros will work.
* the default image
* the secondary image
and two optional arguments:
* the url the image points to when clicked. If not given, the second image will be the target.
* optional arguments passed to the image tag
Using less than three arguments does nothing:
{{{<<rollover a b>>}}}
<<rollover a b>>
Exactly three arguments links to the second image:
{{{<<rollover three http://www.cc.gatech.edu/~dellaert/4d-cities/images/Atlanta/4D-strip.jpg http://www.cc.gatech.edu/~dellaert/4d-cities/../images/Atlanta/4D-strip-big.jpg>>}}}
<<rollover three http://www.cc.gatech.edu/~dellaert/4d-cities/images/Atlanta/4D-strip.jpg http://www.cc.gatech.edu/~dellaert/4d-cities/images/Atlanta/4D-strip-big.jpg>>
The two optional arguments:
{{{<<rollover four http://www.cc.gatech.edu/~dellaert/4d-cities/images/Atlanta/4D-strip.jpg http://www.cc.gatech.edu/~dellaert/4d-cities/../images/Atlanta/4D-strip-big.jpg http://4d-cities.cc.gatech.edu "align=right">>}}}
<<rollover four http://www.cc.gatech.edu/~dellaert/4d-cities/images/Atlanta/4D-strip.jpg http://www.cc.gatech.edu/~dellaert/4d-cities/images/Atlanta/4D-strip-big.jpg http://4d-cities.cc.gatech.edu "align=right">>

Import (or copy/paste) this tiddler into your document: and tag it with "systemConfig"
config.macros.rollover = {};
config.macros.rollover.handler= function(place,macroName,params) {
   if (params.length<3) return;
   var name = params[0];
   var img1 = params[1];
   var img2 = params[2];
   var url = (params.length==3) ? img2 : params[3];
   var options = (params.length>=5) ? params[4] : "";
   wikify("<html><a target = '_blank' href='"+url+"' onmouseout=\"document."+name+".src='"+img1+"'\" onmouseover=\"document."+name+".src='"+img2+"'\"> <img "+options+" name='"+name+"' src="+img1+"></a></html>",place)
!!Not only a person’s  self-conception as  expressed in her principles and ideals but also her binding commitments and motives, not only her capacity to take an impartial or altruistic standpoint, but also ''patterns of salience in perception and imagination'', specific categorial frames for organizing experience, ''posture and tone'' of voice, a sense of ''timing and tact'' — all  these and more — are engaged in and presupposed by active morality. 
!!!!—Amelie Oksensberg Rorty, "What it Takes to Be Good" in Noam & Wren, ed., //The Moral Self// (1992)
!!''Hatred of'' [[evil]] is itself a kind of bondage to evil.... resistance if it is to be ''effective'' in preventing the spread of evil should be combined with the greatest degree of [[understanding|moral understanding]] and the smallest degree of force that is compatible with the ''survival of the good'' things that we wish to preserve. 
!!!!—Bertrand Russell, "Knowledge and Wisdom"
<<tabs txtMainTab
Index "All tiddlers" TabAll
Recent Timeline TabTimeline>>
^^[[Department of Philosophy|http://www.wesleyan.edu/phil/]]^^
^^[[Elise Springer]]^^

''Inspired by [[TiddlyPom|http://www.warwick.ac.uk/~tuspam/tiddlypom.html]]''

|Created by|SaqImtiaz|
|Version|0.21 |
Provides a simple splash screen that is visible while the TW is loading.

Copy the source text of this tiddler to your TW in a new tiddler, tag it with systemConfig and save and reload. The SplashScreen will now be installed and will be visible the next time you reload your TW.

Once the SplashScreen has been installed and you have reloaded your TW, the splash screen html will be present in the MarkupPreHead tiddler. You can edit it and customize to your needs.

* 20-07-06 : version 0.21, modified to hide contentWrapper while SplashScreen is displayed.
* 26-06-06 : version 0.2, first release

var old_lewcid_splash_restart=restart;

restart = function()
{   if (document.getElementById("SplashScreen"))
        document.getElementById("SplashScreen").style.display = "none";
      if (document.getElementById("contentWrapper"))
        document.getElementById("contentWrapper").style.display = "block";
    if (splashScreenInstall)
        displayMessage("TW SplashScreen has been installed, please save and refresh your TW.");

var oldText = store.getTiddlerText("MarkupPreHead");
if (oldText.indexOf("SplashScreen")==-1)
   {var siteTitle = store.getTiddlerText("SiteTitle");
   var splasher='\n\n<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>'+siteTitle +'</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>';
   if (! store.tiddlerExists("MarkupPreHead"))
       {var myTiddler = store.createTiddler("MarkupPreHead");}
      {var myTiddler = store.getTiddler("MarkupPreHead");}
      var splashScreenInstall = true;
config.options.chkAnimate = false
config.options.chkHttpReadOnly = true
config.options.chkDisableWikiLinks = true
	readOnlyText: ".",
	readOnlyTooltip: "View the source code for this tiddler"});
~~[[Ethics (212)|Introduction to Ethics]]~~
~~[[Seminar on Evil (343)|Evil, Blame & Understanding]]~~
~~[[Identity & Choice (218)|218 Identity & Choice]]~~
~~[[Fem. Moral Theory (277)|Feminist Phil. & Moral Theory]]~~
~~[[all courses|courses]]~~

~~[[office hours]]~~
~~[[web site problems?]]~~
~~[[Wes Go club|Go club]]~~
~~[[Informal Reasoning|http://parmenides.objectis.net/reason/]]~~
#header {height: 90px; border-bottom: 1px solid [[ColorT3]]; }
body {background:#fcfcfc url('gradienttop.jpg') repeat-x;); color: #000; font-family: verdana, helvetica, arial; font-size: 1em;}
a { color: [[ColorT3]]; background-color: transparent;}
a:hover{background-color: transparent; }
#messageArea {background-color: [[ColorB1]]; position: absolute; top: 0; right: 0; }
img{ padding: 8px; }
h1,h2,h3,h4,h5 {background: transparent; }
.button { color: #014; border: 1px solid transparent; }
.button:hover { color: [[ColorS2]]; background: [[ColorB2]]; border: 1px solid [[white]]; }
.button:active { color: [[ColorS3]]; background: [[ColorB1]]; border: 1px solid [[ColorT3]];}

#titleLine {font-weight: bold; text-align: left; color: [[ColorT1]]; padding: 45px 2em 1em 17em;  text-align: left; fone-size: 1.5em;}
#titleLine a {background-color: transparent; padding: 3px 5px 3px 5px;  color: [[ColorT1]]; text-decoration: none; border: 1px solid transparent; }
#titleLine a:hover { padding: 2px 4px 2px 4px; border-color: [[ColorB1]]; color: [[ColorT1]]; }

#siteTitle {font-size: 1.4em; color: [[ColorT1]]; margin: 0em 1em 0em 0em; font-weight: bold; }
#siteSubtitle { padding-left: .5em; font-size: 1.2em; font-weight: normal; color: [[ColorT1]]; }
#displayArea {margin: 0em 17.2em 10em 17em; }

#mainMenu {width: 12em; position: absolute; left: 0px; top: -70px; background-color: transparent; padding: 6.5em 1em 16.3em 12px; border: none; line-height: 125%; margin-right: 1em;}
html>body #mainMenu {position: absolute; top: 0px; padding: 1.4em 1em 16.3em 12px}
#mainMenu .tiddlyLink {color: ColorT1; font-weight: normal; padding: 1px 2px 1px 2px; border: 1px solid; border-color: white; text-transform: capitalize; float: clear;}
#mainMenu .tiddlyLink:hover {color: [[ColorT1]]; padding: 1px 2px 1px 2px; border: 1px solid; border-color: [[ColorB1]]; }
#mainMenu .externalLink { padding: 1px 2px 1px 2px; color: [[ColorT3]];	text-decoration: underline;}
#mainMenu .button { padding: 1px 2px 1px 2px;color: [[ColorT1]]; border: 1px solid; border-color: white; }
#mainMenu .button:hover { padding: 1px 2px 1px 2px; color: [[ColorT1]]; background-color: transparent; border: 1px solid transparent; border-color: #cccc99; } 
#mainMenu hr {border: none; border-top: 1px solid [[ColorT3]]; height: 1px; color: transparent;}
#mainMenu h2 a:hover {background-color: transparent; }

#sidebarOptions { padding-top: 0.5em; background-color: transparent; }
#sidebarOptions .button { color: [[ColorS1]]; }
#sidebarOptions a:hover { color: [[ColorS1]]; }
#sidebarOptions .sliderPanel {padding: 0.5em 0.5em 0.5em 0.5em; font-size: .8em; background-color: #cccc99; }
#sidebarOptions .sliderPanel A { color: #667755; font-weight: bold;}
#sidebarOptions .sliderPanel A:hover { color: #223344; background-color: #cccc99; }
#sidebarOptions .sliderPanel A:active { color: #552222; background-color: #cccc99; }

.tabset {padding:2em 0.5em 1px 0.5em;}
.tab {padding:0.35em .5em 3px .5em; font-size: 1.2em; margin:.25em;}
.tabContents {padding:0.75em;}

#sidebarTabs {color: [[ColorS2]]; font-weight: bold; background-color: transparent; -moz-border-radius: 1px; }
#sidebarTabs a {color: [[ColorB2]]; font-weight: normal; -moz-border-radius: 0px; border-right: none; }
#sidebarTabs a:hover { background-color: [[ColorB1]]; padding-bottom: 2px;}
#sidebarTabs .tabSelected {color: [[ColorB2]]; background-color: [[ColorS4]]; padding-bottom: .5em .5em 4px .5em;}
#sidebarTabs .tabUnselected { color: [[ColorB2]]; background-color: [[ColorS1]];}
#sidebarTabs .tabContents {background-color: [[ColorS4]]; text-style: bold; font-size: .8em;}
#sidebarTabs .tabContents .tiddlyLink { color: [[ColorB2]]; font-weight: normal; padding: none;}
#sidebarTabs .tabContents .tiddlyLink:hover { color: #334466; background-color:[[ColorB1]]; padding: none;}
#sidebarTabs .tabContents a:hover { padding: none;}
#sidebarTabs .txtMoreTab .tabSelected { background-color: #334466; }
#sidebarTabs .txtMoreTab .tabUnselected { background-color: [[ColorS1]]; }
#sidebarTabs .txtMoreTab .tabContents { color: [[ColorB2]]; background-color: #334466; }
#sidebar {width: 17em; }
#sidebar {color: #000000; background-color: transparent!; padding: 0em 0em 16.5em 0em; }

.popup { color: [[ColorB1]]; background: [[ColorS1]]; border: 1px solid [[ColorB2]]; }
.popup hr {color: [[ColorB2]]; background: [[ColorS2]]; border-bottom: 1px; }
.popup li.disabled { color: [[ColorS3]]; }
.popup li a, .popup li a:visited { color: [[ColorB2]]; border: none; }
.popup li a:hover {background: transparent; color: [[ColorB2]]; border: none; }

.toolbar {position: relative; top: 9px; height: 8px; }
.toolbar.button {color: #eee; position: relative; top: 8px; height: 8px; }
.toolbar a {color: #eee; -moz-border-radius: 0px; background-color: transparent; font-size: 7pt; border: none; }
.toolbar a:hover { color: [[ColorB2]]; background-color: #ffd; }
.toolbar a:active {color: [[ColorB2]]; background-color: [[ColorB1]]; }
.selected .toolbar {visibility: visible;}
.selected .toolbar a {background-color:#bbb; color: #fff;}
.selected .toolbar a:hover {color: #fff; background-color: [[ColorS3]];}

.tiddler .button { background-color: #eee; color: #fff; margin: 0px 2px 0px 2px;}
.tiddler {padding: 2px 10px 7px 8px; font-size: 9pt; border:none; }
.tiddler.selected {padding: 1px 9px 6px 7px; background-color: white; border: 1px solid; border-color: #eeeeee; }
.selected .title {color: [[ColorT1]]; padding: 0.1em 1.5em .1em 1em; border-style: solid; border-width: 1px 0px 0px 1px; border-color: [[ColorT1]]; }

.viewer a:link, .body a:visited {padding: 0em .15em 0em .15em; color: [[ColorT3]]; }
.viewer a:hover {background-color: #ffd; color: [[ColorT3]]; }
.viewer table { border: 2px solid; border-color: [[ColorB1]]; }
.viewer th { padding: 1px; background-color: [[ColorT3]]; color: [[ColorB2]]; border: 1px solid; border-color: [[ColorB1]]; }
.viewer td, tr { border: 1px solid; border-color: [[ColorB1]]; color: #000000; padding: .4em; }
.viewer h1 {display:block; text-align: left; padding-left: 0em ; margin: .8em 0em 0em 0em; font-size: 1em; color: #000000; font-weight: normal; background-color: transparent; border: none;}
.viewer h2 {display: block; padding-left: 55px; margin: .2em 0em 0em 0em; font-size: 1.1em; color: #000000; font-weight: normal; background-color: transparent; border:none; }
.viewer h3 {display:inline; margin: .8em 0em 1.5em 0em; color: [[ColorT1]]; font-size: 1em; font-weight: bold; background-color: transparent; }
.viewer h4 {display:block; text-align:right; margin: 0em 0em 1.5em 0em; color: ColorT1; font-size: .9em; font-weight: normal; background-color: transparent; border:none; }
.viewer hr { border: none; border-top: 1px solid #996633; }
.viewer ul { margin-bottom: .5em; padding: 0em 0em .5em 1.5em; }

.footer { display: none; }
.editor textarea {height: 50%; }
.title { font-size: 1.2em; font-weight: bold; display: inline; color: [[ColorT1]]; padding: 0.1em 1.5em .1em 1em; border-style: solid; border-width: 1px 0px 0px 1px; border-color: [[ColorT3]]; text-transform: capitalize; }

#tiddlerMyEpigraph .title { display: none; }
#tiddlerMyEpigraph .viewer { border-top: 1px solid [[ColorB1]]; border-left: 1px solid [[ColorB1]]; padding: 1em 2em 0em 2em; margin-right: 1em; background-image: url('http://espringer.web.wesleyan.edu/quote.gif'); background-repeat: no-repeat; }
#tiddlerMyEpigraph .viewer h2 {color: #89a; font-size: 1.2em;}
#tiddlerMyEpigraph .viewer h4 {padding-left: 8em; color: #9a8; font-size: .9em;}
#tiddlerMyEpigraph .viewer a:link {color: #786;}
div.tiddler:first-child {margin: 1em 0em 0em 0em;}

div[tags~="epigraphs"].viewer { border-top: 1px solid [[ColorT3]]; border-left: 1px solid [[ColorT3]]; padding: 1em 2em 0em 2em; margin-right: 1em; background-image: url('http://espringer.web.wesleyan.edu/images/quote.gif'); background-repeat: no-repeat; }
div[tags~="epigraphs"] #tiddler .title { color: [[ColorB1]]; display: none; }
div[tags~="Setup"].viewer { color: [[ColorB2]]; background-color: [[ColorT1]]; padding: 1.5em; }
config.macros.allTags.noTags = "There are no tagged items";
config.macros.allTags.tooltip = "Show items tagged with "; 
config.macros.closeAll.prompt = "Close all displayed items (except any that are being edited)";
config.macros.list.all.prompt = "All items in alphabetical order";
config.macros.list.missing.prompt = "Items that have links to them but are not defined";
config.macros.list.orphans.prompt = "Items that are not linked to from any other items";
config.macros.newTiddler.label = "new item";
config.macros.newTiddler.prompt = "Create a new item";
config.macros.permaview.prompt = "Link to an URL that retrieves all the currently displayed items";
config.macros.saveChanges.prompt = "Save all items to create a new Site";
config.macros.search.label = "search ";
config.macros.search.prompt = "search this site";
config.macros.search.successMsg = " items found matching: ";
config.macros.search.failureMsg = "No items found matching: ";
config.views.editor.toolbarDelete.tooltip = "Delete this item";
config.views.editor.toolbarDone.tooltip = "Save changes to this item";
config.views.wikified.defaultText = "This item doesn't yet exist. Double-click to create it";
config.views.wikified.tag.openAllText = "Open all items tagged with ";
config.views.wikified.tag.openAllTooltip = "Open all of these items";
config.views.wikified.tag.popupNone = "No other items tagged with ";
config.views.wikified.toolbarClose.tooltip = "Close this item";
config.views.wikified.toolbarEdit.tooltip = "Edit this item";
config.views.wikified.toolbarPermalink.tooltip = "Permalink for this item";
config.views.wikified.toolbarReferences.tooltip = "Show items that link to this one";
<<tabs txtMoreTab shad 'Shadowed tiddlers' TabMoreShadowed abs 'Missing tiddlers' TabMoreMissing stray 'Orphaned tiddlers' TabMoreOrphans>>
|Author|Clint Checketts|
|Description|present all tags using proportional font display|

2008.07.03 [1.1.0] added 'segments' property to macro object.  Extensive code cleanup
version.extensions.tagCloud = {major: 1, minor: 1 , revision: 0, date: new Date(2006,2,04)};
//Created by Clint Checketts, contributions by Jonny Leroy and Eric Shulman


	.tagCloud span{height: 3.5em;margin: 3px;}\
	.tagCloud1{font-size: 80%;}\
	.tagCloud2{font-size: 100%;}\
	.tagCloud3{font-size: 120%;}\
	.tagCloud4{font-size: 150%;}\
	.tagCloud5{font-size: 180%;}\
	.tagCloud6{font-size: 200%;}\

config.macros.tagCloud = {
	noTags: "No tag cloud created because there are no tags.",
	tooltip: "%1 tiddlers tagged with '%0'",
	segments: 5,
	handler: function(place,macroName,params) {

		// get tags, skip excluded tags
		var tags=store.getTags();
		for (var t=0; t<tags.length; t++)
			for (var p=0;p<params.length; p++)
				if (tags[t][0]==params[p]) tags[t][0]="";

		// get maximum number of tags to calculate tagCloud segment sizes
		var mostTags=0;
		for (var t=0; t<tags.length; t++) if (tags[t][0].length > 0)
			if (tags[t][1]>mostTags) mostTags=tags[t][1];
		var tagSegment=mostTags/config.macros.tagCloud.segments;

		// output
		var tagCloudWrapper = createTiddlyElement(place,"div",null,"tagCloud",null);
		else for (var t=0; t<tags.length; t++) if (tags[t][0].length > 0){
			tagCloudWrapper.appendChild(document.createTextNode(" "));
			var theTag = createTiddlyButton(tagCloudWrapper,
				"tagCloudtag tagCloud" + (Math.round(tags[t][1]/tagSegment)+1));
|''Version:''|1.0.0 BETA 3 (2006-09-23)|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|&copy; 2006 [[abego Software|http://www.abego-software.de]]|
|''Browser:''|Firefox or better; InternetExplorer 6.0|

Reference a tiddler through an alias (or even through many aliases). E.g. a tiddler "William Shakespeare" may also be referenced as {{{[[Shaxper]]}}}.

When editing a tiddler you may enter alternative names for the tiddler in the "Alias" field (below the tags field), similar to the way you enter tags. You may even specify multiple alias names, separated by spaces. Alias names containing spaces must be written as {{{[[...]]}}}

Also this plugin implements the "Auto Non-Space Alias" feature: for tiddlers with titles containing whitespaces an alias is automatically created that has every whitespace replaced by a dash ("-"). E.g. a tiddler called [[Tiddler with no alias defined]] can also be referenced by [[Tiddler-with-no-alias-defined]].

!Revision history
* v1.0.0 Beta 3 (2006-09-23)
** Support "Auto Non-Space Alias" feature: For tiddler with titles containing whitespaces an alias is automatically created that has every whitespace replaced by a dash ("-")
* v1.0.0 Beta 2 (2006-09-22)
** Bugfix: Tiddler is displayed more than once when opened both through title and alias (Thanks to KenGirard for reporting)
* v1.0.0 Beta 1 (2006-09-21)
** Beta 1 release
//		   TiddlerAliasPlugin

// Only install once
if (!version.extensions.TiddlerAliasPlugin) {

version.extensions.TiddlerAliasPlugin = {
	major: 1, minor: 0, revision: 0, beta: 3,
	date: new Date(2006,8,23), 
	source: "http://tiddlywiki.abego-software.de/Beta.html#TiddlerAliasPlugin",
	licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",
	copyright: "Copyright (c) abego Software GmbH, 2005-2006 (www.abego-software.de)"

(function() {

window.abegoTiddlerAlias = {
	lingo:  {
		aliasPrompt: "Type alias names (i.e. alternative names for this tiddler) separated with spaces, [[use double square brackets]] if necessary"
	editTemplateExtension: "<div class='editor' macro='edit alias'></div><div class='editorFooter'><span macro='message abegoTiddlerAlias.lingo.aliasPrompt'></span></div>"

var oldFetchTiddler;
var oldSaveTiddler;
var oldDisplayTiddler;

var fWithAutoNonSpaceAlias = true;

function withAutoNonSpaceAlias() {
	return fWithAutoNonSpaceAlias;

function addNonSpaceAlias(map, title) {
	var s = title.replace(/\s/g,"-");
	if (s != title)
		map[s] = title;

function calcAliases() {
	var result = {};
	store.forEachTiddler(function(title,tiddler) {
		var s = store.getValue(tiddler,"alias");
		if (s) {
			var p = s.parseParams("list",null,false,true);
			for(var i=1; i<p.length; i++)
				result[p[i].value] = title;
		if (withAutoNonSpaceAlias())
	return result;

// Returns a map that maps an alias name to the title of the tiddler
abegoTiddlerAlias.getAliases = function() {
	if (!store.aliases)
		store.aliases = calcAliases();
	return store.aliases;

// Returns the title of the tiddler for the given alias.
// When no such alias is defined but a tiddler with that name exists the alias is returned.
// Otherwise null is returned.
abegoTiddlerAlias.getAliasTitle = function(alias) {
	var t = abegoTiddlerAlias.getAliases()[alias];
	return t ? t : (store.fetchTiddler(alias) ? alias : null)

function hasEditTemplateExtension(s) {
	return s.indexOf(abegoTiddlerAlias.editTemplateExtension) >= 0;

function addEditTemplateExtension(s) {
	if (s && !hasEditTemplateExtension(s)) {
		var i = s.lastIndexOf("</div>");
		if (i >= 0)
			return s.slice(0,i+6)+"\n"+abegoTiddlerAlias.editTemplateExtension+s.slice(i+6);
	return null;

function hijackFetchTiddler() {
	oldFetchTiddler = store.fetchTiddler;

	store.fetchTiddler = function(title) {
		var result = oldFetchTiddler.apply(this, arguments);
		if (!result && title) {
			title = abegoTiddlerAlias.getAliases()[title];
			if (title)
				result = oldFetchTiddler.apply(this, [title])
		return result;	

function hijackSaveTiddler() {
	oldSaveTiddler = TiddlyWiki.prototype.saveTiddler;
	TiddlyWiki.prototype.saveTiddler = function() {
		var result = oldSaveTiddler.apply(this, arguments);
		delete store.aliases;				
		return result;	

function hijackDisplayTiddler() {
	oldDisplayTiddler = Story.prototype.displayTiddler;
	Story.prototype.displayTiddler = function(srcElement,title,template,animate,slowly) {
		// Ensure that a tiddler is always opened with its "original" title (not an alias)
		var tiddler = store.fetchTiddler(title);
		if (tiddler) 
			title = tiddler.title;
		return oldDisplayTiddler.apply(this, [srcElement,title,template,animate,slowly]);

function modifyEditTemplate() {
	// The shadow tiddler
	var s = addEditTemplateExtension(config.shadowTiddlers["EditTemplate"]);
	if (s) 
		config.shadowTiddlers["EditTemplate"] = s;
	// The "real" tiddler (if defined)
	var t = store.getTiddler("EditTemplate");
    if (t && !hasEditTemplateExtension(t.text))

// Requires store is defined.
function doHijacking() {

// for debugging the plugin is not loaded through the systemConfig mechanism but via a script tag. 
// At that point in the "store" is not yet defined. In that case hijackFetchTiddler through the restart function.
// Otherwise hijack now.
if (!store) {
	var oldRestartFunc = restart;
	window.restart = function() {
} else

// To support the access through the "message" macro
config.abegoTiddlerAlias = abegoTiddlerAlias;
} // of "install only once"

!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.


This site is based on [[TiddlyWiki|http://www.osmosoft.com]], whose author, Jeremy Ruston, writes: 
TiddlyWiki is like a blog because it's divided up into neat little chunks, but it encourages you to read it by hyperlinking rather than sequentially... TiddlyWiki represents a novel medium for writing, and will promote its own distinctive Writing Style.
!See the [[site explanation]] for more details on ''how to browse'' the site. From the author's point of view, TiddlyWiki has the advantage of being editable spontaneously, directly within a web browser (though on standard TiddlyWiki sites, edit functions have no effect over the web). I would be happy to field comments via [[email|mailto:espringer@wesleyan.edu]] from any visitors.
!Wiki-style coding also underlies custom sites for each of my courses, which I host through [[TiddlySpot|http://www.tiddlyspot.com]]. See more about [[teaching technology]]... 
// a hack to pretty up the timeline
Date.prototype._formatString = Date.prototype.formatString;
Date.prototype.formatString = function(template) {
 if(template == 'DD MMM YYYY') {
  var repr = this._formatString('YYYYMMDD');
  var day = new Date();
  if(repr == day._formatString('YYYYMMDD'))
   return 'Today';
  if(repr == day._formatString('YYYYMMDD'))
   return 'Yesterday';
  for(var i=0; i<3; i++) {
   if(repr == day._formatString('YYYYMMDD'))
    return config.messages.dates.days[this.getDay()];
 return this._formatString(template);
Tiddler.prototype.getSubtitle_orig_noTime =
Tiddler.prototype.getSubtitle = function()
     var theModifier = this.modifier;
                theModifier = config.messages.subtitleUnknown;
      var theModified = this.modified;
                theModified = theModified.formatString("MMM DD, YYYY");
                theModified = config.messages.subtitleUnknown;

config.macros.timeline.handler = function(place,macroName,params)
    var tiddlers = store.reverseLookup("tags","excludeLists",false,"modified");
    var lastDay = "";
        var nbTLitemmax=44;
        var nbTLitem=0;
    for (t=tiddlers.length-1; t>=0; t--)
               if (nbTLitem>=nbTLitemmax) break; else nbTLitem++;
        var tiddler = tiddlers[t];
        var theDay = tiddler.modified.convertToYYYYMMDDHHMM().substr(0,8);
        if(theDay != lastDay)
            var theDateElement = document.createElement("span");
            var theDateCaption = tiddler.modified.toLocaleDateString();
            lastDay = theDay;

function createTiddlyLinkShortened(place,title,includeText)
    var maxLen = 22;
    var displayTitle;

    if (title.length > maxLen)
        displayTitle = title.substring(0,maxLen).trim()+"...";
        displayTitle = title;

    var text = includeText ? displayTitle : null;
    var subTitle;
    var tiddler = store.tiddlers[title];
        subTitle = tiddler.getSubtitle();
        subTitle = title + config.messages.undefinedTiddlerToolTip;
    var theClass = tiddler ? "tiddlyLinkExisting tiddlyLink" : "tiddlyLinkNonExisting tiddlyLink";
    var btn = createTiddlyButton(place,text,subTitle,onClickTiddlerLink,theClass);
<div class='toolbar' macro='toolbar editTiddler -closeTiddler'></div>
<div class='title' macro='view title'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
!![M]oral philosophizing is itself conduct and practice. Moral philosophers are ''morally responsible'' for it.
!!!!—Margaret Urban Walker, //Moral Understandings// (1998)
!!People... express their understandings through ''practices of [[responsibility]]'' in which they assign, accept, or deflect responsibilities for different things… Practices of responsibility are ''constructive''; they may reproduce existing terms of recognition or they may shift them.
!!!!—Margaret Urban Walker, //Moral Understandings// (1998)
<html><a id="wesleyan" href="http://www.wesleyan.edu/" target="_blank"><img src="images/WesLogo.gif" alt="Wesleyan University" /></a></html>
Something is a '''blog'' -- a weblog -- only if it is a ''log'' of some kind, a sedimentary accumulation of entries about ongoing events. A log does not invite revision, and indeed part of its function is to serve as a ''fixed record'' for future reference.
!The writing here however, undergoes constant ''revision'', and there is no entry which serves as a fixed record. So if we are to take [[metaphors]] seriously, I'd call it a sort of room -- perhaps a back porch room for welcoming guests and offering some philosophical //hors d'oeuvres//. The furniture, the books, and the conversations will appear and disappear. As the space evolves, some corners may be tidied up, but there is always likely to be a corner of unsorted mischief.
!So, what I have to offer is not exactly a blog, but more of a ''web room''. And if a web log is a 'blog, then a web room must be a '''broom''.
!!!Class of 2008:    
Besides pursuing particular classes and activities, Class of 2008 advisees are working towards [[declaring a major|http://www.wesleyan.edu/deans/major_declaration]] (by March 3), and should browse through [[frequently-asked questions|http://www.wesleyan.edu/deans/major_declaration/FAQ.htm]] about the process, and consult with [[advising experts for departments|http://www.wesleyan.edu/deans/major_declaration/chairs_advisors.htm]] that might offer a good fit for you. 
!By the end of this year, Wesleyan expects that you will have sampled at least a couple courses from each division (HA/SBS/NSM), and by April 30 you need to submit [[paperwork|http://www.wesleyan.edu/deans/forms.html]] confirming that you've met the expectation or offering a rationale for your decision not to do so. This year is also a good interval in which to [[think about studying abroad|http://www.wesleyan.edu/ois/]] and to visit the [[Career Resource Center|http://www.wesleyan.edu/crc/]].

!!!Philosophy Majors:    
Junior and senior majors should be familiar with the philosophy department's [[expectations|http://www.wesleyan.edu/phil/Major_Program.html]]. For ''juniors'', one less obvious point of concern is putting in place any key background coursework if you plan on doing an honors ''thesis'' during senior year. At the end of junior year, those planning to work on thesis projects should submit a form declaring intent and describing the project and a likely match for faculty supervision. For ''seniors'', a point of extra concern is not to take for granted that you will get into required courses or get paperwork deadlines waived //simply in virtue of// being a senior. Make sure to plan ahead, be prompt in getting permission of instructor forms before pre-registration, and check in with professors who are offering the courses that stand between you and finishing on time. Double-majors should be especially careful to check the course catalog early to troubleshoot conflicts between required courses in different fields.
The discussion within ''ecological psychology'' of //affordances// interests me for two reasons: 
# Gibson's claims about the contents of perception are close analogues to pragmatist claims about the contents of cognition. Given a [[pragmatist account]] of [[responsibility]], I suspect that it may in some cases be perceived "directly" in Gibson's sense (that is, not only inferred from "neutral" data).
# The Gibsonians who do social psychology might be grappling more openly with the tension between action that's immediately possible for an agent and action that the agent could recognize to be possible in an "at large" sense. Should different people have different perceptions of responsibility (because they have different ''situated abilities'' to engage and call forth others' responsiveness), or should the medium of language force [[representation]]s to converge?
!''Andrea Scarantino, "Affordances Explained"'' (//Philosophy of Science//, 2003)
!!This piece offers a concise explanation of affordances, with a focus on making affordances palatable even for those who reject some of Gibson's anti-inferentialism. Scarantino makes several distinctions sound firmer than they are in practice, but nothing would be lost by casting them as matters of degree. 
!''Aaron Ben Zeev, "The Kantian Revolution in Perception"'' (//Journal for the Theory of Social Behavior//, 1984)
!!This piece outlines the Kantian flavor of the Gibsonian move of allowing significance to be ''already present'' in perception rather than imposed between sensation and judgment, and goes on to question whether Gibson requires the equivalent of Kantian "schemata".
!''G.P. Ginsburg, "The Ecological Perception Debate"'' (//Journal for the Theory of Social Behavior//, 1990)
!!A nice overview of what's at stake in the intersection between ecological psychology and philosophical accounts of perception.
!''Harry Heft, "Affordances, Dynamic Experience, and the Challenge of Reification"'' (//Ecological Psychology//, 2002)
!!Highlights for me the optimistic view towards a synthesis of pragmatist moral theory and ecological psychology, by way of [[canonical affordances|quotes.html#%5B%5Bcanonical%20affordances*%5D%5D]]
!''Darren Newtson, "Alternatives to Representation or Alternative Representations: Comments on te Ecological Approach"'' (//Contemporary Social Psychology// 1990)
!!Newtson pushes Lewin's radical approach to social phenomena as dynamical systems, [[rejecting representation|quotes.html#%5B%5Brejecting%20representation*%5D%5D]] (in the sense of topological "mappings" of the environment).
!''William G. Noble, "Gibsonian Theory and the Pragmatist Perspective"'' (//J Theory Social Behaviour//, 1981)
!!Attends to difficulties with [[Gibson, language, and norms*|quotes.html#%5B%5BGibson%2C%20language%2C%20and%20norms*%5D%5D]], calling for more of Mead's insights, which seems right to me. 
!Instead of a [[verdict model]] with its focus on discerning moral ''properties'', I believe more promise lies in understanding the sort of competence that could be described as [[critical virtue]], whose exercise requires ambivalence and dialogue. Principles and moral theories emerge as important ''interventions'' in response to historical problems and mark the tentative resting-points of critical dialogue, rather than serving as ultimate foundations of judgment. In this light, moral  theory is a form of moral practice, and our attention should shift from static models of justification to situated practices of critical engagement. 
!How to represent what we encounter (including how to represent what others say) is, on this view, an immediate and pervasive ''practical question''. A broadly [[pragmatist|Pragmatist Philosophy]] account of [[representation]] helps show how the best critical representations in one circumstance may be inappropriate in others. Nevertheless, the resulting perspective on morality is not relativistic in any way that undermines rigorous inquiry. The skills and sensitivities involved in [[critical virtue]] are difficult achievements open to careful exploration.
Primary Areas:  ''Moral Theory''  •  ''History of Moral Theory''  •  ''American Pragmatist Philosophy''
Secondary Areas:  ''Feminist Philosophy''  •  ''Philosophy of Psychology''
I came to study philosophy via a circuitous route through Music (A.A., Simon's Rock College, 1988; B.A., Wesleyan University 1990). An interest in the meaning-structures of music led me to pursue philosophy, and my interests in graduate school evolved by way of feminist philosophy toward a [[research project]] in moral theory and criticism. My [[dissertation]] was completed at the [[University of Connecticut|http://www.philosophy.uconn.edu/]], in 2000. I have previously taught in the University of Connecticut system and at Simon's Rock College, Syracuse University, and Hartwick College. I am now an Assistant Professor of Philosophy at [[Wesleyan University|www.wesleyan.edu]] in Middletown, CT. 
In addition to [[teaching|teaching ideas]] and [[writing|research project]] in philosophy, I tinker with [[teaching technology]] and FileMakerPro databases. Out of concern for the effects of computer use on the body, I recommend [[Alexander Technique|http://ergonomics.org/articles/atoverview/]], the [[Dvorak keyboard]] and other ergonomic tools. 
!I also enjoy [[commuting by bicycle|bicycling & moral priorities]], practicing [[Tai Chi|http://www.hunyuantaiji.org/]], and studying Japanese [[shakuhachi]] music. My [[iTunes music collection|music library access]] can be browsed by Wesleyan network users.
Most recently, I have embarked upon the mysterious road of ''parenting''...
!Is the choice to bicycle a ''moral choice'', or merely a ''personal preference''? Is it a personal preference justified -- retrospectively and righteously -- as a moral matter? If I do believe cycling has moral significance, is it still better to show people why they might prefer cycling, rather than insisting upon its moral credentials?
!Even while morality requires seeing "the big picture", we end up becoming ''moral specialists'', each with talents and histories and networks of friends on similar wavelengths. Those who are struck directly by an oppression, and yet who manage to resist it, cannot help but shoulder it as a moral priority. Those who recognize just how cruel and unreasonable we become in pursuit of our appetites (our consumerism, our thirst for power, our taste for meat) often become better attuned to how such vices work and how we can resist them.
!It is easy, from the vantage-point of a bicycle-seat, to discern the ''moral benefits'' of cycling over driving: there is the bit of gas saved, the moment of congestion avoided, the bit of interaction fostered by enjoying the same quiet sky as elderly people on porches, gardeners and dogs in the field, and children playing in driveways. It is easy, while gulping air at an intersection behind a mammoth luxury SUV, to notice the difference in quality between clean air and exhaust. 
!Yet the differences made by leaving the car at home are ''all minimal'', and thus the commitment to commuting by bicycle is as much symbolic as directly beneficial. Perhaps I would do better by driving to work and devoting the fifteen minutes' difference to lobbying politicians, reading and writing more about world events, or volunteering time towards local organizations. These things are worthwhile, but I do not see myself coolly trading these off against cycling time.
!I suspect our moral engagements must settle for this ''tension between symbolic and effective change''. Moral reflection and conversation should help us notice the moral dimensions of all of our choices, but a certain moral alienation sets in when we seek to survey all the world's problems at once. In order to stave off that moral alienation, it helps to develop our little niches of insight and satisfaction. One might say that cycling is a ''moral passion'': it is one cause that has "swept me off my feet", and it is a good thing that we are able to be affected in such ways. 
!So it would be foolish to imagine that those not yet moved in the same way are morally insensitive. I come to cycling through the ''happenstance'' of a certain state of health and mobility, a certain career, a certain terrain, and the wherewithal to equip a bicycle for relative (and only relative) safety. In moments of enthusiasm I still say that [[everyone who can should|http://www.runmuki.com/commute/]] prefer the bicycle to the automobile. The real lesson, though, would be to recognize this fragile contingency that steers our moral priorities, and to get the hang of other ways to feel connected to the moral dimensions of what we do.
Chapter drafts toward the //Communicating Moral Concern// manuscript include:
# Introduction: Why we should think of criticism as an imperfect duty
# Reactance: How should we understand resistance to critical pressure or judgment?
# The point of moral criticism: between expressing ourselves and regulating behavior
# The temporal dynamics of critical encounters: beyond speech acts and reactive attitudes
# The content of criticism: beyond claims to embodied concerns
# Contingency and Contagion: The social field of moral concerns
# Economies and Ecologies: Two ways of understanding the social field 
# Critical Engagement with Virtue Ethics
I have been pleased to find intersections between my work and that of [[colleagues at Wesleyan Philosophy Dept.|http://www.wesleyan.edu/phil]] ([[pictured here|faculty photo]]): ''[[Steven Angle|http://sangle.web.wesleyan.edu/]]'' has done considerable thinking about moral teaching and matters of interpretation especially in relation to Chinese philosophy; ''Brian Fay'' has worked on Spinoza and on ideas of the Self;  ''[[Lori Gruen|http://www.wesleyan.edu/templates/dept/phil/skeleton_faculty.htt/?function=f1&department=PHIL&faculty=lgruen]]'' works on practical ethics with an interest in feminist ethics and phenomena of moral alienation; ''[[Steven Horst|http://shorst.web.wesleyan.edu/]]'' is interested in moral psychology as well as naturalisms; ''Tushar Irani'' has worked on class Greek ideas of moral psychology (and has a wonderful project of spelling out something like a transcendental argument in Plato for believing in the presuppositions behind dialogical practice); [[Joe Rouse|http://jrouse.blogs.wesleyan.edu/]] has been developing accounts of intersubjectivity and social practices of inquiry and representation. 
!In addition, many colleagues now at other instutitions have had a personal or deep professional influence upon my work. ''[[Terry Winant|http://zimmer.csufresno.edu/~terryw/]]'', ''Ruth Ginzburg'', and ''[[Diana Meyers|http://vm.uconn.edu/~wwwphil/meyerscv.htm]]'' sparked my interest in philosophy and introduced me to feminist and political philosophy. ''Joel J. Kupperman'' first encouraged my pursuit of moral theory, while ''[[Ruth Millikan|http://vm.uconn.edu/~wwwphil/millikan.htm]]'' and ''Garry Brodsky'' helped to shape the naturalist and pragmatist elements that have emerged. Extended conversations and exchanges with ''[[David Slutsky|http://sites.google.com/site/davidslutsky/]]'', ''Keya Maitra'', ''Joel Kupfer'', ''Michael Stocker'', ''[[Tamar Gendler|http://people.cornell.edu/pages/tsg3/]]'', ''Stan Konecky'', ''Todd Lekan'', ''[[Gunnar Bjornsson|http://people.su.se/~gbjorn/eng.html]]'', and many others have shaped the project in early stages. 
I am also indebted to participants at [[APA meetings|http://www.apaonline.org/]], [[Value Inquiry|http://www.valueinquiry.net/html/conferences.html]] and [[FEAST|http://www.afeast.org/Conferences3_files/conferences3.html]] conferences.
@@padding-right: 15em;[<img[espringer|images/springerhat.png]]@@
| !via email:|<<email espringer at wesleyan dot edu "?subject=visiting E Springer web site">>|  Please feel free to send comments <html><br></html>(including corrections or suggestions) <html><br></html>on any aspect of this site! |
| !by phone:|(860) 685-3656| [2008 hours TBA] |
| !in my office:|Philosophy Dept.<html><br></html>Russell House, Room 215|~|
| !via postal mail:|[[Elise Springer]]<html><br></html>350 High Street <html><br></html>Wesleyan University <html><br></html>Middletown CT 06459| [[map of location|http://maps.google.com/maps?q=350+High+Street,+Middletown+CT+06457&spn=0.011638,0.025542&iwloc=A&hl=en]] |
|!Level|!Course Title|!Listing|!Semester last taught|
|!Introductory|[[Introduction to Ethics]]|PHIL 212|Spring 2009|
|~|[[Personal Identity & Choice|Identity & Choice]] (FYI)|PHIL 218|Fall 2008|
|!Intermediate|Challenges for Moral Theory|PHIL 266|Fall 2003|
|~|[[Feminist Phil. & Moral Theory]]|PHIL/WMST 277|''Spring 2010''|
|~|[[Moral Responsibility]]|PHIL 271|Spring 2009|
|!Advanced|American [[Pragmatist Philosophy]]|PHIL 321/AMST 329|Fall 2008|
|~|Concepts of [[Evil, Blame & Understanding]]|PHIL 343|''Spring 2010''|
|~|Moral Motivation|PHIL 344|upcoming|
Thesis and independent study students have worked with me on topics such as aesthetics, environmental ethics, feminist theory, and the ethics of forgiveness and resentment. Courses taught elsewhere include Classics of Philosophy, Values and Society, Logic, and Evolution and Ethics.  (See also [[teaching ideas]].)
One major challenge for a [[verdict-based model|verdict model]] of moral criticism is how to make sense of ''critical resistance'' within critical interactions -- meaning the morally significant resistance to most forms of critical pressure. (Social psychologists recognize related phenomena under the headings of "reactance" "anticonformity" and "undermining".) Only a narrow range of human relationships are conducive to moral criticism, and the skills of moral address required for successful criticism must be cultivated as a virtue. An [[ecological model|ecological theory]] of responsibility and criticism suggests that criticism is truly something to which relationships are more or less ''conducive'', creating a dynamic social field of pathways and resistances.

The phenomenon of critical resistance is the focus of my article, [[Moral Feedback and Moral Motivation|Moral Feedback and Motivation (ETMP Aug 2008)]].
Aristotle describes virtues as states of character, developed through lifelong ''experience'', which enable us to make wise practical choices. Each virtue represents an understanding of how to function well ''in a key domain'' of human experience. Generally, on his account, a virtue requires attunement to the [[middle path]] between vices, where at least one extreme state is tempting, and another represents an overcompensation or inflexible attempt at moral excellence. 
!Still, Aristotle tends to write of the praiseworthiness and blameworthiness of ordinary character traits without direct attention to the ''activities of praise and blame'' or to the character of one who approaches these well. If our moral characters are largely shaped by social intervention and evaluative cues, then these activities are themselves something ''we learn to do more or less well''. This sort of virtue, along with its implications for moral theory, is the subject of my [[research project]].
Many moral theorists have been starting to recognize that crucial moral concepts require attending to ''how things develop'' over time. 
![[Aristotelians|Aristotle's account]] have consistently recognized this, as individuals like ~MacIntyre suggest that a whole life has meaning in virtue of its narrative, which in turn has meaning against the narratives of a social-historical backdrop. In //Creating the Kingdom of Ends//, Korsgaard observes that Kantian evaluation of maxims only //seems// to ignore consequences because we're not noticing that a maxim involves attention over time. The result is closer to Aristotle than we might have expected from a Kantian: the success of many of our moral projects is still ''undecided'', and is resolved only after our active lives have ended. 
!The most extreme embrace of diachronic ethics would shift moral evaluation almost entirely to the ''process'' by which we evolve and influence one another over time, and place very little weight on the evaluation of a character, an action, or an outcome at just one instant of time. In other words, it would stand in strong tension with the [[verdict model]] as it is usually pursued.
Dialogue must occupy a central role in moral life if [[ideal foundations]] aren't out there waiting for us to tune them in. For that matter, dialogue is crucial even if there are ideals, as long as individual cannot be sure of //how// to tune in to them.
!Dialogue is notoriously difficult, and most attempts to compose philosophical dialogues are thinly-veiled attempts to push one voice or the other. Surely [[critical virtue]] requires taking [[responsibility]] not just for the content of what we say, but for how we embed it in [[dialogue]], with or without [[irony]].
''“Critical Virtue: Evaluative Moves and the Emergence of Moral Agency” ''
(defended April 2000 at University of Connecticut, with Joel J. Kupperman, major advisor)
''Abstract:''  Moral agents spend as much of their attention responding critically to others’ choices as deliberating about their own. How is this activity related to moral agency? Most consequentialist and deontological theories lend themselves to legalistic, verdict-oriented scrutiny of actions around us, but they speak little to how such judgments should influence a critic's own choices. I argue that intervention in one another’s habits is central to moral life, but that our attitudes toward particular events are and must be more subtle than ‘approval’ and ‘disapproval’. An undercurrent of “thick” evaluative attitudes and reactions, developed without conscious moral premises, shapes our moral personality. Cognitive assessments of what should provoke us morally cannot simply override these. 
Crucially, we can and do reshape each other’s evaluative reactions, however; and our ability to do so is a hallmark of moral interaction. I provide a naturalistic account of how moral complexity develops out of simpler practical competences. It suggests that the workings of praise, blame, and sanctions, for example, are fragile and context-sensitive, and must be fine-tuned and re-evaluated as social and cultural contexts evolve. Entrenched moral conflict, I argue, is generally not to be traced to inconsistent moral premises, but rather to histories of blunt or misdirected responses and interventions, and the moral resistance engendered all around by such dynamics. Critical inquiry into how we engage with others’ apparent moral blunders functions as a powerful engine of moral improvement, even in the absence of any other systematic moral theory.
This focus on ecology and systems-based approaches was pioneeed by [[Gregory Bateson|http://www.indiana.edu/~wanthro/bateson.htm]]:
<<tiddler BatesonOnContexts>>J.J. Gibson, apparently inspired in part by [[William James]], pursued an ''ecological'' paradigm in psychology of perception, considering an organism and its environment as dynamically interdependent. Gibson's account of perception suggests that the fundamental stuff of perception is not meaningless sensations that must be "decoded", but structures of information that specify what possibilities for action (what "affordances") ''connect'' the organism and environment.

Recently, Lorraine Code has crystallized some of the insights in feminist epistemology into an ecological account, and she articulates the hope that [[ecological thinking|http://tinyurl.com/34pqof]] will prompt "a revolution in philosophy comparable to Kant's Copernican Revolution".

In moral theory, an ecological account would require shifting our main focus away from moral properties (rightness, wrongness, virtue, vice) and toward the kinds of interactions by which relationships convey and cultivate [[responsibilities|responsibility]], which are essentially social projects. One wishing to make moral claims is ''not'' observing moral properties from a neutral position, but is always exercising relational moral agency in a way that must be located within the system about which claims are made.
If moral philosophers approach 'evil' as a ''property'', we find ourselves soon entangled in awkward metaphysical debates and theoretical standoffs.
!However, if we begin by asking about ''what stance'' is invoked by ''[[representation]] of evil'', we may make further progress. Nietzsche is right at least that the [[representation]] of evil has both a history and a purpose, and that reality takes new shapes as our language evolves. This remains so even if Nietzsche's dismissal of suffering serves at best the functions of [[irony]] and [[provocation|moral provocation]]. 
!If representations of evil invoke a certain stance, there may well be ''cases in which it is good'' to take such a stance, and hence such representation may be reasonable in context. For example, it may be reasonable (not just a lie, but accurate, in context) to represent some things as evil to ''children'', as they may otherwise be too optimistic about their ability to create shared understandings with treacherously vicious people. Still, we should hope that ''psychologists'' and clergymembers resist thinking of those who seek their help as ''evil''; to intervene constructively with anyone's attitudes requires a [[principle of charity]].
!Still, even if a [[principle of charity]] figures into an ideal critic's moral understanding, we cannot know a priori that [[critical virtue]] would //never// in practice involve representing something as evil. Critics and their audiences are limited beings with finite resources for [[moral understanding]], and representations occur in all sorts of non-ideal situations.
!Yet an emphasis on the ''practice'' of representing-as-evil makes it more doubtful that there is any being or event which ''everyone'' ought to represent-as-evil, across contexts.
[[Personal Identity & Choice site|http://parmenides.objectis.net/218/]]
[[Feminist Philosophy and Moral Theory|http://parmenides.objectis.net/277/forum/]]
[[Episteme Links|http://www.epistemelinks.com]] (general philosophy resource online)
[[Reasoning Well|http://parmenides.objectis.net/reason]] (informal reasoning web of terms)
[[Ethics Updates|http://ethics.acusd.edu/]] (a broad and deep source of online ethics materials)
[[Ten Ways to Make a Difference|http://www.utilitarian.net/singer/by/1998----02.htm]] (a list excerpted from Peter Singer's book)
[[TiddlyWiki's original site|http://www.tiddlywiki.com/]] (by Jeremy Ruston)  
[[ZiddlyWiki adaptation|http://www.ziddlywiki.org/]] (by Tim Morgan)
!!!Wesleyan Philosophy Faculty 2005-2006 

//Back row, left to right:// Brian Fay, Steven Horst, Joseph Rouse; 
//middle row//: Lori Gruen, Elise Springer, Stephen Angle;
//front row:// Sanford Shieh, Arata Hamawaki, Berel Lang. //Not pictured:// Matt Ostrow.
Although "irony" tends to suggest "sarcasm" and "insincerity" in popular use, philosophical irony is a much more subtle attitude. Whenever one speaks with attention to how multiple audiences would take one's words in entirely divergent directions, there is fertile ground for irony. If [[G.H. Mead]] is right that relatively consistent social uptake is necessary for us to understand "the meaning" of our own words (See [[vs. Meaning rationalism]]), then the ironist may be in a position not of "insincerity", but rather of not having avaliable any relevant utterance that one //could// "really mean", independent of audience and context.
!Because [[critical virtue]] is most evident in its handling of hard cases, and because hard cases are characterized by broad differences of perspective, I believe the wise moral critic will often employ what amounts to irony. We find there to be no single "sincere meaning" to some crucial utterances by Socrates, by Confucius, and indeed by the [[feminist social critics|quotes.html#%5B%5Bfeminist%20social%20critics*%5D%5D]] discussed by Cheshire Calhoun and Ruth Bleier. Deeply related to irony is the appearance of ''lack of integrity'' on the part of those whose meanings cannot be uniformly understood, for they must, as Diana Meyers notes, address different audiences with different communicative strategies:
!<<tiddler MeyersOnDissidentSpeech>>
version.extensions.listTags = {major: 0, minor: 1, revision: 0};

config.macros.listTags = {
 text: "Hello"

config.macros.listTags.handler = function(place,macroName,params) {
 var tagged = store.getTaggedTiddlers(params[0]);
 for(var r=0;r<tagged.length;r++){
The ''distinction'' between the literal and the metaphorical is surely ''a matter of degree'', no matter how much analytic philosophers seek to "tell it like it is" with no rhetorical interference. Emerson and Nietzsche both suggest that a historical process of use wears metaphors down into "common currency", but that our language is saturated with imagery whose origins are metaphorical. 
In their [[book|http://print.google.com/print?id=44PaTg1rC2gC&lpg=91&prev=http://print.google.com/print%3Fq%3Dlakoff%2Bjohnson%2Bmetaphors%26btnG%3DSearch%2BPrint&sig=IERDhcSrpsV3CkKIfZPeB9g5Kgs]], //Metaphors We Live By//, [[Mark Johnson|http://darkwing.uoregon.edu/~uophil/faculty/mjohnson/mjohnson.html]] and [[George Lakoff|http://www.linguistics.berkeley.edu/lingdept/Current/people/facpages/lakoffg.html]] investigate how metaphors from "basic" domains of practical interaction, and these function pervasively as the underpinnings our more abstract concepts.
What is at stake in the choice of subtle metaphors: //seeing// the point, //grasping// a concept, //grounding// a theory, //following// a line of reasoning? How are these different from, say //touching upon// a point, //following// a concept, //embracing// a theory, //seeing// a line of reasoning?
On [[Aristotle's account]], each virtue involves learning the appropriate mean between undesirable extremes (vices). The brave person, for example, keeps safely away from the temptations of cowardice, without straying into rashness. Such a model works better for some virtues than for others, but it does seem to fit well with the nature of critical virtue:
On an ordinary practical level, the activity of moral criticism frequently leads to resistance, polarization and antagonism. Among those opposed to the vice of [[Judgmentalism]], one common response is to insist upon "[[Judging Not]]", yet this is also plausibly treated as a vice at the other extreme, since others' moral development may depend upon our bringing to their attention the problems springing from their own agency.  Thus [[critical virtue]] requires honing a critical attitude (towards self as well as towards others) that remains constructive. I suggest that the virtue might aptly be called the virtue of effective moral address.
The concept of moral address, meaning the process of seeking to hold another [[responsible|responsibility]] in a practical encounters is implicit Strawson's oft-cited work, "Freedom and Resentment", though the term was introduced by Gary Watson. Unlike the idiom of "expression" that marks much post-Strawson work — and which regrettably enshrines resentment as vital to moral criticism — the idiom of moral address helps to emphasize how moral criticism calls upon the hearer to engage in a state of [[joint attention]] to a moral problem.
"Concern" is a word often used in moral philosophy, but the concept is rarely defined or discussed directly. While some use the word as a rough synonym for motivational strength (Arpaly) or for engaged caring about a person (Darwall), the word in common use surely connotes some cloud on the horizon, some kind of worry or anticipated difficulty... 
I take the word concern to suggest a ''primordial mix of perception, attention, and disposition toward action''. In other words, it exemplifies what Millikan calls a "pushmi-pullyu" representation: it has both an indicative and a motivational element. Unlike classic "pushmi-pullyu" representations (like "Time to eat!"), the state of moral concern is potentially inarticulate, and at best tentative in both its "upstream" (descriptive) and "downstream" (prescriptive) content. Concern is the situated experience of attending to a problem, where attention is required precisely because we do not yet know what exactly is "wrong" (what is "at stake" in the concern), nor what exactly ought to be done in response. 
!Concern is unlike worry or //contemplation// of a problem, as these might be entirely passive. It is unlike desire in that it entails active receptivity to incoming cues. It is a state of ''attention'' oriented towards incoming signs and outgoing agency. One of the tasks of concerned attention is to settle upon a clearer understanding of both how to describe the situation itself, and how the situation may call upon us to act in response. 
!What makes moral concern different from other kinds of concern? Nothing neat and clear makes a concern distinctly moral or non-moral. Yet a concern acquires a moral dimension insofar as it is animated by the recognition that human conduct -- not just one's own action here and now, but broader habits and practices -- may need to shift in light of the problem in question.
"Moral provocation" is whatever moves us to engage in criticism. Such a phrase helps to indicate a certain open-textured experience, the experience of [[moral concern]]. 
!If I say I "witnessed wrongdoing" or "learned of an action that seemed wrong", I probably settle quite quickly on a description of what it is that happened, and focus attention entirely on deciding the status of that event, described in that way. In hard cases, however, the sense that ''something'' is wrong is the starting point. Our concern points toward a [[problematic situation]] and further specification of ''what was wrong'' emerges in a process of [[dialogue]], reflection, and cumulative perspective over time. 
!To be a wise moral critic (one with [[critical virtue]]) requires more than fixing attention on some X (say, abortion of a pregnancy, or participating in military action) and deciding whether it is morally permissible. The further element required is the ability to articulate and communicate moral concerns. Even if an act is permissible or excusable, moral concerns may remain. We must still find the most constructive attitude to take towards them. 
!A moral provocation, as such, is a ''particular encounter'' with a problem, relative to which we each have different resources, different social connections, and different perceptual talents. Given a particular situation, there may be no single best critical response. How we respond to moral provocations must vary according to our different characters and social positions, as well. 
!''John Mc Dowell, "Virtue and Reason"'' (//The Monist//, 1979):
!!A persuasive view of [[virtue as a sensitivity|quotes.html#%5B%5Bvirtue%20as%20a%20sensitivity*%5D%5D]] of a kind that accounts directly for action without needing an intermediate step of knowing rules.''
!''Carla Bagnoli, "Moral Constructivism: A Phenomenological Argument"'' (//Topoi//, 2002)
!!Many of the points here are plausible as against a ~McDowell-style realism: "the image of construction suggests that "the situation" is not merely given, standing before the agent, waiting for her to make up her mind or to simply discover the right solution... the image of a contsrained construction highlights the diachronic dimension of our evaluations..." 
!!Yet perhaps Bagnoli is moving towards a more genuinely world-changing kind of ''real construction'' than the standard Kantian constructivism, and thus I'm not sure her position ought to count as anti-realist.
''Jan Bransen, "On the Incompleteness of ~McDowell’s Moral Realism"'' (//Topoi// 2002)
!!Bransen argues that ~McDowell cannot ward off projectivism unless he gves an account of exactly what counts as "appropriate" moral subjects and "favourable" moral circumstances. I'm not convinced. However, Bransen's positive suggestion is still welcome: ~McDowell would benefit from greater attention to cases in which moral perceptions and inclinations diverge. Working through such situations is crucial to the development of moral insight. 
!''Thomas E. Hill, Jr. "Kantian Constructivism in Ethics"'' (//Ethics// 1999)
!''Marc Lange, "Salience, Supervenience, and Layer Cakes'' in Sellars's Scientific Realism, Mc Dowell's Moral Realism, and the Philosophy of Mind" (//Philosophical Studies//, 2000)
!!Shows the analogies among supervience models for scientific laws, ethical properties, and folk psychological kinds, and defends the plausibility of ~McDowell's model with careful attention to Blackurn-style objections (as analogous to Van Fraassen's "constructive" empiricism)
Moral philosophers are mostly inclined to recognize the importance of moral psychology (even if we lack consensus on what kind of psychological research matters, and how). Should we have an analogous interest in moral sociology?

It would be important -- and surely not very controversial -- to recognize how social factors influence individual people's moral attitudes and choices. (Research into this sort of influence includes that of social psychologists such as Millgram, Staub, and Zimbardo.)  I think we should aim for a ''more radical account'', however. The process of problem-resolution //takes place// at the social level, and individuals participate in it more or less well. How do moral concerns become resolved at the social level? What conditions and relations foster the resolution of moral problems? 

There are two related levels to explore here. Moral theorists may be interested in the fine-grained details of how moral problems emerge and become resolved in a social milieu. On the other hand, it seems ordinary moral critics — that is, ordinary moral agents insofar as they attend critically to human affairs — implicitly rely on some sociological assumptions. Although being a good critic hardly requires reading academic sociology, it surely does require having relatively plausible models of social phenomena. 
Are there multiple distinct varieties of understanding, or are patterns of understanding continuously interconnected? [[Daniel Dennett|http://ase.tufts.edu/cogstud/~ddennett.htm]], for example, writes of ''three stances'' for understanding: the physical stance, the design stance, and the intentional stance -- three "lenses" with which we can approach the same phenomenon (in different strategic circumstances, and with greater or lesser success). Are these (a) neatly distinct, (b) points on a continuum, or (c) variations on a theme?
What is the relation between [[moral understanding]] and "other" forms of understanding? Can I fully understand you as an agent (as an "intender") without understanding you as a //moral// agent? Can one fully understand a speaker or writer as a linguistic agent without engaging in moral understanding? Or, from another angle, is the [[principle of charity]] necessary only for making rational sense of the world, or is it also necessary for making sense of our social and moral world? 
Users of Wesleyan's on-campus network may sample my iTunes world music library with the password ''shakuhachi''.
Spring 2007: I am on ''sabbatical'' for this semester, working on my research project. The best way to reach me is via [[email|contact me]].
!!One of the most important of the teacher's or preacher's qualifications, yet one of the rarest, is a ''knowledge of the hearer's mind'', so that his discourse may ''answer to something'', or else raise clear and profitable questions. Most philosophical books, lectures, and sermons seem to me either mechanical performance, or else the offspring of subtile vanity and desire for intellectual sympathy. Let one persuade many, and he becomes confirmed and convinced, and cares for no better evidence. ... 
!!!!-- Chauncey Wright, as quoted by Philip Weiner
!!For instance, ''if I am'' a professor, then this means that I am ''in the midst of'' trying to be a professor, and this is a norm-governed, ''ongoing project'' with respect to which my success always continues to be at issue. ... I must in some sense ''always be making this demand'' of myself... However, my //recognition// of this demand will necessarily bring an end to the immediacy of my immersion in my projects... will require me to ''put into question'' the legitimacy of my commitment to these projects... we ''never complete'' the task of choosing our commitments.
!!!!-- Rebecca Kukla, "The Ontology and Temporality of Conscience"
!!... work that is highly abstract, jargonistic, difficult to read,...theory that ''cannot be shared'' in everyday conversation... may function ''to legitimize'' Women's Studies and feminist scholarship... but ''it undermines'' and subverts feminist movements... many women have responded to hegemonic feminist theory that does not speak clearly to us by trashing theory... By internalizing the ''false'' assumption ''that theory is not a social practice''... both groups deny the power of liberatory education for critical consciousness...
!!!!-- bell hooks, "Theory as Liberatory Practice"
|!Title|!Site and Date|h
|^^''&quot;Toward an Economy of Moral Concerns&quot;''^^|^^Feminist Ethics and Social Theory (Clearwater Beach, FL) September 2009^^|
|^^''&quot;Motivation and Moral Feedback&quot;''^^|^^35th Conference on Value Inquiry (College of New Jersey) April 2008^^|
|^^''&quot;An Ecological Model of Responsibility&quot;''^^|^^Feminist Ethics and Social Theory (Clearwater Beach, FL) September 2007^^|
|^^&quot;Responsibility as a Virtue&quot;^^|^^34th Conference on Value Inquiry (Adrian College, Adrian, MI) April 2007^^|
|^^&quot;Affordance-concepts for moral interaction and a problem about truth&quot;^^|^^33rd Conference on Value Inquiry (Molloy College, Rockville Center, NY) April 2006^^|
|^^&quot;On Avoiding Performative Contradiction in Moral Criticism&quot;^^|^^Pacific Division APA Conference, March 2006^^|
|^^&quot;Affordances in Moral Interaction&quot;^^|^^Center for the Ecological Study of Perception and Action, ~UConn Storrs, February 2006^^|
|^^&quot;Responsibility: A Dynamic Model&quot;^^|^^Connecticut College Pizza and Profundity Series, October 2005^^|
|^^&quot;On Being a Good Sign: Ethics, Criticism, and Truth&quot;^^|^^Wesleyan University Center for the Humanities Lecture, April 2005^^|
|^^&quot;On the Prospects for Perspective- Neutral Normative Claims&quot;^^|^^32nd Conference on Value Inquiry (Baton Rouge, LA) April 2005^^|
|^^&quot;Talk of Evil: An attempt to understand it&quot;^^|^^Ethics and Political Theory Group (Middletown, CT) December 2004^^|
|^^&quot;Reason, Interpretation, and Attributions of Value&quot;^^|^^Conference on Values, Rational Choice, and the Will (Stevens Point, WI) March 2004^^|
|^^&quot;Individual and Collective Histories: The Role of Dilemmas in Moral Identity&quot; ^^|^^Wesleyan University (Middletown, CT) March 2003^^ <br>^^31st Conference on Value Inquiry (Grand Forks, ND) April 2002^^|
|^^&quot;Dewey as Post-postmodern? A Response to Hickman&quot;^^|^^John Dewey: Modernism, Postmodernism and Beyond (Great Barrington, MA) August 2001^^|
|^^&quot;Peirce vs. Descartes: mental representations and embodied signs&quot;^^|^^Hartwick College (Oneonta, NY) March 2001^^|
|^^&quot;Moral Dilemmas: Kant, Williams, and the importance of regret&quot;^^|^^Rowan University (Glassboro, NJ) February 2001^^<br>^^Simon&rsquo;s Rock College (Great Barrington, MA) February 2001^^|
|^^&quot;Critical Virtue: a puzzle about moral criticism&quot;^^|^^Millsaps College (Jackson, MS) February, 2000^^<br>^^Green Mountain College (Poultney, VT) February, 2000^^|
|^^&quot;Is There a Difference between Thinking and Feeling?: Modular Nets and Symbolic Programs in Mind&quot;^^|^^Hartwick College (Oneonta, NY) January, 2000^^|
|^^&quot;Re: Action and Reaction (A Puzzle for Moral Theory)&quot;^^|^^Wesleyan University Philosophy Colloquium Series (Middletown, CT) December 1999^^|
|^^&quot;Plato&rsquo;s Philosophical Attitudes in Dialogue: Irony, Skepticism, and Commitment&quot;^^|^^Freshman Seminar Lecture, Simon&rsquo;s Rock College (Great Barrington ,MA) October 1999^^|
|^^&quot;Linguistic Turnings and Ethical Bearings&quot;^^|^^International Society for Value Inquiry, World Congress of Philosophy (Boston, MA)  August 1998^^|
|^^&quot;Virtue in Response to Vice&quot;^^|^^26th Conference on Value Inquiry (Montevallo, AL) April 1998^^|
|^^&quot;Orientation among Plural Values&quot; ^^|^^Eastern Division Conference of Society for Women in Philosophy (Durham, NH) March 1998^^|
|^^&quot;The Possible Value of Oppression for the Dominant&quot; ^^|^^New Jersey Regional Philosophical Association (South Orange, NJ) March 1995^^|
The following links are intended to serve as a virtual portfolio of academic materials.

''Overview and Research''
* [[Current CV|SpringerCVapr07.pdf]]
* [["Critical Reactions: Verdicts and Virtue"|portfolio/CriticalReactions.pdf]] in //Journal of Value Inquiry// June 2005.
* //[[Critical Responsibilities|portfolio/SpringerBook.html]]//[[ book description|portfolio/SpringerBook.html]] @@//password required//@@
''Teaching Evaluations:'' 
Wesleyan's evaluations focus on free-form comments, and I have transcribed two representative batches below. Highlights are sprinkled throughout each batch. No comments have been suppressed or modified.  @@//password required//@@
* [[American Pragmatist Philosophy, Fall 2006|portfolio/SpringerPragEval.htm]] (my most recent advanced seminar)
* [[Introduction to Ethics, Spring 2004|portfolio/SpringerEthicsEval.htm]] (my standard large-ish intro course)

Please also feel free to explore this homepage. Items of special interest might include [[research project]], [[courses]] and [[teaching technology]]. Thanks for visiting the site! 
"The precarious", as it plays with and against "the stable", is the dynamic term in [[John Dewey]]'s controversial -- //precariously received//-- metaphysics. Whether something is precarious is, of course, a matter ''relative'' to the timeframe and interests we bring to the matter. A practice's ability to function well may be precarious in ways that are not transparent to even those who are fluent with it. The skills of [[critical virtue]] are precariously dependent on personal, cultural, and historical variables. 
![[Martha Nussbaum]] embeds a similar point in her title phrase, //The Fragility of Goodness// -- though goodness is in some cases remarkably ''resilient'' as well.
Philosophers most often invoke the "principle of charity" in the context of interpreting linguistic utterances; it means making the best possible sense of someone's words rather than settling for an interpretation on which the speaker must be very ignorant or illogical.
!In the context of ethics, a principle of charity concerns the interpretation of action. To interpret an action charitably is to seek out ways to understand either its aim or its origin so as best to preserve our ability to discern some kind of moral agency behind it. 
!The principle of charity in ethics is most deeply challenged by the claim that [[evil]] names a genuine intrinsic feature of some people's actions.
|''Book proposal for //Criticism and Moral Concern//''|
|''Elise Springer, Wesleyan University, Middletown, CT''|
+++!!![Aims & Rationale]
Criticism and Moral Concern presents a philosophical account of moral criticism. Fielding moral criticism shapes our moral perspective and helps us take responsibility for what we do and who we are. If receiving criticism contributes to our moral agency, is there a moral responsibility to initiate criticism of others? When, and how?
The most influentially relevant philosophical literature, which connects moral responsibility with being subject to “moral address” (Strawson 1974, Watson 1986), focuses on the conditions that make agents deserve blame and other reactions. Clearly, however, nobody has the moral task of confronting all and only those who deserve blame. How then does the practice of criticism fit within a moral life? In answering that question, I also take up related questions about our own receptivity and responsiveness to others. Ultimately, I suggest that we each grasp our responsibility to criticize well only against the background of our unique constellation of social relations.
Why have questions about criticism as an activity been so hidden in the underbrush of moral philosophy? I recognize two enduring obstacles, and structure the book so as to resolve them. First, philosophers have implicitly assumed that moral criticism must rest upon moral verdicts, and they have thus remained distracted with questions about moral judgment. This distraction is regrettable. Capturing clear moral verdicts under real-world conditions is a wild goose chase. Criticism must often be initiated under conditions of uncertainty, and we refine our interpretation of others while critical exchanges unfold. Furthermore, criticism as an activity requires communicative skills, and confidence in a moral verdict barely helps — and sometimes hurts — in honing those skills.
The other obstacle is a vague discouragement about what actual moral criticism might aim to accomplish. In popular discourse, moral criticism has awkward and ugly associations, at least when it occurs outside of traditional contexts of moral education such as parenting. Philosophers implicitly honor these associations by presenting moral reactions as attitudes that might be justifiably expressed — and indeed as forms of pressure pushing agents to act more decently — but rarely as something sought-out or listened-for. Is this because people embrace moral improvement only grudgingly? The explanation is not so simple. Critics commonly come across as aloof, condescending or manipulative, provoking what social psychologists call reactance effects rather than responsive concern. Central philosophical accounts of moral address neither illuminate what is at stake in these agonistic reactions to criticism, nor do much to help critics steer clear of such turbulence. Several conceptual shifts would help reflective critics (including philosophers) approach criticism with the optimistic aim of cultivating the hearer’s moral agency and initiative. In brief, these include understanding moral agency as involving more than commitment to norms; interpreting activity with emphasis on attention processes rather than states of belief and desire; and recognizing not only discrete individual actions (such as speech-acts), but also dynamically-unfolding interactions. I recommend that the central point of moral criticism be understood as the transfer of moral concern.
Once the focus on moral concern is established, I explore the processes by which it is communicated. Wise criticism requires attunement in face-to-face encounters, but also a situated understanding of the broader social field within which these take place. Moral address in difficult cases involves more than two people; the critical dimension of our moral agency requires helping to relay concerns along social paths. Social location, history, and identity appropriately help orient each critic’s attention to some concerns rather than others. The capstone of the book is an ecological model that illuminates moral agency naturalistically without making reductive simplifications. Moral ecologies are more or less robust in promoting the closure of moral concerns, and individuals achieve more or less skill in handling problems that affect their particular social locations. The critical dimension of moral agency thus helps illuminate why it is not just permissible but important for individuals to focus on distinct but overlapping moral concerns.
Several threads of research from empirical fields are integrated into the philosophical discussion: social-psychological literature on reactance phenomena (Ch 2), cognitive psychology literature on joint attention (Ch 4), psychological research on the temporal dynamics of emotion (Ch 4), and field theoretical models in sociology (Ch 5).
|''Synoptic Outline''|
+++!!![Ch 1. The necessity of moral criticism ]
Some thinkers, such as the ancient Stoics, counseled abstinence from moral criticism. There are legitimate concerns behind this stance. Overconfident moral criticism can be symptomatic of poor moral priorities and disrespect, and it may lead to moral antagonism. The Stoics were right to question how soundly we judge others, to insist on charitable interpretation of others’ choices, and to raise concerns about the effects of blame on critic and audience alike.
Yet if those who abstain from criticism avoid the risk of moral antagonism, they also fail to engage with the moral problems around them, a result I call moral alienation. Worse, the call to abstain from all moral criticism is irresponsible — at least if carried beyond an idealized community of committed disciples. In ordinary contexts, moral criticism is an irreplaceable spur to self-scrutiny and agency, and it is especially vital in confronting harmful norms and entrenched habits. Unsurprisingly, the need for criticism is amplified by radical schools of social thought, such as Marxism and feminism, which illustrate how moral norms can rationalize and reinforce structures of dominance.
Our task is to describe how a moral critic may be fully engaged in confronting problems while steering clear of moral arrogance and antagonism. Even while insisting that criticism is vital, we can reduce moral arrogance through a sort of Stoic agnosticism about moral verdicts. Just as reflective listeners can raise objections to a line of thought without directly debating its truth, good moral critics can raise moral objections and concerns about an action or disposition without making direct claims about its overall moral status.

+++!!![Ch 2. Reactance: the moral significance of hearers’ nonconformity]
Philosophers outside of the Stoic tradition have usually been confident that blame and other expressive reactions generally serve to promote conformity with norms and moral expectations. Social psychologists are not so complacent. They find that critical encounters often have effects far removed from the sort of moral wake-up-call to which philosophers appeal. These contrary phenomena have been described under various labels. Under the broad heading “reactance phenomena”, I locate anticonformity (starting with Willis 1965), reactance (starting with Brehm 1966), and undermining of hearer motivation (starting with Deci 1971). All of these phenomena complicate the workings of criticism, at least when it is approached as a social regulatory device in the service of ideals. The problem is not simply that criticism is weak as a motivational tool; rather, some critical encounters may motivate hearers to oppose the expectations being placed upon them. Despite lively debate over how to describe and explain the results, social psychologists consistently recognize that critical communication is sensitive to context, and that it may go terribly wrong. 
A plausible mechanism behind reactance phenomena, according to social psychologists, is discomfort with experiencing oneself as subject to control, regulation, and loss of freedom. The philosophical significance of this anxiety is easily downplayed by philosophers in one of two ways. Utilitarians, understanding the value of criticism in terms of its regulative effects, are practically committed to charting and anticipating reactance phenomena — but only insofar as they present a technical challenge to be finessed by good critics. Meanwhile, deontological thinkers, who counsel against attempts to control others’ agency, can imagine that their favored styles of criticism will not produce reactance, and that actual hearer reactions need not be the concern of a moral critic anyway. 
Yet reactance effects reveal a great deal about the dynamics of moral recognition. Since hearers of criticism are themselves moral beings whose agency includes a critical dimension, reasons to comply with a critic’s expectations often rest awkwardly alongside an equally important impulse to turn the tables and take critical initiative. Curiously, psychologists have often associated these reactive impulses with immaturity and socially marginal or oppressed status. A strong tendency toward reactance may mark a species of what Claudia Card calls the “moral damage” resulting from oppression. Yet a politically critical perspective also casts morally charitable light on some cases of reactance. They are not simple refusals of moral accountability, but efforts to realize moral agency under conditions of apparent subordination or misunderstanding. I urge both that reactance phenomena deserve attention at the level of moral theory, and that would-be moral critics must pay practical attention to this sort of struggle for recognition and minimize its tragic implications.

+++!!![Ch 3: The practical point of moral criticism. ]
To understand our responsibility to engage in criticism, we need some notion of the point of the practice of moral criticism, beyond and distinct from the articulation of justified moral verdicts. Strawson’s influential discussion of moral reactions juxtaposes two possible approaches: the point is either to regulate behavior in socially desirable ways or to express reactive attitudes. I call the latter view expressivism. Expressivist intuitions are strong partly because in favorable circumstances reactive attitudes can facilitate effective communication. Yet simple attitude-expression also spurs misunderstandings and reactance under conditions of social strain. Meanwhile, the regulative approach, at least as it is portrayed by Strawson, invites a critic to place herself at the helm of all moral decision-making, casting others as pawns of the critic’s moral plan. Though such a drastic stance might sometimes be wise, it cannot be the norm.
I find that neither the expressivist nor the regulative conception is adequate. I propose conceiving the point of moral criticism as the communicative transfer of moral concern. This goal demands a middle path between the moral condescension involved in setting out to change beliefs or behavior and the irresponsibility of expressing reactive attitudes without monitoring an audience’s interpretation and uptake. Certain aspects of this approach are embraced by Margaret Walker and by Nel Noddings. To make full sense of this approach, however, we will need to frame the activity of moral criticism in three unfamiliar ways: as unfolding over time (rather than executed in determinate speech acts), as requiring of joint agency within an interpersonal exchange, and as taking socially mediated forms.

+++!!![Ch 4: The phenomenology of moral criticism: Interpersonal and diachronic]
Having pointed out two paths to avoid, and having seen what kinds of moral antagonism is at stake, we can spell out in more detail how successful critical interactions can proceed. 
First, I show that the Strawsonian notion of moral address (articulated by Watson 1986) implicitly gestures toward sustained communicative engagement rather than simple expression. Attending to this diachronic aspect of each situation offers us breathing room between the idea of what a speech act intrinsically contains or expresses and what it causes beyond itself. Dynamic activities unfold differently according to their emerging uptake. Uptake then must be seen not simply as a consequence following upon a speech act, but as a sort of social mirror by which speakers understand their own meaning more fully and continually reshape their speech in process. 
Two difficulties are resolved by taking a carefully diachronic approach to moral criticism. First, we can think of moral emotions not simply as states that last more or less long, but rather as typical paths which can be jointly navigated more or less well. Psychologists have long puzzled and debated over whether guilt essentially inhibits or instigates action. On a dynamic account (Amodio & Jones, 2007) guilt begins as inhibition and resolves, when it functions well, into positive agency. Similarly, on the critic’s side, we might feel puzzled that moral address requires a paradoxical juxtaposition of attitudes to the hearer: both outrage and positive expectation. The puzzle evaporates if moral address is not the expression of an attitude but the attempt to change how the hearer attends to things. This concept of dynamic activity marks a shift in the kinds of moral questions we ask. Instead of asking which thing to do (for example, whether to blame or to forgive), we ask how to do something (such as engaging a hearer’s attention) well. We will see later that virtue ethics has cleared some ground in helping us think diachronically and qualitatively about activity. The communicative skills of a good critic are the centerpiece of a virtue of criticizing well.
Second, we will need to challenge the notion that all agency — or at least all moral agency — is fundamentally individual in character. Instead, we will need to think of some social processes as what John Dewey calls transactions — basic social phenomena that emerge out of individual activities. This approach once again helps us avoid an otherwise dilemmatic opposition – this time between what Darwall (1986) calls inside-out and outside-in approaches to ethics.  The model of joint agency and transfer of attention require dropping the traditional preoccupation of moral theory with questions about individual desert. We must ask instead how moral concerns get translated and carried (or mistranslated and miscarried) in interpersona encounters. Along the way, we will need to bring clearly into view the ways in which a hearer can take an energizing interest in the moral concerns with which she is confronted.

+++!!![Ch 5: The Ecological Field of Moral Concerns ]
In addition to showing how this second-person dialogical attitude unfolds within moral criticism, this book adds a new dimension to accounts of moral address by showing how often it is, and must be, mediated and indirect. Most accounts of moral address neglect the social field within which it occurs. In all but the simplest of moral problems, more than two people are involved, as some degree of social distance separates those whose distress initiates moral address and those remote and perhaps unknown others who ought to be its ultimate addressees. Thus, we often cannot simply hold one another responsible in second-person confrontation, but rather must relay moral address along conducive social paths. 
I offer an ecological, field-theoretical model of how concerns are addressed through criticism, drawing on field theory in sociology, and on philosophical work by Margaret Walker, Marion Smiley, Lorraine Code, Iris Young, and Larry May. I embrace their interest in social groups, but also attend to the texture and communicative “carrying capacity” of individual relationships and networks of relationships. So-called “third persons” (beyond claimant and offender) are not in merely vicarious positions (pace Strawson’s remarks on indignation), but instead are poised to play vital roles mediating moral address. As a result, making claims about responsibility is itself a dynamic form of situated participation, not merely an static representation. I offer actual and hypothetical examples to illustrate the social transfer of concern through the process of moral address. 
On the dynamic ecological model, individuals have moral knowledge only in a situated form. Each moral agent participates in an ecology of problem-solving that demands attention to differences of social location and relationship. This model of the ecology of moral concern provides the framework for the final two chapters.

+++!!![Ch 6: Moral Criticism and the unreachability of evil]
There are two kinds of moral experience that would seem to resist the sort of fluidity implied by the dynamic model of moral criticism and responsibility. One is the insistence that some moral agents are willful wrongdoers who are beyond the reach of moral address and hence evil — taken up in Chapter 6 — and the other is the sense that our personal and moral identity is the very source of our moral concerns — deferred to Chapter 7. Both positive and negative ideas about the moral status of individuals should be reinterpreted in the light of the differentially-distributed social responsibility to engage in moral criticism. 
First, I offer some reflections on the concept of evil. The fourth chapter’s mention of the paradox of moral address (that a critic’s attitude is both of distrust and of positive expectation) is revisited, with emphasis on the most extreme moral failures. The dynamic model of responsibility, with its emphasis on mediated moral address, allows us to see how perpetrators of an atrocity might be simultaneously within and beyond the reach of moral address. While a person may not be adressible from the reasonable vantage point of victims and witnesses, some individuals may be well-poised to mediate and translate the significance of a transgression. Such mediation may involve bridging opposed communities, or it may require cultivating extraordinary insight into an individual’s motivations. 
Though Watson (1986) and others note the difficulty of engaging evil with moral address, they have assumed that “the reasonable stance” to take toward a perpetrator is identical for all moral agents. The dynamic model of moral criticism entails that we should cease thinking of evil as a static property or fact and instead inquiry into when and how one person wisely withdraws from morally charitable interpretation of another, and whether differently-situated people should mark this boundary differently. Thus, this inquiry adds another dimension to Claudia Card’s idea that evil is often characterized by “grey zones”. Situated critics must often entrust others who are better situated to make efforts and moral address and determine whether these are worthwhile. 

+++!!![Ch 7: Critical Virtue and Moral Identity]
Though critical encounters are social phenomena, we may still recognize that individuals are more or less well-poised to participate in them. Like other imperfect duties, moral criticism may be illuminated by the concepts of virtue and vice, and so I consider how the account offered so far squares with various virtue-ethical claims. I find some helpful insights about criticism in Aristotle and in Confucius, and consider relevant claims from writers reviving virtue ethics, such as John McDowell, Alasdair MacIntyre, Christine Swanton, Julia Driver, and Lisa Tessman. Existing virtue-ethical frameworks can enrich our account and in turn benefit from recognizing a virtue of effective moral criticism.
I argue that a disposition to engage effectively in moral criticism differs from most canonical virtues in three related ways: First, it requires us to be poised to give a certain portion of our agency away, as it were; a wise critic does not aspire to self-reliance of any kind. Second, it is not at all a “selfish virtue” in the sense outlined by Hurka (2001); on the contrary, good criticism corresponds to a missing piece of Aristotle’s account of justice, where justice involves taking not just others’ material well-being but their moral agency as seriously as one’s own. Third, critical virtue requires fallibilist humility and receptivity to counter-criticism. Unlike an Aristotelian model of virtue, good critics are necessarily circumspect about their situated and contingent perspective on moral concerns.
Moral address achieves its end, the transfer of moral concern, only once a certain burden of attention and agency has shifted from those who first notice a problem toward those who are better positioned to resolve it and prevent its recurrence. Since moral critics are mediators, and not just either sources or repositories of concern, they must be dialogically poised both to receive and pass along concerns. Being a good moral critic is thus more comparable to being a good friend than to being a brave or honest person. 
On most moral theories, moral agents ought all to have the same basic moral priorities, since these derive simply from the fact of being a moral agent. In opposition to this, the dynamic model of critical responsibility supports the claim that people unavoidably and appropriately have different moral burdens — a claim advanced by recent feminist works such as Tessman’s Burdened Virtues. Our different moral burdens are not simply different moral obstacles to overcome in pursuit of the same moral ends; rather we each become critical “moral specialists” as social location structures what we are poised to perceive and to accomplish. Moral identities forged through history and individual experience play an essential role in keeping a variety of moral concerns in circulation. Each moral identity is, in part, a specialty in moral criticism. Yet this responsibility is betrayed when we identify with a moral concern to the extent of failing, perhaps unwittingly, to entrust it to others.
In suggesting that critical skills drive moral life rather than being the mere occasion for applying ideals, I do not mean to suggest that ideal theory is simply misguided. We have occasion to question one another’s value commitments, and the tools of Kantian and other abstract moral-theoretic approaches may help us to articulate and transfer our concerns to others. Nevertheless, such theories may easily mislead: the notion of one generic and impartial standpoint of moral responsibility misleads and contributes to a crisis of moral alienation. Sweeping moral theories do not yield moral norms from an impersonal point of view, but serve in a more local fashion to help us reflect on which aspects of our actual practical identities should be cultivated, carried, and shared as moral concerns. Even systematic moral theory can thus be understood as a critical practice bound up with situated moral identities. 

+++!!![Length and other details]
The book has seven chapters, and will have about 80,000 words. There are no complex illustrations, but I have found one or two simple schematic diagrams to be helpful in discussing material from the fifth chapter. All chapters exist in at least draft stage, and Chapters Two, Three, Five, Six and Seven have been shared with readers and/or audiences in some form. A complete manuscript, revised for better coherence among chapters, will be available in March 2008.
Target Market
The book’s arguments will be of greatest direct interest and relevance to moral philosophers, but it addresses moral philosophers as moral agents rather than as detached theorists. Most of the book will be accessible to non-specialists, including morally reflective readers beyond philosophy. Advanced courses in moral theory, both undergraduate and graduate-level, would benefit from examining this text as an extended argument. 
Even those with firm theoretical commitments in moral theory should recognize the need to supplement their approach with inquiry into how criticism is best carried out. No viable moral framework, whether utilitarian, deontological, or virtue-ethical, is complete without an account of the place of critical activity in moral living. Indeed, this text may help to forge rapprochement between those with divergent theoretical commitments. The discourse of moral philosophers is itself placed firmly within the social field of moral concern. Classical moral theories are thus understood not as competing ways of justifying moral verdicts, but as alternate and complementary ways of articulating general moral concerns and recognizing them in particular cases.
On the other hand, philosophers who are agnostic or skeptical about major moral frameworks — and non-philosophers as well — will be reassured that it is possible to reflect on the features of good moral criticism even in the absence of any general theory about right and wrong. 
Competing books
This book has no direct competitors in respect to its theme. However, there are several related books focused on the moral role of reactive attitudes, such as R. Jay Wallace’s Responsibility and the Moral Sentiments and Margaret Walker’s Moral Repair: reconstructing moral relations after wrongdoing. I join Walker in de-emphasizing criteria for judgment and in requiring a more socially complex account than Wallace and other Strawsonians offer. This book differs from even Walker’s treatment in two crucial ways: First, it places central importance on a moral critic’s dialogical skills, drawing more on virtue-ethics concepts and less on metaphors of moral expression. Second, it reveals that social patterns of criticism function at a more radical level than shared understandings of moral norms. As a result, we can aspire to participate well in moral criticism even while remaining uncertain about how to draw substantive lines between right and wrong.
Advanced courses in moral philosophy often read one or more contemporary and broad works in moral philosophy that are neither surveys nor commentaries on a specific text or historical tradition. This book would be considered for inclusion in such courses alongside works like Margaret Walker’s Moral Understandings, Lisa Tessman’s Burdened Virtues, Julia Driver’s Uneasy Virtue, and Larry May’s Sharing Responsibility.

+++!!![Selected references]
	Amodio & Jones, 2007. "A Dynamic Model of Guilt: Implications for Motivation and Self-Regulation in the Context of Prejudice" in Psychological Science v. 18 :6 p. 524-530.
	Aristotle (Ross, ed.), 1980. Nicomachean Ethics (New York: Oxford University Press).
	Baier, Annette, 1985. Postures of the Mind: essays on mind and morals (Minneapolis: University of Minnesota Press).
	Barry, Brian, 2005. Why Social Justice Matters (Malden, MA: Polity Press).
	Confucius (Brooks & Brooks, ed.), 2001. The Original Analects (New York: Columbia Univ Pr).
	Calhoun, Cheshire, 1989. "Responsibility and Reproach" in Ethics v. 99  p. 389-406.
	Calhoun, Cheshire, 1995. "Standing for Something" in Journal of Philosophy v. 92 :5 p. 235-260.
	Card, Claudia, 1996. The Unnatural Lottery: Character and Moral Luck (Philadelphia: Temple University Press).
	Card, Claudia, 2002. The Atrocity Paradigm: A Theory of Evil (New York: Oxford University Press).
	Code, Lorraine, 2006. Ecological Thinking: The politics of epistemic location (New York: Oxford University Press).
	Darwall, Stephen, 1986. Agent-Centered Restrictions from the Inside Out" in Philosophical Studies v. 50 p. 291-319.
	Darwall, Stephen, 2006. The Second-Person Standpoint (Cambridge, MA: Harvard University Press).
	Deci & Ryan, 1987. "The Support of Autonomy and the Control of Behavior" in Journal of Personality and Social Psychology 53(6) p. 1024-1037.
	Dewey (McDermott, ed.), 1973. The Philosophy of John Dewey (Chicago: University of Chicago Press).
	Driver, Julia, 2001. Uneasy Virtue (London: Cambridge University Press).
	Eilan, Hoerl, McCormack, & Roessler, ed., 2005. Joint Attention: Communication and other minds (New York: Oxford University Press).
	Fogel, Alan, 1991. Developing Through Relationships: origins of communication, self, and culture (Chicago: University of Chicago Press).
	Haraway, Donna, 1988. "Situated Knowledges: The science question in feminism and the privilege of partial perspective" in Feminist Studies v. 14 :3 p. 575-599.
	Houston, Barbara, 1992. "In Praise of Blame" in Hypatia v. 7 :(4) p. 128-147.
	Johnson, Mark, 1993. Moral Imagination: Implications of Cognitive Science for Ethics (Chicago: Univ of Chicago Press).
	Kant, Immanuel, 1959 (1785). Foundations of the Metaphysics of Morals (New York: Free Press (MacMillan)).
	King, Martin Luther, 1994 (1963). “Letter from a Birmingham Jail” (San Francisco: Harper).
	Kukla, Rebecca, 2002. "The ontology and temporality of conscience" in Continental Philosophy Review v. 35  p. 1-34.
	Langton, Rae, 2001. "Virtues of Resentment" in Utilitas 13(2) p. 255-262.
	Lewin, Kurt, 1997. Resolving Social Conflicts: And, Field Theory in Social Science (American Psychological Association (APA)).
	Lockhart, Ted, 2000. Moral Uncertainty and Its Consequences (New York: Oxford Univ Pr).
	MacIntyre, Alasdair, 1981. After Virtue  (Notre Dame: University Notre Dame Press).
	May, Larry, 1992. Sharing Responsibility (Chicago: University of Chicago Press).
	McDowell, John, 1979. "Virtue and Reason" in Monist v. 62 :(3) p. 331-350.
	Meyers, Diana Tietjens, 1994. Subjection and Subjectivity (New York: Routledge).
	Mill, John Stuart, 1961. Utilitarianism and other Writings (New York: Meridian).
	Noddings, Nel, 1984. Caring: A Feminine Approach to Ethics and Moral Education (Berkeley, CA: University of California Press).
	Norcross, Alasdair, 1997. "Good and Bad Actions" in Philosophical Review v. 106 :(1) p. 1-34.
	Nussbaum, Martha, 2001. "Non-Relative Virtues" in Carson, ed., Moral Relativism: A Reader (London: Oxford) p. 199-225.
	Rorty, Amelie Oksenberg, 2004. "The Improvisatory Dramas of Deliberation" in Calhoun, ed., Setting the Moral Compass: essays by women philosophers (New York: Oxford University Press) p. 275-287.
	Sim, May, 2007. Remastering Morals with Aristotle and Confucius (London: Cambridge University Press).
	Smiley, Marion, 1992. Moral Responsibility and the Boundaries of Community (Chicago: Univ of Chicago Press).
	Strawson, Peter F, 1974. "Freedom and Resentment" in Freedom and Resentment and Other Essays (London: Methuen) p. 1-25.
	Swanton, Christine, 2003. Virtue Ethics: a pluralistic view (New York: Oxford University Press).
	Walker, Margaret Urban, 2006. Moral Repair: Reconstructing Moral Relations after Wrongdoing (London: Cambridge University Press).
	Walker, Margaret Urban, 1998. Moral Understandings: a Feminist Study in Ethics (New York: Routledge).
	Wallace, R. Jay, 1994. Responsibility and the Moral Sentiments (Cambridge, MA: Harvard University Press).
	Watson, Gary, 1986. "Responsibility and the Limits of Evil: Variations on  a Strawsonian Theme" in Ravizza, ed., Moral Responsibility (Ithaca, NY: Cornell University Press) p. 119-150.
	Weston, Anthony, 1992. Toward Better Problems (Philadelphia: Temple University Press).
	Young, Iris Marion, 2004. "Responsibility and Global Labor Justice" in The Journal of Political Philosophy v. 12 :(4) p. 365-388.
!Articles and Reviews (See also [[papers presented]] and [[research project]]):
* "Moral Feedback and Motivation: Revisiting the Undermining Effect" //Ethical Theory and Moral Practice// Vol. 11 No. 4 (Aug 2008): pp. 407-423.
* "Critical Reactions: Verdicts and Virtues" //Journal of Value Inquiry// vol. 39 No. 2 (June 2005) pp. 183-201.
* "Richard Taylor", entry in the //Dictionary of Modern American Philosophers//. Thoemmes Press, 2005.
* "Mind and Morals Conference", review in the //Newsletter for Philosophy and Feminism//.
!Book-length project:
* //[[Communicating Moral Concern]]// (manuscript in progress, [[chapter outline|chapters]] available)
|[img[Abram cover|http://t2.gstatic.com/images?q=tbn:ANd9GcTZhtPhmPMvylYJr7t0kHmWj7O9eFW1qYMUkkcxeUGMraM9AzVT]]|David Abram, //Becoming Animal: An Earthly Cosmology//|Abram's work unsettles our familiarity with much human-centered technology and habits -- from airplanes and lit screens back all the way to phonetically written text -- as he coaxes us into a rapport with the thoroughly animated elemental world to which our senses belong. Much of the grace of this work lies in Abram's capacity to translate. He anticipates where readers' common sense and scientific literacy will balk at what looks like superstition, confusion, or "mere metaphor," and then he draws our attention around to an astonishing new angle of recognition. By the end, it is our detachment and our very notion of "the literal" that seem out of joint with life.|
|[img[Wheeler cover|http://ecx.images-amazon.com/images/I/51WR3RZHDTL._SL500_AA300_.jpg]]|Wendy Wheeler, //The Whole Creature: Complexity, Biosemiotics and the Evolution of Culture//|"For humans, who live in a biosphere which is also a highly articulated semiosphere, maximal flourishing consits in the richness of our semiosis: our contacts, our ability to be heard and responded to, our sense of being supported and effective in a rich number of ways." (109-110)|
Much recent meta-ethics focuses on whether moral properties are ''real'', or whether something in the world "makes moral claims true". ''Realism'' has been contrasted against various forms of ''relativism'' which tie moral truths to subjective perspectives or cultural points of view.
Between these "objective" and "subjective" poles, of course, mediating positions emerge. Views generally labelled ''constructivist'' suggest that actual perspectives and attitudes provide the grounds for moral status, but that moral truths are the product of rigorous reflective work upon these. 
I would take a more literal approach to the notion of ''constructivism'' in ethics: the creation and maintenance of moral features of the world require ongoing work: moral truths are constructed not simply out of points of view, but out of interactions that quite literally bring [[responsibility]] into being. What is ''constructed'' is both fully real, and fully natural, though it is historically malleable, evolving, and [[precarious]].
''[[William J. FitzPatrick, "The Practical Turn in Ethical Theory|•FitzPatrick on Korsgaard]]'': Korsgaard's Constructivism, Realism, and … Normativity" (//Ethics// 2005)
!''Claudia Card, "Responsibility Ethics, Shared Understandings and Moral Communities"'' (//Hypatia//, 2002)
!!Card engages with Margaret Urban Walker's //Moral Understandings//, embracing the project and many of its details, though she raises some concerns about whether Walker's "expressive-collaborative" approach fully embraces our moral responsibilities in relation to those with whom we cannot "share understandings", such as distant people, non-human animals, and ecosystems.  
!''Nick Zangwill, "Against Moral Response- Dependence"'' (//Erkenntnis// 2003)
!!Zangwill's complaint is that response-dependent theories are either non-normative or normative, and either way there's a fatal problem. We can't make our moral conviction //intelligible// to ourselves by claiming, say, that we believe something is "such as to prompt my disapproval" (as the non-normative version seems to do). Meanwhile, the normative strain (as in ~McDowell's) is vacuous, for it does not tell us what about the thing makes it warrant the normative response. Zangwill offers no positive account here. It seems to me that the dilemma he points out here can be pushed on //any// account of moral properties as such. Some deep ontological assumptions at the root of moral theory seem to be responsible for the persistent gap between "givens" and "takens"...
!''Rafael De Clercq, "Two Conceptions of Response- Dependence"'' (//Philosophical Studies//, 2002)
!!This piece offers an alternative understanding of "response-dependence" to cover properties that cannot be instantiated unless people at some point have a concept of it. The intuitive point, which is that some properties' very realization (in any specific case) depends upon there being (at some point) an ability to appreciate those properties, seems plausible. However, the paper is burdened with heaps of gratuitous symbolization and requires us to buy into a notion of "//a priori// warrant" for some claims. 
!''Wiggins, "A Sensible Subjectivism?"'' (//Needs, Values, Truth//, 1987)
!!I'm still ''not sure why'' in the world Wiggins calls this position subjectivism, after acknowledging the differences between viable and non-viable response-patterns and the social-evolutionary interdependence of properties and responses. Many of Wiggins' premises seem compatible with ~McDowell's conclusions! Like many authors in this discussion, though, Wiggins speaks of "responses" as if they were the "end of the line" in our subjective experience, rather than gestures towards ongoing interaction that has functions and purposes. Despite these problems, the piece offers insightful philosophical twists.
''Jan Bransen, "On the Incompleteness of Mc Dowell’s Moral Realism"'' (//Topoi//, 2002)
!!Bransen argues that ~McDowell cannot ward off projectivism unless he gves an account of exactly what counts as "appropriate" moral subjects and "favourable" moral circumstances. I'm not convinced. However, Bransen's positive suggestion is still welcome: ~McDowell would benefit from greater attention to situations in which ''moral perceptions and inclinations diverge''. Working through such situations is crucial to the development of moral insight. 
!''Carla Bagnoli, "Moral Constructivism: A Phenomenological Argument"'' (//Topoi//, 2002)
!!Many of the points here are plausible as against a ~McDowell-style realism: "the image of construction suggests that "the situation" is not merely given, standing before the agent, waiting for her to make up her mind or to simply discover the right solution... the image of a contsrained construction highlights the diachronic dimension of our evaluations..." 
!!Yet perhaps Bagnoli is moving towards a more genuinely world-changing kind of ''real construction'' than the entrenched Kantian sort of constructivism, and thus I'm not sure her position ought to count as anti-realist.
!''Alasdair MacIntyre, //Dependent Rational Animals// (1999)''

!... and some [[affordance articles]], [[responsibility articles]], [[moral realism articles]], [[on teaching]], [[on speech agency]].
For someone concerned with moral criticism, an obvious question is: //"''Don't you'' above all ''need to know the truth'' about whether the act in question is right or wrong?//... Don't you, in other words, need to reach justified moral [[verdicts|verdict model]] before you engage in criticism?"
A safe reply would be to suggest that ''even if we do have a clear belief'' about whether an act was right or wrong, it may be ''unwise to communicate'' that belief or even to privately focus on it. Even an excusable act might raise concerns that need to be discussed, and even an act that clearly violates important norms may sometimes be best handled without direct reference to its wrongness. In other words, we might say there's a difference between what's true and what we should actually say. Especially because dialogue might change our minds, we should keep our representations tentative.
On the other hand, I am inclined toward ''a bolder view''. Representation, according to pragmatists, is always situated and directed, and is meaningful only because of its uptake in interpretation and use. So "the truth" about human affairs doesn't stay put. That doesn't mean that any opinion is equally right, but rather that different representations may be appropriate for different communications, without there being a single "lingua franca" which settles which ones we should call true. 
This bolder relpy is motivated by pragmatist philosophy. Of course, pragmatists do not speak with just one voice. While [[C. S. Peirce]]'s approach to representation emphasizes how we work towards convergence in meanings and in habits of interpretative use, [[William James]] tends to emphasize divergence and individuality in the present. 
On my view, the tension between these points is not a simple disagreement; we have much to learn about the ''degree'' to which various concepts -- pragmatically understood -- can yield to ''social convergence'' pressures. There may not be one account of what makes things good to say (and hence true), but we may do fruitful investigation into the details that make some claims serve as broadly exchange-worthy propositions, while others remain only locally useful. 
In other words, all representations are more or less shared [[social affordances]] (see also [[affordance articles]]). So, in the context of moral cricticism, we should expect that only experience can teach how well a moral concept (like [[responsibility]], [[evil]], or admirability) can serve as a stable reference-point in different interactions.
See also [[realism debates]]
|@@font-size:0pt;<<rollover CVimage http://espringer.web.wesleyan.edu/images/CV70.jpg http://espringer.web.wesleyan.edu/images/CV70downloadPDF.jpg http://espringer.web.wesleyan.edu/SpringerCVshort.pdf>>@@|My research in moral philosophy focuses on the  the ''activity of criticism''. A book project entitled //[[Communicating Moral Concern]]// includes [[chapters]] in various stages of development and revision.<br><br>The impetus for this work begins with a question: In cases of [[moral provocation]] -- being troubled by someone's deeds or by conflict -- how does a responsible moral agent proceed? A [[verdict model]] of criticism requires that we ''reach judgment'' on each act under scrutiny: it must be assessed on its merits, by principle or by consequences. Supposing we could confidently reach such justified moral verdicts, is it clear what role these play in responsible moral ''criticism''? It seems the problems of deciding upon an appropriate reaction are as complex as the initial problem, and not much resolved by any intermediate step of judgment. Thus, I seek an [[alternative account]] that integrates ''responsive agency'' with ''skill'', ''attention to uptake'', and ''social situatedness''.<br><br> Additional research interests include [[irony]], [[dialogue]], [[responsibility]], Feminist Theories of Agency, Speech Act Theory, and [[Pragmatist Philosophy]].<br>@@@@|
... [[responsibility]], [[metaphors]], [[evil]], [[representation]], [[critical virtue]], [[Pragmatist Philosophy]], [[feminist moral philosophy]]
'Responsibility' is ripe for pragmatic treatment, as attempts to capture it as a property have led into difficult metaphysical thickets. [[Margaret Urban Walker|http://www.public.asu.edu/~muwalker/]] draws attention to what she calls "practices of responsibility", and this is an improvement over talk of responsibility as a static property. If responsibility is not simply "discovered", assessed, and disclosed via language, but shaped and ''cultivated'', then we need to attend more to the ''conditions'' under which our talk of responsibility fosters and supports its development.
!My emerging view might be called an [[ecological|ecological theory]] or ''dynamic'' view of responsibility, on which an individual's responsibility cannot be understood in isolation from the responsibility of those who either perceive and make claims upon it or who are in turn called upon by it.
!Among [[social affordances]], responsibility has a complex structure: for it implies both that the agent in question is to be apporached as liable, answerable, and accountable for existing problems (a dimension of dissatisfaction and subordination of the agent to various concerns), and that the agent is potentially to-be-trusted and can be expected to recognize and act on behalf of shared goods (a dimension of satisfaction and recognition of agency).
!From this angle, the "[[precarious]]ness" of our concepts of responsibility suggests ''not a metaphysical problem'' about causality or freedom, but a practical attention to the complexity of moral attitudes. What makes attributions of responsibility appropriate is not any property internal to the agent in question, though it is a ''real'' feature of dynamic relations among agents. 
!See also [[responsibility articles]] and [[moral realism articles]]
''Susan Dwyer, "Moral Development and Moral Responsibility"'' (//The Monist//, 2003)
!!Dwyer marshalls developmental psychology research to support the Strawsonian view that morally-structured perception is an inevitable and central emergence within humans' normal development. I was surprised not to see more focus on the social conditions under which such capacities are best cultivated; the predominant image was of the unfolding of innate tendencies (plausibly claimed to be absent in sociopaths).
''John Martin Fischer, "Responsibility, History and Manipulation"'' (//Journal of Ethics//, 2000)
!!This article takes the more analytic approach to [[responsibility]] (discussing it in terms of necessary and sufficient conditions). While its appeal to the history of the agent is refreshing, I think we should resist his suggestion that the crucial factor behind responsibility is a set subjective beliefs about the sources of act in question.
''Barbara Houston, "Taking Responsibility"'' (//Philosophy of Education//, 2002)
!!In this article on responsibility, Houston does what I'd hope to see us all do: she takes responsibility for how philosophical ideas are ''taken up in practice''. The "default" or "modern" conception of responsibility, Houston argues, is incoherent in a way that makes people less likely to take responsibility for addressing diffuse and historical social problems. She urges a clearer sense of the ''autonomy'' involved in taking responsibility. Her clear distinction between forward-looking and backward-looking is exhilirating in a sort of existentialist vein, if not altogether convincing...
''Rebecca Kukla, "The Ontology and Temporality of Conscience"'' (//Continental Phil. Review// 2002)
!!An discussion of whether we can explain the conditions under which "the call of conscience" acquires normative force. Kukla concludes, through a persuasive reading of Heidegger, that normative force must experienced as "always already" a demand, not traceable to any specific originary moment. She also recognizes two aspects to the nature of [[responsibility]].
''Michael Schwalbe, "Toward a Sociology of Moral Problem Solving"'' (//Journal for the Theory of Social Behavior//, 1990)
!!An argument for researching not only about the cognitive capacities that enable moral role-taking, but also about the societal conditions that foster the development and use of these abilities. Suggest's [[G.H. Mead]]'s approach as helpful in thinking about these dimensions.
The shakuhachi, a Japanese meditative flute, is a temperamental but rewarding piece of bamboo. Although there is a concert repetoire joining shakuhachi with other traditional instruments such as koto and shamisen, the shakuhachi has evolved mostly to foster meditation through breathing and listening. 

Quick internal links are the core of this TiddlyWiki interface. Each item ("Tiddler") here opens and closes separately, but the site is ''all one file'', most of which starts out hidden. 
!''Browsing Tips:''
* [[Links Like This|site explanation]] show other items on the page; a [[plain link|http://www.google.com]] points elsewhere on the web. <br>([[Links like this]] are broken -- or I haven't gotten around to filling in their content.)
* The ''search'' bar at top right reaches quickly into all items, open or closed.
* Any link can also be used to ''re-hide'' its target by clicking with cmd (Mac) or Ctrl (Win) key down.
!Please explore, or read more about TiddlyWiki.
J.J. Gibson elaborated the idea of an "affordance" -- a feature of the environment insofar as it directs or affords opportunities for action -- as the building block of all perception for organisms. Although affordances can differ between agents (as what is reachable for you may not be reachable for me), they are not merely subjective: each of us can still err in our perception of affordances, and we can ''correct misrepresentations'' and otherwise ''learn'' in the domain of affordances. In this sense, affordances are objective.
!A Social Affordance is an affordance which is subject to [[representation]] through language and which implicitly appeals to "what can be done" by an unspecified agent (what Mead calls the "Generalized Other"), or by groups of agents. For a river to be "bridgeable" is for it to be subject to a certain kind of coordinated social treatment. The appropriateness of such a claim depends on many contextual variables, is not simply "in the eye of the beholder".
!(See also [[affordance articles]])
!''Rae Langton, "Speech Acts and Unspeakable Acts"'' in //Philosophy and Public Affairs//:
!!an insightful exploration of what it would mean really to take seriously that "speech agency" in Austin's sense (and not just ability to vocalize) is deserving of protection, and can be undermined by others' speech acts, such as those of pornographers. 
Philosophy [[courses]] can provide both students and professors with something that no amount of independent reading can provide -- a chance to find common ground, listen to unexpected interpretations, and revise our thoughts on the basis of dialogue. Inside and outside of class sessions, I take each student's questions and concerns as a starting-point for discussion. Because [[dialogue]] is the basis of all philosophy, I expect students to write and revise frequently. In exchange for this effort, I offer extensive written commentary. 
!I am also interested in the development of [[teaching technology]] tools that help to build skills (see [[Reasoning Well|reasoningwell.tiddlyspot.com]] for a site dedicated to informal reasoning skills) and to create web-enriched dialogical space.
No sharp line divides "technology" from "technique," and teaching has always involved methods and tools -- "technology" -- of some kind. Although liberal arts and non-quantitative social sciences have tended to be rightly skeptical of a rush towards classroom electronics, a generation of software has ''nearly matured'' in facilitating text-oriented studies. This site is an experiment with TiddlyWiki, one promising tool. I have also begun another similar site, [[Reasoning Well|http://reasoningwell.tiddlyspot.com]], strictly focused on concepts needed for skill in informal reasoning.
In Spring 2005, I began seeking a better virtual environment for ''ongoing exchange'' among seminar participants, and settled on ''[[courseforum|http://www.courseforum.com]]'', a free-form alternative to [[Blackboard|http://blackboard.wesleyan.edu/]]. While it is not yet perfect, multiple students remarked to the effect that it offered //"among the most successful uses of online spaces in a class that I've taken."// If you're interested in a guest tour of our online space, please [[email me|mailto:espringer@wesleyan.edu]]. There are also more structured tools that include collaborative wiki rooms, such as the open source [[moodle|http://moodle.org/]] project. 
I also use a ''database'' engine to support ''classroom discussion'' through spontaneous projection and markup of relevant philosophical text -- not just excerpts from famous philosophers, but also snippets of recent ''student writing'' (via FileMakerPro). 
Faculty interested in classroom projection using a Mac might also enjoying using [[PinPoint|http://www.macchampion.com/pinpoint_features.shtml]], a simple bit of shareware that offers a large translucent ''cursor.'' It's ''easy to locate and follow'', but doesn't obstruct any of the content behind it.
For something like improvised "blackboard" notes, I've been learning my way around [[dabbleboard|http://www.dabbleboard.com]], which allows me to type text in free locations, edit text, and draw arrows and simple shapes. Although a projection tool like PowerPoint is popular for classrooms, I enjoy the ability to use class prep time to set up a "playground" of concepts or claims, so that in class we can freely improvise with those text-objects, experimenting with students' ideas about how to organizing and categorizing them. 
... [[moral sociology]], by which I mean something like an analogue of moral psychology -- the kind of social understanding that highlights moral processes at the social level, helping individuals anticipate and participate in them.
!... [[diachronic ethics]], meaning how to engage skillfully in processes that unfold over time. Dynamic action contrasts against the sort of "atomic" or "ballistic" action that seems to be at issue when we focus on "decisions" rather than attentive activity.
!... [[responsibility]], now with special interest in the ''movement'' of [[moral concern]] among agents, an [[ecological|ecological theory]] ''flow'' of sorts.
!... [[moral address]] as the way responsibilities emerge and become salient to agents.
!... [[metaphors]], particularly for the status or function of moral discourse: ''construction'', ''projection'', ''expression'', etc. All of the ones in common use seem to have disadvantages in accounting for the dynamic effects of moral discussion and moral claims. If we opt for a metaphor of ''cultivation'', I think we may have surprisingly welcome resonances, theoretically and practically.
Must a true claim express a proposition with audience-neutral content? For some concepts, there may not be anything like audience-neutral [[representation]] to be had. That is, the very notion of ''meaning'' may represent an ideal that is approached better by some concepts (and in some contexts) than by others. When our claims touch upon the unstable domain of [[social affordances]], for example, the notion that there is one audience-neutral claim, one circulable bit of content one //really means//, may break down.
Especially in connection with [[metaphor|metaphors]], we face a range of possible situations: for some audiences, a metaphor will be [[precarious]]; for others, it is so stable as to have become "dead" or literal. In yet other contexts, a divergence in likely audience uptake invites irony. Yet the hope that we could simply avoid metaphor and irony -- and hence avoid having to attend to audience uptake -- is empty.
• ''On moral priorities'': Each of us is surrounded by demands on our moral attention. There are struggles for basic needs and for respect, both nearby and distant; there is neglect of living potential and constant degradation of the biosphere. On top of these concerns, there are the myriad ways to set out improving one's own character and resources. ''How do we clear a [[middle path]] between passivity and exhaustion?''
!• ''On engaging in moral discussion'': It is easier to know that something's wrong than to understand how to react well. If we venture to criticize others' actions, ''how do we maintain a [[dialogue]] that remains open to learning?''

These questions aren't simply academic, but they are difficult and persistent enough to motivate philosophical reflection.  
It is not common for a verdict-oriented model to be clearly articulated by proponents; it tends to pass as common sense that what a moral critic is doing is expressing moral judgments which aim to be true assessments of the ''moral status'' or properties of an action (or an agent). Such judgment is to be derived from basic moral principles, whether deontological, consequentialist, or virtue-theory-based. 
!Though some verdict theorists advocate "particularist" attention to details about the act in question, they do not allow that the circumstances of a //critic's// utterance is relevant to moral judgment. The [[critical virtue]] approach is thus a more radical challenge to standard accounts of judgment.
This page is designed and maintained (by [[Elise Springer]]) to share work and ideas with [[Wesleyan|http://www.wesleyan.edu]] students, philosophy colleagues, and other web visitors. Though it is not a 'blog, it contains lots of tiny tidbits contributed and modified over time. 
!Please explore the page (using the menu at left and/or [[links like this|site explanation]] in the text) and don't hesitate to [[email|contact me]] with corrections, questions, or comments.
<<tabs txtWelcomeTab
"Research Overview" "My work in philosophy" [[research project]] "Forthcoming Book" "Overview of _Communicating Moral Concern_" [[Communicating Moral Concern]]
Teaching "Courses and Ideas about Teaching" [[teaching ideas]] "More about me" "Background and miscellaneous" [[background]]>>
''William J. ~FitzPatrick, "The Practical Turn in Ethical Theory'': Korsgaard's Constructivism, Realism, and the Nature of Normativity" (//Ethics// 2005)
!~FitzPatrick argues that Korsgaard's arguments against realism and in favor of constructivism fail. He thinks that a realist can appropriate her basic strategy of hooking moral motivation to the experienced problems of agency (the need to act on reasons), while something's counting as the best ''solution'' to such a problem could easily have to do with normative truth as a primary fact instead of with normativity as constructed by agents as sources of value. 
!Fitzpatrick's "matter-of-fact" premises about ''what agents actually do'' accomplish all the time (such as locating sources of value in God, or refusing to be consistent) are vital to his argument, but they miss the genuine constructivist angle on agency. As much as striving for agency implies considering one's reasons in certain ways, the constructivist must say that those who do not approach themselves and their reasons in such ways cannot count as agents. But that way of putting it misleads. More properly: if //I// cannot take you to be acting on reasons and if //I// do not take you to be a source of value, then //I// cannot take you to be an agent. (I take you to be a pawn of the priests, or a wanton, etc.) Not only morality, but ''agency'' itself, as ''a normative concept'', must be contantly constructed on a Kantian account.
!Yet I am also ''unsatisfied with Kantian constructivism''. It seems to me that Korsgaard has not provided a sufficient argument against realism. since the best realism does not involve mysteriously radiant truths, but rather insists that moral concepts are realized in the world around us, and that moral inquiry requires learning about things such as whether (and in what ways) human bodies are the locus of agency. The realist need not deny that reality has the features it does because of our constructive practices, but simply needs to insist that moral constructions never start from scratch, but rather with a moral landscape that instantiates some but not other moral properties. 
!Further, I think Korsgaard might be vacillating between interpretive constructions of reason and causal constructions of reality. After all, on her account, if someone acts on the right sorts of reasons, then (so it seems for Korsgaard) this person ''has achieved'' agency. But to say such a thing is to be a realist, and not (only) a constructivist after all... And that sort of realism, on which ''being an agent'' is not merely a matter of ''being taken as'' an agent by others, is at least half right. Being an agent ''does not reduce'' to being taken as an agent, but it causally requires //having been taken as// an agent in a way that the realism/constructivism debate cannot recognize as long as the debaters oppose those two terms exclusively.
!My suggestion is that moral reality //really is// what it is, and it got that way (and continues to get that way) by being constructed, as much as Middletown's architectural reality has gotten that way by being constructed. Perhaps the metaphor of ''cultivation'' would make this point more clearly, since "constructivism" by now has become so entwined with "construings in the head".