Ниже приведен подход, использующий NumPy's linear indexing
, который работает для кортежей любых длин, предназначенных для генерации многомерных массивов -
# Convert list of indices to a 2D array version
idx = np.array(lst)
# Decide on the shape of output array based on the extents, then initialize
shp = idx.max(0)+1
out = np.zeros(shp,dtype=bool)
# Using np.put insert 1s in out at places specified by linear indices version
np.put(out,np.ravel_multi_index(idx.T,shp),1)
Вход для образца, выход -
In [54]: lst
Out[54]: [(0, 1, 3), (0, 2, 2), (1, 0, 0), (1, 3, 1), (2, 1, 3)]
In [55]: out
Out[55]:
array([[[False, False, False, False],
[False, False, False, True],
[False, False, True, False],
[False, False, False, False]],
[[ True, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, True, False, False]],
[[False, False, False, False],
[False, False, False, True],
[False, False, False, False],
[False, False, False, False]]], dtype=bool)
Вот, другой берет его, и Вы не должны жить без замещающего знака!
<html>
<head>
<style>
div.sidebox {
width: 25%;
}
div.sidebox div.qrytxt {
height: 1em;
line-height: 1em;
overflow: hidden;
}
div.sidebox div.qrytxt span.ellipsis {
float: right;
}
</style>
</head>
<body>
<div class="sidebox">
<div class="qrytxt">
<span class="ellipsis">…</span>
Some long text which will arbitrarily be cut off at whatever word fits best but will have an ellipsis at the end.
</div>
<div class="qrytxt">
<span class="ellipsis">…</span>
Some more long text which will arbitrarily be cut off at whatever word fits best but will have an ellipsis at the end.
</div>
<div class="qrytxt">
<span class="ellipsis">…</span>
Short text. Fail!
</div>
</body>
</html>
Существует один дефект с этим, если текст будет достаточно краток, чтобы быть полностью отображенным, то замещающие знаки будут все еще отображены также.
[РЕДАКТИРОВАНИЕ: 26.06.2009]
В предложении Кодера Питания я пересмотрел это немного. Существует действительно только два изменения, добавление doctype
(см. примечания ниже), и добавление display: inline-block
атрибут на .qrytxt
DIV. Вот то, на что это похоже теперь...
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<style>
div.sidebox
{
width: 25%;
}
div.sidebox div.qrytxt
{
height: 1em;
line-height: 1em;
overflow: hidden;
display: inline-block;
}
div.sidebox div.qrytxt span.ellipsis
{
float: right;
}
</style>
</head>
<body>
<div class="sidebox">
<div class="qrytxt">
<span class="ellipsis">…</span>
Some long text which will arbitrarily be cut off at whatever word fits best but will have an ellipsis at the end.
</div>
<div class="qrytxt">
<span class="ellipsis">…</span>
Some more long text which will arbitrarily be cut off at whatever word fits best but will have an ellipsis at the end.
</div>
<div class="qrytxt">
<span class="ellipsis">…</span>
Short text. FTW
</div>
</div>
</body>
</html>
Примечания:
Просматриваемый в IE 8.0, Opera 9, FF 3
A doctype
требуется, чтобы IE добрался display: inline-block
работать правильно.
Если .qrytxt
Переполнение DIV происходит на длинном слове, там будет широким разрывом между замещающим знаком и последним видимым словом. Вы видите это путем просмотра примера и изменения размеров ширины браузера в маленьких инкрементах. (это, вероятно, существовало в исходном примере также, я просто не мог заметить его затем),
Таким образом, снова, несовершенное решение только для CSS. JavaScript может быть единственной вещью, которая может получить прекрасный эффект.
[РЕДАКТИРОВАНИЕ: 27.06.2009]
Вот другая альтернатива, которая использует браузер определенные расширения.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<style>
div.sidebox
{
width: 26%;
}
div.sidebox div.qrytxt
{
height: 1em;
line-height: 1em;
overflow: hidden;
text-overflow:ellipsis;
-o-text-overflow:ellipsis;
-ms-text-overflow:ellipsis;
-moz-binding:url(ellipsis-xbl.xml#ellipsis);
white-space:nowrap;
}
</style>
</head>
<body>
<div class="sidebox">
<div class="qrytxt">
Some long text which will arbitrarily be cut off at whatever word fits best but will have an ellipsis at the end.
</div>
<div class="qrytxt">
Some more long text which will arbitrarily be cut off at whatever word fits best but will have an ellipsis at the end.
</div>
<div class="qrytxt">
Short text. FTW
</div>
</div>
</body>
</html>
Обратите внимание, что для вышеупомянутого примера для работы необходимо создать XML-файл, на который ссылаются - moz-связывающий правило, ellipsis-xbl.xml. Это, должен содержать следующий xml:
<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns="http://www.mozilla.org/xbl" xmlns:xbl="http://www.mozilla.org/xbl" xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<binding id="ellipsis">
<content>
<xul:window>
<xul:description crop="end" xbl:inherits="value=xbl:text"><children/></xul:description>
</xul:window>
</content>
</binding>
</bindings>
Вы могли также довольно легко использовать немного JavaScript:
document.getElementByID("qrytxt").offsetWidth;
даст Вам ширину элемента в пикселях и даже работает в IE6. При добавлении промежутка, содержащего замещающие знаки в конец каждого запроса, простой логический тест в JavaScript с небольшим количеством управления CSS мог использоваться для скрытий/показывания их по мере необходимости.
CSS имеет путь?
Нет
PHP?
Нет
-
Чтобы сделать это, необходимо было бы получить метрики шрифта для каждого символа и применить их ко всем буквам в строке. В то время как Вы могли сделать это при помощи библиотеки рисунка/рендеринга как ImageMagick на сервере, он не будет действительно работать потому что другой браузер над шрифтами рендеринга другой ОС по-другому.
Даже если бы это работало, то Вы не хотели бы делать это, потому что это также взяло бы навсегда для рендеринга. Ваш сервер смог бы продвинуть 1 страницу в секунду (если это) вместо нескольких тысяч.
Если можно жить без запаздывания..., то можно приятно фальсифицировать его использование div
теги и CSS overflow: hidden
, как это:
.line_of_text {
height:1.3em;
line-height:1.3em;
overflow:hidden;
}
<div class="line_of_text"> Some long text which will arbitrarily be cut off at whatever word fits best</div>
@Robert
что, если Вы помещаете замещающие знаки в отделение с минимумом z-index
так, чтобы, когда это перемещается налево (для более коротких строк) они были покрыты фоновым изображением или чем-то?
это - симпатичный hacky, который я знаю, но эй стоящий права попытки?
отредактируйте Другую идею: определите позицию отделения, содержащего замещающие знаки с JavaScript и если это не продвинуто полностью правильное, скройте его?
PHP следует полностью исключить из рассмотрения из-за того, что даже при наличии функции, предназначенной для измерения fonts, http://www.php.net/imageftbbox , PHP не может узнать, установлен ли у посетителя минимальный размер шрифта, превышающий ваш предполагаемый размер шрифта.