All of the solutions suggested here rely on catcode trickery. LuaTeX provides a sane way to do such input translation. The solution below translates the + at the beginning of line to \firstlevel and ++ at the beginning of line to \secondlevel. So, first lets define the \firstlevel and \secondlevel macros (in ConTeXt)
\define\firstlevel
{\endgraf
\blank
\noindentation
\hangindent=1em
\hangafter\plusone
\dontleavehmode\hbox to 1em {\symbol[1]}}
\define\secondlevel
{\endgraf
\blank[none]
\noindentation
\hangindent=2em
\hangafter\plusone
\null \quad \hbox to 1em {\symbol[2]}}
ConTeXt already have a module m-translate that allows you to translate the input while the file is being read and before the text is passed on to TeX. So, you can do:
\usemodule[translate]
\translateinput[++][\string\secondlevel]
\translateinput[+][\string\firstlevel]
\starttext
+ One
+ Two
+ Three
\enableinputtranslation
+ One, a really long line \input ward
++ Two
+ Three
\stoptext
which gives

The only trouble is that this translates all the + to \firstlevel. The m-translate module does not provide an interface to only match the character at the beginning of the line, but it is a short module, so we can override how the match is done.
In the following code, I have simply copied the m-translate module and changed the translators.translate() function.
\startluacode
local translators = { }
moduledata.translators = translators
local compiled, list = nil, nil
function translators.register(from,to)
local l = lpeg.P(from)/to
if not list then
list = l
else
list = list + l
end
compiled = nil
end
function translators.translate(s)
if list then
if not compiled then
compiled = lpeg.Cs((list)^0*(lpeg.P(1))^0)
end
return compiled:match(s)
else
return s
end
end
local textlineactions = resolvers.openers.helpers.textlineactions
utilities.sequencers.appendaction(textlineactions,"after","moduledata.translators.translate")
function translators.enable()
utilities.sequencers.enableaction(textlineactions,"moduledata.translators.translate")
end
function translators.disable()
utilities.sequencers.disableaction(textlineactions,"moduledata.translators.translate")
end
function translators.reset(s)
translators.enable()
list, compiled = nil, nil
end
translators.disable()
\stopluacode
\unprotect
\unexpanded\def\translateinput
{\dodoubleargument\module_translate_input}
\def\module_translate_input[#1][#2]%
{\ctxlua{moduledata.translators.register(\!!bs#1\!!es,\!!bs#2\!!es)}}
\unexpanded\def\resetinputtranslation
{\ctxlua{moduledata.translators.reset()}}
\unexpanded\def\enableinputtranslation
{\ctxlua{moduledata.translators.enable()}}
\unexpanded\def\disableinputtranslation
{\ctxlua{moduledata.translators.disable()}}
\unexpanded\def\readtranslatedfile#1%
{\enableinputtranslation
\readfile{#1}\donothing\donothing
\disableinputtranslation}
\protect
\define\firstlevel
{\endgraf
\blank
\noindentation
\hangindent=1em
\hangafter\plusone
\dontleavehmode\hbox to 1em {\symbol[1]}}
\define\secondlevel
{\endgraf
\blank[none]
\noindentation
\hangindent=2em
\hangafter\plusone
\null \quad \hbox to 1em {\symbol[2]}}
\translateinput[++][\string\secondlevel]
\translateinput[+][\string\firstlevel]
\starttext
+ One
+ Two
+ Three
\enableinputtranslation
+ One, a really long line \input ward
++ Two and math $a + b$ works
+ Three
\stoptext
which gives (notice that the + in the math mode has not changed).

\def+, not\def{+}. (2) It should better be\DeclareRobustCommand+{\ifmmode\@my@mathplus\else\expandafter\item\fi}; apart from robustness, you can write+[label]as you would with\item[label]. Such shortcuts, however, make the document hard to read and unstructured. – egreg Oct 20 '11 at 20:21pandocto directly convert Markdown to LaTex... – Tobias Kienzler Dec 10 '15 at 07:13